1.docker理论

1.1docker是什么?

Dcoker是基于容器技术的轻量级虛拟化解决方案,docker是由容器引擎,把linux的cgroup、namespaces等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行Cli、api等) C/S

1.2docker的使用场景

流程:war jar------>Igithub gitlab私有仓库(代码仓库)----> jenkins ( 测试)
(应用程序封装/构建镜像)一》 运维使用镜像下载,使用容器技术进行运行/发布
可以实现:

打包应用程序简单部署
可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从腾讯云迁移到阿里云
持续集成和持续交付(CI/CD):开发到测试发布
部署微服务
提供PAAS产品(平台即服务) {OpenStack的 云主机类似于阿里云的ECS,属于IAAS;Docker (K8S) 属于PAAS

1.3什么是docker?有什么作用?

●Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。
●是一个开源的应用容器引擎,让开发者可以打包方式的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制(隔离机制),相互之间不会有任何接口
●沙箱(Sandbox):在计算机安全领域,沙箱是一种程序的隔离运行机制
●Docker在2013年一炮而红,直到现在,已经成为容器技术的代名词。
●Docker从一开始就以提供标准化的运行时环境为目标,真正做到“build once, run anywhere即构建一次能在所有地方运行”,可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了CaaS(容器即服务)技术。

1.4docker引擎(Docker Engine)

●Docker Engine是具有以下主要组件的客户端-服务器应用程序:
●server端:服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)。
●CLENT端:REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
●命令行界面(CLI)客户端(docker命令)。

1.5docker与虚拟机的区别

不同点containerVM
启动速度秒级分钟级
运行性能接近原生(直接在内核中运行)50%左右损失
磁盘占用MBGB
数量成百上千一般几十台
隔离性进程级别系统级别(更彻底)
操作系统主要支持Linux几乎所有
封装程度只打包项目代码和依赖关系,共享宿主机内核完整的操作系统,与宿主机隔离

2.docker的架构(docker architecture)

Docker使用客户端-服务器架构。Docker 客户端与Docker
守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。

Docker区别于传统的虚拟化,不需要虚拟硬件资源,直接使用容器引擎,所以速度快

Docker Client:客户端/提供一个与用户交互,展示的平台+管理、控制docker服务端(功能)的工具

Docker客户端( docker)是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时docker run,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用Docker APT。 Docker客户端可以与多个守护程序通信。
Docker daemon:守护进程

Docker 守护程序( dockerd))侦听 Docker API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理pocker服务。
Docker images:镜像

存储镜像的地方,默认在公共的Docker Hub上查找,可以做个人仓库(registry harbor)

容器可以被打包成镜像
Docker container:容器
Docker registry:镜像仓库

存储镜像的地方,默认在公共的Docker Hub上查找,可以做个人仓库(registry harbor)

3.docker三大组件

镜像:一组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境),可以理解为容器的模板
容器:基于镜像的一种运行时状态
仓库:存放image镜像﹐仓库大类: 1、公共仓库—》docker hub 2、私有仓库 registry和harbo

4.控制组( Control groups)

Linux上的Docker引擎还依赖于另一种称为控制组
( cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker
Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。例如,您可以限制特定容器可用的内存。

5.基础小结

5.1docker概念

Dcoker 是基于容器技术的轻量级虚拟化解决方案
docker是容器引擎,把linux的cgroup、namespaces等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行cli、 api等)c/s

5.2docker底层原理

cgroup和namespaces两者构成了docker底层原理:
cgroup(资源管理技术)资源控制与namespaces名称空间结合控制管理了6个名称空间资源(以下)
mount 文件系统,挂载点,一个文件系统内,不能重复挂载一个指定目录,例如:/mnt
user  操作进程的用户和用户组
pid   进程编号
uts   主机名和主机域
ipc   信号量、消息队列,共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间)
net   网络设备,网络协议栈,端口等

5.3 docker 有哪些优势?和虚拟化比有什么优势

docker 把容器化技术做成了标准化平台CAAS (docker统一/指定了容器化技术的标准化平台)

使用docker有什么意义(实现了3个统一)
docker引擎统一了基础设施环境-docker环境构建image封装一个简易的操作系统(3.0+G )
docker引擎统一了程序打包(装箱)方式-docker镜像—》images
docker引擎统一了程序部署(运行)方式-docker容器——》基于镜像-》运行为容器(可运行的环境)
实现了一次构建、多次、多处使用

6.部署20版docker

环境配置

systemctl stop firewalld
systemctl disable firewalld
setenforce o

安装依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2   #docker存储驱动,lvm2资源控制的工具

设置阿里云镜像源

cd /etc/ yum.repos.d/
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker-ce社区版

yum install -y docker-ce

启动

systemctl start docker
systemctl enable docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://483txl0m.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

在这里插入图片描述

7.网路优化

vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
systemctl restart network
systemctl restart docker

在这里插入图片描述
docker-server端配置文件

{
"gragh": "/data/ docker"           数据目录
"storage-driver": "overlay2",     存储引擎LXC-》overlay —》overlay2
"insecure-registries": ["registry.access.redhat.com", "quary.io"]  私有仓库
"registry-mirrors": [ "https:/lq" ] 镜像加速
"bip": "172.168.80.50/24",              docker网络
"exec-opts" :[ "native.cgroupdriver=systemd" ],启动时候的额外参数(驱动)
"live-restore": true                当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)
}
{
"gragh": "/data/docker"           
"storage-driver": "overlay2",      
"insecure-registries": ["registry.access.redhat.com","quary.io"]
"registry-mirrors": ["https://lq"]
"bip": "172.168.80.50/24",          
"exec-opts": ["native.cgroupdriver=systemd"],
"live-restore": true                
}

以下是建议的配置项
docker容器网络生产经验
docker的网络建议和宿主机的IP对照
比如宿主机10.2.5.6 容器的地址就可以修改为172.5.6.1,这样方便在故障发生时,更容易定位故障节点位置

systemctl daemon-reload
systemctl restart docker

8.相关命令-查看

8.1查看docker版本

docker -v		
docker version

在这里插入图片描述

8.2用于显示docker的系统级信息,比如内核,镜像数,容器数等

  docker info

在这里插入图片描述
这里引申一些配置文件的内容

vim /etc/docker/daemon.json		##docker配置文件还可以添加以下的建立配置:
	{
	"graph": "/data/docker",					##数据目录
	"storage-driver": "overlay2",				##存储引擎;版本迭代:LXC——>overlay——>overlay2(overlayfs:文件系统,解决docker镜像分层)
	"insecure-registries": [" registry.access.redhat.com", "quary.io"]	##私有仓库位置
	"registry-mirrors": ["https://q***"]		##镜像加速
	"bip": "172.7.5.1/24",		##docker网络;控制网段的位置;需要创建新的网桥,系统默认的docker0是不变的
	"exec-opts": ["native.cgroupdriver-systemd"],		##启动时候的额外参数(驱动)
	"live-restore":true		##当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)
systemctl daemon- reload
systemctl restart docker

9.docker镜像相关操作

9.1运行镜像

docker run hello-world		##运行hello-world镜像
	run代表以下:
		①:pull	dockerhub	仓库中项目/库/镜像
		②:start hello-world image

在这里插入图片描述
命令详解:

1.The Docker client contacted the Docker daemon. dockerclient客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的)restfulapi典型的C/s架构
2.The Docker daemon pulled the “hello-world” image from the Docker Hub.(amd64)
由docker服务端的守护进程从docker hub上下载了镜像(服务端会先检查本地系统是否有此镜像)
3.The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
服务端创建了一个新的容器,然后从拉取的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用
4.The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
docker服务端把这些信息流(传递)返回到客户端并展示出来,( 展示在终端上)
docker client 可以是多种形式,比如"docker"命令工具所在的终端

9.2搜索镜像-search

docker search nginx		##搜索镜像nginx
docker search centos: 7		##搜索镜像centos:7

9.3下载镜像-pull

client端连接服务器,从docker hub上下载镜像

格式:docker pull 镜像名称
docker pull nginx		##下载nginx最新的镜像

9.4查看镜像

docker  images	##查看镜像列表
docker images -q	##查询镜像过滤ID
	q:代表过滤;只过滤容器ID

在这里插入图片描述

9.5查看当前docker下的镜像详细信息

格式:docker inspect 镜像ID	 
docker inspect dd34e67e3371

在这里插入图片描述

9.6 docker tag hello-world:latest hello-world:lamp ##添加镜像标签

在这里插入图片描述

9.7删除镜像

若要删除镜像需要先删除容器

docker rm  **	##删除容器ID
docker rmi  镜像名称/镜像标签  ##删除镜像ID
	rm i:rm image  ##删除镜像
docker rmi hello-world:lamp		##删除hello-world的lamp标签

9.8镜像导出/导入

docker save -o 文件名镜像名
docker load < 
示例:
docker save -o hello-world hello-world

这时候就这样使用

scp hello-world root@192.168.35.10:/opt		##传到其他安卓docker的内容
docker load < hello-world		##再进行镜像导入;

使用场景,有的生产环境,企业不直接使用docker 私有仓库,而是存放在一个ftp服务器中,按需上传下载

10.容器的相关操作

10.1查询容器

docker ps -a		##显示所有的容器,包括未运行的
	a:all;全部
docker ps -aq		##查询容器的id
	q:代表过滤;只过滤容器ID

在这里插入图片描述

10.2删除容器

docker rm -f `docker ps -aq`		##强制批量删除容器;不建议使用,若需要删除删选出id进行删除

在这里插入图片描述

11.启动运行容器

11.1使容器开启并持续性运行

①:创建容器
	docker create -it nginx:latest /bin/bash
		-i:让容器的标准输入保持打开
		-t:分配一个伪终端
		-d:后台守护进程的方式运行
②:启动容器
	docker start 容器id

11.2启动一次性运行容器

持续性运行浪费资源,那么一次性执行如下操作

docker run centos:7 /usr/bin/bash -c ls /
	-c:传递命令参数

在这里插入图片描述

11.3 持续后台运行

docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello; done"	##后台运行centos:7的容器
	while true;do echo hello; done:代表给予一个死循环

12.停止容器

docker stop 容器ID				##停止容器
docker stop b054125b9481		##停止容器
	状态码137:表示主动退出停止容器

13.进入/退出容器

13.1 使用run

docker run -it nginx:latest /bin/bash
容器内没有的命令如何操作:
①:yum下载命令工具
②:以不同的环境运行容器,即环境中存在需要使用的命令即可

比如进入容器没有systemctl
命令解决:添加–privileged=true;指定此容器是否为特权容器,使用此参数,则不能用attach
示例:

docker run -itd --name test3 --privileged=true centos /sbin/init
/sbin/init内核启动时主动呼叫的第一个进程
docker ps -a		##查询容器是否开启
docker exec -it 容器ID /bin/bash		#进入容器
docker exec -it 6be59840d78b /bin/bash
验证:
yum -y install httpd		##随便安装一个服务
systemctl status httpd	##使用systemctl命令查询服务

在这里插入图片描述
docker inspect test3 ##查询test镜像详细信息
在这里插入图片描述

13.2 exec(容器必须为开启状态)

docker exec -it 容器ID /bin/bash
	docker run -it:会创建前台进程,但是会在输入exit后终止进程。
	docker attach:会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止进程.
	docker exec -it 会连接到容器,可以像SSH-样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行。

13.3退出容器

ctrl+d 或者 exit

14.容器导入/导出

14.1容器导出

docker export 容器ID >文件名
示例:
docker export b054125b9481 > hell02		##导出hello-world到文件hello2内

14.2容器导入(生成镜像)2种方式

①:docker import 导出的文件名(容器) 指定镜像名称(打上标签)
示例:
docker import hello2 hello-world:latest
②:cat 文件名(容器) | docker import - hello-world:latest
示例:
cat centos_02 | docker import - centos:7

15.删除/强制删除容器

docker rm 容器ID		##删除容器
docker rm -f 容器ID		##强制删除容器(正在运行的容器)
docker ps -a | awk '{print "docker rm " $1'} | bash		##批量删除容器(正则匹配);$1:是容器的id
for i in `docker ps -a | grep -i exit | awk '{print$1}'`; do docker rm -f $i;done	##批量删除"exit"状态(指定状态)的容器
docker rm -f `docker ps -q`		##强制批量删除非up状态的容器;不建议使用,若需要删除删选出id进行删除

总结

本章讲解了docker的三大组件和工作底层原理,以及docker的部署安装,和镜像、容器的相关命令操作

1、Docker三大组件
镜像:模板;组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境),可以理解为容器的模板
容器(Docker container):基于镜像的一种运行时状态
仓库(Docker reqistry):存放image镜像模板;仓库分类: 1、公共仓库一》docker hub,2、私有仓库registry harbor
2、Docker底层原理
名称空间( Namespaces):提供容器的隔离工作区的技术
容器完美的实现了6个名称空问隔离(namespace资源隔离-用容器化技术封装)
mount:文件系统,挂载点
user:操作进程的用户和用户组
pid:进程编号
uts:主机名和主机域
ipc:信号量、消息队列,共享内存(理解,不同的应用调用的时候应该使用不同的内存空间)
net:网络设备、网络协议栈、端口等
控制组(Control groups):资源管理功能,将应用程序限制为一组特定的资源
控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束
3.docker优化:有效减少镜像大小
4.overlay2由4部分组成 :LowerDir MergedDir UpperDir WorkDir

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐