这次来说下
容器-container
,具体概念在前篇已经讲过,可以移步“
【docker系列】之概念篇”。下边说下怎样使用容器。
查看容器
[root@coder ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
431a2a5a8cdc nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp pedantic_banzai
上述命令是只查看正在运行中的容器,如果像查看所有的容器(包含已停止的),则使用 -a
参数。
[root@coder ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cff0cada4389 nginx "/docker-entrypoint.…" 3 minutes ago Exited (0) 2 minutes ago quizzical_margulis
431a2a5a8cdc nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp pedantic_banzai
b1c05ea925f7 nginx "/docker-entrypoint.…" 19 minutes ago Exited (0) 19 minutes ago nervous_poitras
a6a7a1f6e6ec centos "/bin/bash" 20 minutes ago Exited (127) 10 minutes ago zen_babbage
8337e6d283a7 nginx "/docker-entrypoint.…" 37 minutes ago Exited (0) About a minute ago nginx
新建并启动
[root@coder ~]# docker run -it centos /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
[root@a6a7a1f6e6ec /]#
docker run
命令在镜像篇已经初步讲过,在这里详细讲下此命令所经过的详细步骤:
-
检查本地是否存在指定的镜像,不存在就从公有仓库下载
-
利用镜像创建并启动一个容器
-
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
-
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
-
从地址池配置一个 ip 地址给容器
-
执行用户指定的应用程序
-
执行完毕后容器被终止
上述命令的其他参数:
-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上。-i
则让容器的标准输入保持打开。/bin/bash
表示启动容器后启动bash。可以看到最后执行后显示的是[root@a6a7a1f6e6ec /]#
,和命令键入时的[root@coder ~]
不同,表示已经进入到容器的bash,其中“root@”后的“a6a7a1f6e6ec”是容器的短ID。[root@coder ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b1c05ea925f7 nginx "/docker-entrypoint.…" 9 minutes ago Exited (0) 8 minutes ago nervous_poitras a6a7a1f6e6ec centos "/bin/bash" 9 minutes ago Exited (127) 19 seconds ago zen_babbage
启动已有容器
此处的“已有容器“指的是已经处于stopped状态的容器。
[root@coder ~]# docker start nginx
nginx
后台运行
docker run
后需要追加参数-d
。如果不使用此参数,则控制台会打印执行过程,而使用此参数,则只返回一个容器ID。
[root@coder ~]# docker run -d nginx
431a2a5a8cdcb56ec4b1a1d1874367a7afff45099f40a5de17bc422bd51c33fe
[root@coder ~]# docker run nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
终止容器
[root@coder ~]# docker stop 8337e6d283a7
8337e6d283a7
其中stop后的参数可以是容器短ID,或者完整ID,或者容器名称。
删除容器
[root@coder ~]# docker rm cff0cada4389
cff0cada4389
此命令跟删除镜像差不多,只是rm少了个i,同样的,需要先停止容器才能删除。
如果需要批量删除:
[root@coder ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
b1c05ea925f7b00b43ca0d00fd058627a4826f8e30de10345ba7f05b860ba6be
a6a7a1f6e6ecc1b4777d6d0494f054669112030409fb54eafec602f33588edff
8337e6d283a77c26749fdf69b23db126845fd5e0b24629c9279cd00fcc67dc65
Total reclaimed space: 1.199kB
进入容器
attach命令
docker attach
后边跟容器ID,可以进入容器操作。但是此命令进入容器后,如果要跳出此容器,则会使此容器终止。
exec命令
docker exec
通常会跟随两个参数,-i
和-t
,使用此命令进入容器后,跳出容器可使用exit命令或者ctrl+c
,跳出容器后,容器不会终止运行。
导出容器
如果想导出本地的某个容器,可以使用 docker export
命令。这样可以导出容器快照到本地文件。
[root@iz8vbbc49rkvxedwimwbxcz ~]# docker export d9a9a75a5819 > cloud-good.tar
[root@iz8vbbc49rkvxedwimwbxcz ~]# ls
cloud-good.tar
导入容器快照
可以使用docker import
将容器快照文件中再导入为镜像。
[root@iz8vbbc49rkvxedwimwbxcz ~]# cat cloud-good.tar | docker import - test/cloud-good:v1.0
sha256:257cdaa616428864c5f1a21eb11d627f5fe2583b769c196a238a4649b5fb8958
[root@iz8vbbc49rkvxedwimwbxcz ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/cloud-good v1.0 257cdaa61642 12 seconds ago 684MB
注意:用户既可以使用 docker load
来导入镜像存储文件到本地镜像库,也可以使用 docker import
来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。