这次我们来深入了解一下镜像和容器的管理,不过作为入门教程,我们只打算谈及一些常用的命令,而不去介绍 Docker 的深入原理,具体内容我们放到另一个系列中去探讨。
Docker 极速入门教程系列 (往期)
镜像管理
镜像是容器的一个只读模板,用于创建容器。当容器运行时,需要指定其镜像,当镜像不存在时,就会从 Docker Registry 自动下载。每次创建新的镜像,都会在原镜像上方增加一层,具体的原理在本教程里面不深入讨论,可以在本文后面的深入阅读中查看相关文章。
每一个镜像对应了一个唯一的 ID,同样的,镜像中的每一层也都具有一个唯一的 ID,因此,当从 Docker Hub 中 pull 镜像时也是分层进行下载的。
在上一篇文章中,我们已经提到了一些基本的镜像管理命令:
- docker search: 搜索Docker Hub镜像
- docker pull: 拉取镜像
- docker images: 查看本地镜像
- docker inspect: 查看镜像详情
- docker rmi: 删除镜像
再来看一些其他的常用命令。
docker commit
和 docker diff
当我们启动运行一个容器以后,自然会对一个容器进行相关操作,例如安装一些软件或依赖等等。这时,运行后的容器相较于镜像本身提供的环境就发生了变化。这时,可以使用 docker commit
来提交容器的修改,保存到镜像中。
警告: 生产环境下, 这种方式产生的 Docker 镜像会变得难以维护,不推荐使用。
在操作完成后,可以使用 docker diff
来查看修改历史,最后,使用 docker commit
保存为一个新的镜像:
其中,-m
指定了此次 commit 的描述信息,-a
指定了镜像的作者,-p
使在 commit 时暂停容器的运行,前一个 changkun
表示容器的名字,第二个 changkun
表示保存后的镜像的名字。
docker save
和 docker load
当我们使用 Dockerfile 构建好一个镜像后,可以将镜像从本地导出,然后在其他机器上导入并运行:
|
|
容器管理
上一篇文章中已经使用过一些基本的容器管理命令了:
- docker run -it: 运行一个带有交互式 shell 的 tty
- docker attach: 再次连接到运行的 bash
- docker ps: 查看容器列表
- docker top: 查看容器中运行进程的信息
- docker inspect: 查看容器的细节信息, 如 IP 地址、端口映射等。
- docker start: 启动一个容器
- docker stop: 停止运行状态的容器
- docker restart: 重启运行状态的容器
其中,docker inspect
命令输出的信息以 JSON 为格式,可以通过 -f
指定输出项目,例如:
docker stats
可以查看运行容器的 CPU、内存及网络使用情况,这位我们监控 Docker 的状态提供了服务,类似于top
,其内容为会实时进行刷新,可以使用Ctrl+C
退出。docker logs
则可以查看容器中输出的信息:
深入 docker run
docker run
是创建容器的核心命令,提供了非常多的参数供我们使用。docker run
在创建容器时,会首先从本地查找需要的镜像,如果本地没有则会从 DockerHub 上下载,当确保本地有需要的镜像时,才会创建容器。创建容器后,会给容器分配其自身的文件系统、虚拟网络(如网桥、接口、IP 地址等等),而容器中的 DNS 会默认加载宿主机的配置(/etc/hosts
和/etc/resolve.conf
)。完成整个创建过程后,就会执行包含在 docker run
命令中的命令,完成执行后,容器就会停止。
注意: 每一次执行
docker run
都会创建一个容器,不同的容器之间是彼此隔离的,也就是说,不同容器相当于不同的主机。当容器停止运行后,可以使用docker start
重新启动这个容器,然后使用docker attach
重新进入这个容器。
docker run
的一些常用参数:
--name
指定一个容器的名字,若不指定名字,Docker 会为容器随机生成一个名字;--hostname
指定容器的主机名;--mac-address
设置网络信息,这个参数用于设置容器的 MAC 地址;--ulimit nproc=
设置资源限制,设置容器中最大的线程数,包括 soft 和 hard 两个限制值,例如--ulimit nproc=1024:2048
。
比如,我们可以通过这样的方式创建一个容器:
|
|
容器创建好后,ulimit
命令不能够查看到容器本身对最大线程的限制情况,但可以通过 docker inspect
来查看具体的信息:
有时候,我们创建一个 Docker 容器会希望让容器在后台运行,而不影响当前的操作,这时候 -d
参数可以让一个容器创建后在后台执行需要执行的命令:
Docker 容器的状态与进程状态类似,一个容器具有运行、停止、挂起三个状态。上一篇文章中,我们已经了解过 docker start/stop/restart/
这三个基本的命令了,它能够处理容器在运行和停止两个状态之间的切换,有时候我们可能不需要容器继续使用 CPU 资源,就可以将一个容器挂起,使用 docker pause/uppause
这一组命令。
而当容器出现不可描述的异常时,以上这些命令可能都无法去改变一个容器的状态,这时候就可以祭出杀技:docker kill
。
容器和镜像一样,同样也具有导入和导出的功能。这时候我们就可以使用 docker export/import
。与镜像不同的地方在于,有时候我们可能会将一个容器直接进行导出,当再次被导入时,这个容器就会成为一个镜像,就如同我们进行了一次 docker commit
: