如果说镜像是一种静态的文件,那么容器则是一种动态的存在。在docker中,容器是提供服务的主体。管理好容器,是系统管理员最主要的任务之一。本节将详细介绍容器的管理方法。
1.创建容器
容器时docker提供网络服务的主体。为了能够提供mysql,apache 等网络服务,用户必须创建对应的容器。
在docker中用户可以使用两种方式创建容器。首先用户可以通过docker create命令来创建一个容器,创建新容器处于停止状态。其次,可以使用docker run 命令来创建容器,并且会启动这个容器。
docker create 命令基本语法如下
docker create [options] image
其中,用户可以通过options 为容器指定相应的选项,用来设置新的容器。常用的选项有:
--add-host=[] 指定主机到IP地址的映射关系,其格式为host:ip
--dns=[] 为容器指定域名服务器
-h 为容器指定主机名
-i 打开容器的标准输入
--name 指定容器的名称
-u,--user= 创建用户
通常情况下,用户在创建容器时只要指定镜像的名称及其版本即可。其他的都可以采用默认的选项。例如,下面的命令创建一个centos的容器
[root@localhost ~]# docker create ansible/centos7-ansible
360e730be5c01c7d95578836b09d7657713a9c050a9546845aa5d0fddaed5a8a
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
360e730be5c0 ansible/centos7-ansible "/bin/bash" 7 seconds ago Created brave_mcclintock
d435c7f00358 ubuntu "/bin/bash" 7 hours ago Exited (0) 7 hours ago relaxed_carson
当docker create命令成功执行之后,会返回一个字符串,该字符串为新容器的ID。随后的docker ps命令列出了刚才创建的容器及其有关的信息。
在docker create 命令中可以指定标签或者版本号,使用冒号分隔 如下:
[root@localhost ~]# docker create ansible/centos7-ansible:latest
f7571410da1353e10170df27535677ae46530d44a2dd94189e8f5c40062cd61f
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7571410da13 ansible/centos7-ansible:latest "/bin/bash" 3 seconds ago Created sleepy_mahavira
360e730be5c0 ansible/centos7-ansible "/bin/bash" 3 minutes ago Created brave_mcclintock
d435c7f00358 ubuntu "/bin/bash" 7 hours ago Exited (0) 7 hours ago relaxed_carson
latest 标签表示使用最新版本的镜像创建容器。
当在本地电脑不存在用户指定的镜像时,docker 会自动搜索远程仓库。找到之后,会自动将其下载到本地,然后再创建容器。
docker run 命令不仅仅可以创建容器,而且创建之后,会立即启动容器。docker run 命令与docker create 命令的语法大同小异。需要注意:
1. -t参数 :为当前容器分配一个命令行终端,以便于用户与容器交互,以该选项创建的容器可以称为交互式容器。
2. -d参数 : 以该选项创建的容器为后台运行,新的容器保持在后台运行。
例如下面命令创建一个名称为demo_centos 的容器,创建之后立即启动,且进入交互模式
[root@localhost ~]# docker run -i -t --name demo_centos centos /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
[root@cd56f8ec0ca7 /]#
当用户通过以上方式创建容器后,就可以直接在容器中执行所需要的操作了,如果用户想要退出容器,使用exit 命令,即可返回到docker 的管理窗口。
2.查看容器
用户查看系统中容器的运行情况,Docker 提供了docker ps 命令来查看当前系统中的容器。这个命令与Linux 中的ps 或 ls 命令相似 语法如下:
docker ps
例如 下面命令列出当前系统正在运行的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd56f8ec0ca7 centos "/bin/bash" 15 minutes ago Up 15 minutes demo_centos
在上面输出结果中 CONTAINER ID 为容器ID标识 , IMAGE 为创建容器的镜像 , COMMAND 为容器最后执行的命令, CREATED 为创建容器的时间 , STATUS 为容器的当前状态, PORTS 为容器对外开放的端口,NAMES 为容器名称 可以和容器ID一样唯一标识容器,同一台宿主机上不允许存在同名容器,否则会有冲突。
而对于其他状态的容器 , 默认的docker ps 并没有列出来,为了显示这些不在运行中的容器,用户可以使用 -a 参数; 该参数 可以列出当前系统中所有的容器,包括运行中的容器及处于停止状态的容器, 如下:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd56f8ec0ca7 centos "/bin/bash" 23 minutes ago Up 23 minutes demo_centos
f7571410da13 ansible/centos7-ansible:latest "/bin/bash" 34 minutes ago Created sleepy_mahavira
360e730be5c0 ansible/centos7-ansible "/bin/bash" 38 minutes ago Created brave_mcclintock
d435c7f00358 ubuntu "/bin/bash" 8 hours ago Exited (0) 7 hours ago relaxed_carson
在上面输出中,有些容器是 Exited ,表示该容器已经停止运行;有些容器为 Up ,表示该容器在运行中;有些为 Created , 表示该容器创建之后从未启动过。
随着系统运行时间的增加,系统中的容器会越来越多,在这种情况下,查找某个容器会变得非常困难,此时,用户在使用docker ps 命令时,可以通过一些条件进行筛选。例如, 下边命令列出名称中包含 ‘demo’ 字符串的容器:
[root@localhost ~]# docker ps -a -f name=demo
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd56f8ec0ca7 centos "/bin/bash" 30 minutes ago Up 30 minutes demo_centos
其中 -f 参数表示指定筛选条件, 筛选条件采用以下方式
field=value
其中 field 表示name , image , 以及 status等字段。
3. 操作容器
启动已停止运行的容器
[root@localhost ~]# docker start demo_centos
demo_centos
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd56f8ec0ca7 centos "/bin/bash" 4 hours ago Up 4 seconds demo_centos
后台运行
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
[root@localhost ~]# docker run -itd --name ubuntu-test ubuntu /bin/bash
391a675c333a3ec3c6cbaf3f2e3afbc669c90331407da61bb6c4d678c36f3512
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
391a675c333a ubuntu "/bin/bash" 5 seconds ago Up 4 seconds ubuntu-test
cd56f8ec0ca7 centos "/bin/bash" 4 hours ago Up About a minute demo_centos
停止一个容器
[root@localhost ~]# docker stop ubuntu-test
ubuntu-test
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd56f8ec0ca7 centos "/bin/bash" 4 hours ago Up 2 minutes demo_centos
[root@localhost ~]# docker ps -a -f name=ubuntu-test
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
391a675c333a ubuntu "/bin/bash" About a minute ago Exited (0) 21 seconds ago ubuntu-test
停止的容器可以通过 docker restart 重启:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
391a675c333a ubuntu "/bin/bash" 2 minutes ago Up 3 seconds ubuntu-test
cd56f8ec0ca7 centos "/bin/bash" 4 hours ago Up 3 minutes demo_centos
进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
docker attach
docker exec:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止。
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
391a675c333a ubuntu "/bin/bash" 2 minutes ago Up 3 seconds ubuntu-test
cd56f8ec0ca7 centos "/bin/bash" 4 hours ago Up 3 minutes demo_centos
[root@localhost ~]# docker attach ubuntu-test
root@391a675c333a:/# exit
exit
退出后容器就停止了
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd56f8ec0ca7 centos "/bin/bash" 4 hours ago Up 4 minutes demo_centos
exec 命令
下面演示了使用 docker exec 命令。
[root@localhost ~]# docker start ubuntu-test
ubuntu-test
[root@localhost ~]# docker exec -it ubuntu-test /bin/bash
root@391a675c333a:/# exit
exit
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
391a675c333a ubuntu "/bin/bash" 6 minutes ago Up 13 seconds ubuntu-test
cd56f8ec0ca7 centos "/bin/bash" 4 hours ago Up 7 minutes demo_centos
[root@localhost ~]#
导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export 命令。
[root@localhost ~]# docker export ubuntu-test > ubtuntu-test.tar
[root@localhost ~]# ls
ubtuntu-test.tar
[root@localhost ~]#
这样将导出容器快照到本地文件。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件ubtuntu-test.tar 导入到镜像
test/ubuntu:v1
[root@localhost ~]# cat ubtuntu-test.tar |docker import - test/ubuntu:v1
sha256:9384492de4cd106c7632b777cbbc7a04d4f7532f7d5847201a8e7e2826e3a5f8
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1 9384492de4cd 11 seconds ago 72.8MB
删除容器
删除容器使用 docker rm 命令:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
391a675c333a ubuntu "/bin/bash" 14 minutes ago Up 8 minutes ubuntu-test
cd56f8ec0ca7 centos "/bin/bash" 5 hours ago Up 15 minutes demo_centos
[root@localhost ~]# docker stop ubuntu-test
ubuntu-test
[root@localhost ~]# docker rm ubuntu-test
ubuntu-test
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd56f8ec0ca7 centos "/bin/bash" 5 hours ago Up 16 minutes demo_centos
下面的命令可以清理掉所有处于终止状态的容器。(慎用)
$ docker container prune