目录
5. 容器的三种重要技术(namespace/cgroup)
方法一:docker images | awk 'NR>=2{print "docker rmi -f "$3}' | bash
方法二:docker rmi $(docker images -q)
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。 鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
Docker的设计宗旨:Build,Ship and Run Any APP,Anywhere 即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,导出运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
容器化越来越受欢迎,因为容器是:
● 灵活:即使是最复杂的应用也可以集装箱化
● 轻量级:容器利用并共享主机内核
● 可互换:可以即时部署更新和升级
● 便携式:可以再本地构建,部署到云,并在任何地方运行
● 可扩展:可以增加并自动分发容器副本
● 可堆叠:可以垂直和即时堆叠服务
容器是在Linux上本机运行,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。 虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
特性 | Docker容器 | openstack虚拟机 |
---|---|---|
部署难度 | 非常简单 | 组件多,部署复杂 |
启动速度 | 秒级 | 分钟级 |
执行性能 | 和物理系统几乎一致 | vm会占用一些资源 |
镜像体积 | 镜像MB级别 | 虚拟机镜像GB级别 |
管理效率 | 管理简单 | 组件相互依赖,管理复杂 |
可管理性 | 单进程 | 完整的系统管理 |
网络连接 | 比较弱 | 借助neutron可以灵活组件各类网络管理 |
计算能力损耗 | 几乎无 | 损耗50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源隔离/限制 | 完全隔离 |
docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500G并不是实际占用物理磁盘500G)。
namespace | 系统调用参数 | 隔离内容 |
---|---|---|
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWWIPC | 信号量、消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
NETWORK | CLONE_NEWNET | 网络设备、网络栈、端口等 |
MOUNT | CLONE_NEWNS | 挂载点(文件系统) |
USER | CLONE_NEWUSER | 用户和用户组(3.8以后的内核才支持) |
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。 通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量和配置文件。 Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远程一样的环境,这也是Docker镜像的精髓。
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。 可以把容器看做是一个简易版的Linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其他的应用程序。
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。 Docker的镜像、容器、日志等内容全部都默认存储在/var/lib/docker目录下。
- [root@localhost ~]# hostnamectl set-hostname docker
- [root@localhost ~]# su
- [root@docker ~]# systemctl disable --now firewalld
- [root@docker ~]# setenforce 0
- setenforce: SELinux is disabled
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
yum-utils:提供了yum-config-manager工具 device mappper:是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。 device mapper存储驱动程序需要device-mapper-persistent-data和lvm2。
[root@docker ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- [root@docker ~]# yum install -y docker-ce docker-ce-cli containerd.io
- [root@docker ~]# systemctl enable --now docker.service
- Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
安装好的Docker系统有两个程序,Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
格式:docker search 关键字
- [root@docker ~]# docker search nginx
- NAME DESCRIPTION STARS OFFICIAL AUTOMATED
- nginx Official build of Nginx. 15592 [OK]
- jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2071 [OK]
- ······
格式:docker pull 仓库名称[:标签]
如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为latest标签。
[root@docker ~]# docker pull nginx:latest
浏览器访问阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台获取镜像加速器配置
- [root@docker ~]# sudo mkdir -p /etc/docker
- [root@docker ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
- > {
- > "registry-mirrors": ["https://3c7tpzyf.mirror.aliyuncs.com"]
- > }
- > EOF
- {
- "registry-mirrors": ["https://3c7tpzyf.mirror.aliyuncs.com"]
- }
- [root@docker ~]# sudo systemctl daemon-reload
- [root@docker ~]# sudo systemctl restart docker
镜像下载后存放在/var/lib/docker
- [root@docker ~]# cd /var/lib/docker
- [root@docker docker]# ls
[root@docker docker]# cat /var/lib/docker/image/overlay2/repositories.json
[root@docker docker]# docker images
REPOSITORY:镜像属于的仓库
TAG:镜像的标签信息,标记同一个仓库中的不同镜像
IMAGE ID:镜像的唯一ID号,唯一标识一个镜像
CREATED:镜像创建的时间
SIZE:镜像大小
格式:docker inspect 镜像ID号
格式:docker tag 原仓库/源镜像名称[:标签] 新仓库名/新镜像名称[:标签]
格式1:docker rmi 仓库/镜像名称:标签
当一个镜像有多个标签时,只是删除其中指定的标签
格式2:docker rmi 镜像ID号
会彻底删除该镜像
注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
格式:docker save -o 存储文件名 存储的镜像
格式1:docker load < 镜像文件
格式2:docker load -i 镜像文件
默认上传到docker hub官方公共仓库,需要注册使用公共仓库的账户。http://hub.docker.com。
可以使用docker login命令来输入用户名、密码和邮箱来完成注册和登录。
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用docker push命令进行上传。
格式:docker push 仓库用户名/镜像名:标签
容器创建就是将镜像加载到容器的过程。 新创建的容器默认处于停止状态,不允许任何程序,需要在其中发起一个进程来启动容器。
格式:docker create [选项] 镜像
常用选项:
-i:让容器的输入保持打开
-t:让Docker分配一个伪终端
[root@docker docker]# docker create -it ding1201/nginx:test /bin/bash
格式:docker ps -a
[root@docker docker]# docker ps -a
-a选项可以显示所有的容器
CONTAINER ID:容器ID号
IMAGE:加载的镜像
COMMAND:运行的程序
CREATED:创建时间
STATUS:当前状态
PORTS:端口映射
NAMES:名称(未定义将随机创建)
格式:docker start 容器ID/名称
- [root@docker docker]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 5a5c3c2e785f ding1201/nginx:test "/docker-entrypoint.…" 56 seconds ago Created strange_hofstadter
- [root@docker docker]# docker start 5a5c3c2e785f
- 5a5c3c2e785f
- [root@docker docker]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 5a5c3c2e785f ding1201/nginx:test "/docker-entrypoint.…" 7 minutes ago Up 5 seconds 80/tcp strange_hofstadter
可以直接执行docker run命令,等同于先执行docker create命令,再执行docker start命令。
注意:容器是一个与其中运行的shell命令共存亡的终端,命令运行容器运行,命令结束容器退出。
- [root@docker docker]# docker run centos:7 bash -c ls /
- [root@docker docker]# docker ps -a
docker容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker容器中pid=1的进程挂了,那么docker容器便会只会退出,也就是说docker容器中必须有一个前台进程,否则认为容器已经挂掉。 可以对docker容器执行一条死循环命令,防止容易的自动退出。
docker容器生命周期
docker容器 七个状态
created 已创建 还未运行的容器
running 正在运行中的容器
restarting 容器正在重启中
removeing 容器正在迁移中
paused 已暂停状态的容器
exited 停止状态的容器
dead 死亡 主要是操作系统出现异常或断点关机等有可能引发dead状态,但是不是很常见。
- [root@docker docker]# docker run centos:7 bash -c "while true;do echo hello;done"
- ##此时终端将不停显示hello,ctrl+c无法退出,需再另一台终端stop该容器
- [root@docker ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 41d204a8820d centos:7 "bash -c 'while true…" 31 seconds ago Up 30 seconds elastic_brown
- [root@docker ~]# docker stop 41d204a8820d
- 41d204a8820d
- [root@docker ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 41d204a8820d centos:7 "bash -c 'while true…" 5 minutes ago Exited (137) 4 minutes ago elastic_brown
为避免占用终端无法退出的情况可以使用-d选项,docker容器以守护形式在后台运行。 容器所运行的程序不能结束。
[root@docker docker]# docker run -d centos:7 bash -c "while true;do echo hello;done"
[root@docker ~]# docker run -itd --name test centos:7 bash
当利用docker run来创建容器时,Docker在后台的标准运行过程是:
(1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
(2)利用镜像创建并启动一个容器;
(3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
(4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
(5)分配一个地址池中的IP地址给容器;
(6)执行用户指定的应用程序,执行完毕后容器被终止运行。
格式:docker stop 容器的ID/名称
- [root@docker ~]# docker stop test
- test
- [root@docker ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- a7db7eff73bf centos:7 "bash" 4 minutes ago Exited (137) 2 seconds ago test
需要进入容器进行命令操作时,可以使用docker exec命令进行运行着的容器。 格式:docker exec -it 容器ID/名称 /bin/bash
-i:让容器的输入保持打开
-t:让那个Docker分配一个伪终端
- [root@docker ~]# docker start test
- test
- [root@docker ~]# docker exec -it test bash
- [root@a7db7eff73bf /]# ls
- anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
- [root@a7db7eff73bf /]# exit
- exit
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- a7db7eff73bf centos:7 "bash" 8 minutes ago Up About a minute test
也可在run创建容器时,使用-it选项进入容器,但是退出容器时,容器也将停止运行。
- [root@docker ~]# docker run -it --name test1 centos:7 bash
- [root@3d9cd43c52f2 /]# exit
- exit
- [root@docker ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 3d9cd43c52f2 centos:7 "bash" 8 seconds ago Exited (0) 2 seconds ago test1
- a7db7eff73bf centos:7 "bash" 11 minutes ago Up 5 minutes test
docker cp 主机的文件 容器名或者id:/opt
- [root@docker ~]# docker cp test.txt test:/opt
- [root@docker ~]# docker exec -it test bash
- [root@a7db7eff73bf /]# cd /opt
- [root@a7db7eff73bf opt]# ls
- test.txt
- [root@a7db7eff73bf opt]# cat test.txt
- test
- [root@docker ~]# docker cp test:/opt/test.txt 111.txt
- [root@docker ~]# cat 111.txt
- test
用户可以将任何一个Docker容器从一台机器迁移到另一台机器。在迁移过程中,可以使用“docker export”命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
格式:docker export 容器ID/名称 文件名
格式:cat 文件名 | docker import - 镜像名称:标签
格式:docker rm [-f] 容器ID/名称
容器在运行状态下,需要先stop停止容器才可以将其删除,或使用-f选项
- [root@docker opt]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 7a80d181e011 centos:7 "bash" 23 seconds ago Up 23 seconds test2
- d5a47ba9ab3a centos:7 "bash" 27 seconds ago Up 26 seconds test1
- [root@docker opt]# docker rm test1
- Error response from daemon: You cannot remove a running container d5a47ba9ab3adf0e0524820d03d942961a6d38d1b5effa973b7569dd29b04241. Stop the container before attempting removal or force remove
- [root@docker opt]# docker rm test1 -f
- test1
- [root@docker opt]# docker stop test2
- test2
- [root@docker opt]# docker rm test2
- test2
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash
docker ps -a | awk 'NR>=2{print $1}' | xargs docker stop
- [root@docker opt]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 3e97a856029c centos:7 "bash" About a minute ago Exited (137) 2 seconds ago test2
- c2fbd6242fd5 centos:7 "bash" About a minute ago Exited (137) 2 seconds ago test1
- [root@docker opt]# docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
- 3e97a856029c
- c2fbd6242fd5
- [root@docker opt]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
- [root@docker opt]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 3e97a856029c centos:7 "bash" About a minute ago Exited (137) 2 seconds ago test2
- c2fbd6242fd5 centos:7 "bash" About a minute ago Exited (137) 2 seconds ago test1
- [root@docker opt]# docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash
- 3e97a856029c
- c2fbd6242fd5
- [root@docker opt]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm -f
- [root@docker opt]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 79f61b5fd0f1 centos:7 "bash" About a minute ago Up About a minute test2
- c1090fa3dabc centos:7 "bash" About a minute ago Up About a minute test1
- [root@docker opt]# docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm -f
- 79f61b5fd0f1
- c1090fa3dabc
- [root@docker opt]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- [root@docker opt]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- centos7 test e180fc5d26ee 29 minutes ago 204MB
- ding1201/nginx test f8f4ffc8092c 10 days ago 133MB
- nginx latest f8f4ffc8092c 10 days ago 133MB
- centos 7 eeb6ee3f44bd 3 weeks ago 204MB
- [root@docker opt]# docker images | awk 'NR>=2{print "docker rmi "$3}' | bash
- Untagged: centos7:test
- Deleted: sha256:e180fc5d26ee4f4c13fabb682871bec45790711a4b1a9ac33dd88c9674cfcfc2
- Deleted: sha256:00c0399f999b4346d00935727757bd37db1245f98c55633d31982522cb05b7a7
- Error response from daemon: conflict: unable to delete f8f4ffc8092c (must be forced) - image is referenced in multiple repositories
- Error response from daemon: conflict: unable to delete f8f4ffc8092c (must be forced) - image is referenced in multiple repositories
- Untagged: centos:7
- Untagged: centos@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
- Deleted: sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9
- Deleted: sha256:174f5685490326fc0a1c0f5570b8663732189b327007e47ff13d2ca59673db02
- [root@docker opt]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- nginx latest f8f4ffc8092c 10 days ago 133MB
- ding1201/nginx test f8f4ffc8092c 10 days ago 133MB
- ##部分镜像需要使用-f选项进行强删
- [root@docker opt]# docker images | awk 'NR>=2{print "docker rmi -f "$3}' | bash
- Untagged: ding1201/nginx:test
- Untagged: ding1201/nginx@sha256:39065444eb1acb2cfdea6373ca620c921e702b0f447641af5d0e0ea1e48e5e04
- Untagged: nginx:latest
- Deleted: sha256:f8f4ffc8092c956ddd6a3a64814f36882798065799b8aedeebedf2855af3395b
- Deleted: sha256:f208904eecb00a0769d263e81b8234f741519fefa262482d106c321ddc9773df
- Deleted: sha256:ed6dd2b44338215d30a589d7d36cb4ffd05eb28d2e663a23108d03b3ac273d27
- Deleted: sha256:c9958d4f33715556566095ccc716e49175a1fded2fa759dbd747750a89453490
- Deleted: sha256:c47815d475f74f82afb68ef7347b036957e7e1a1b0d71c300bdb4f5975163d6a
- Deleted: sha256:3b06b30cf952c2f24b6eabdff61b633aa03e1367f1ace996260fc3e236991eec
- Deleted: sha256:476baebdfbf7a68c50e979971fcd47d799d1b194bcf1f03c1c979e9262bcd364
- Error: No such image: f8f4ffc8092c
- [root@docker opt]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- [root@docker ~]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- tomcat test 8a7be313dd18 19 minutes ago 960MB
- nginx test a8b4c04322fc 44 minutes ago 545MB
- systemctl test ef46e114991b 2 hours ago 438MB
- sshd test beca19c54c1c 21 hours ago 438MB
- httpd test2 6440a6fa57e0 22 hours ago 623MB
- httpd test1 5ebb94751288 22 hours ago 623MB
- debian test f7fd702b88cc 25 hours ago 215MB
- centos test1 3e6e91b628ef 26 hours ago 204MB
- nginx latest 87a94228f133 2 days ago 133MB
- centos 7 eeb6ee3f44bd 4 weeks ago 204MB
- [root@docker ~]# docker images -q
- 8a7be313dd18
- a8b4c04322fc
- ef46e114991b
- beca19c54c1c
- 6440a6fa57e0
- 5ebb94751288
- f7fd702b88cc
- 3e6e91b628ef
- 87a94228f133
- eeb6ee3f44bd
- [root@docker ~]# docker rmi -f $(docker images -q)
- [root@docker ~]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
docker rm $(docker ps -a -q)
- [root@docker ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 4eb290837722 centos:7 "bash" 13 seconds ago Up 13 seconds test2
- 1be1b151ffa7 centos:7 "bash" 18 seconds ago Up 17 seconds test1
- [root@docker ~]# docker ps -a -q
- 4eb290837722
- 1be1b151ffa7
- [root@docker ~]# docker rm $(docker ps -a -q)
- Error response from daemon: You cannot remove a running container 4eb2908377223d0f0183ddf731e1ecda58b6802b7c86734c35227ad3f84cc42a. Stop the container before attempting removal or force remove
- Error response from daemon: You cannot remove a running container 1be1b151ffa70aeb16a684f32e4caa90988741755d9bcfd69faf6ad02cabb90d. Stop the container before attempting removal or force remove
- [root@docker ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 4eb290837722 centos:7 "bash" About a minute ago Up About a minute test2
- 1be1b151ffa7 centos:7 "bash" About a minute ago Up About a minute test1
- [root@docker ~]# docker rm -f $(docker ps -a -q)
- 4eb290837722
- 1be1b151ffa7
- [root@docker ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker inspect -f '{{.State.Pid}}' 容器ID/名称
- [root@docker ~]# docker run -itd --name test1 centos:7 bash
- b71d24b8f8e72ccfb0973ec23180ca8a8f87ef71cb83f5dcb03125f83c3502ef
- [root@docker ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- b71d24b8f8e7 centos:7 "bash" 1 second ago Up 1 second test1
- [root@docker ~]# docker inspect -f '{{.State.Pid}}' test1
- 4473
- [root@docker ~]# docker inspect -f '{{.State.Pid}}' b71d24b8f8e7
- 4473