1.4 Docker容器操作
容器是Docker的另一个核心概念。简单地说,容器是镜像的一个运行实例,是独立运行的一个或一组应用以及它们所需的运行环境,包括文件系统、系统类库、shell环境等。镜像是只读模板,而容器会给这个只读模板添加一个额外的可写层。
下面具体介绍Docker容器的操作。
1.容器的创建与启动
容器的创建就是将镜像加载到容器的过程。Docker的容器十分轻量级,可以随时被创建或者删除。新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。这个进程是该容器的唯一进程,当该进程结束时,容器也会完全停止。停止的容器可以重新启动并保留原来的修改。使用docker create命令可以新建一个容器。
命令格式:
docker create [选项] 镜像运行的程序
常用选项:
-i——让容器的输入保持打开状态;
-t——让Docker分配一个伪终端。
例如,使用docker create命令创建新容器:
[root@localhost ~]# docker create -it nickistre/centos-lamp /bin/bash
28edb150112c3339f207945fd81798123df6f63784ed7f771c66aade8d98890d
使用docker create命令创建新容器后,会返回一个唯一的ID。
使用docker ps命令可以查看所有容器的运行状态,添加-a选项,可以列出系统最近一次启动的容器。
[root@localhost ~]# docker ps -a
CONTAINERID IMAGE COMMAND CREATED STATUS PORTSNAMES
28edb150112cnickistre/centos-lamp "/bin/bash"5minutesago Created suspicious_poincare
docker ps -a命令的输出信息显示了容器的ID号、加载的镜像、运行的程序、创建时间、目前所处的状态、端口映射。其中,状态一栏为空,表示当前的容器处于停止状态。
启动处于停止状态的容器可以使用docker start命令。
命令格式:
docker start 容器的ID/名称
例如,使用docker start命令启动新创建的容器:
[root@localhost ~]# docker start 28edb150112c
28edb150112c
[root@localhost ~]#docker ps -a |grep 28edb150112c
28edb150112c nickistre/centos-lamp "/bin/bash" 15minutesago Up Aboutaminute 22/tcp,80/tcp,443/tcp suspicious_poincare
启动容器后,可以看到容器状态一栏变为UP,表示容器已经处于启动状态。
如果用户想创建并启动容器,可以直接执行docker run命令,等同于先执行docker create命令,再执行docker start命令。
注意
容器是一个与其中运行的shell 命令共存亡的终端,shell命令运行则容器运行,shell命令结束则容器退出。
利用docker run命令创建容器时,Docker在后台的标准运行过程如下。
(1)检查本地是否存在指定的镜像。若镜像不存在,会从公共仓库下载。
(2)利用镜像创建并启动一个容器。
(3)分配一个文件系统给容器,在只读的镜像层外面挂载一个可读写层。
(4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中。
(5)分配一个地址池中的IP地址给容器。
(6)执行用户指定的应用程序,执行完毕后容器被终止运行。
例如,创建容器并启动可执行一条shell命令:
[root@localhost ~]# docker run centos /usr/bin/bash -c ls /
anaconda-post.log
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
这和在本地直接执行命令几乎没有区别。
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fda0d0b29037 centos "/usr/bin/bash-cls" 5minutesago Exited(0)20seconds ago boring_bose
查看容器的运行状态,可以看出,容器在执行“/usr/bin/bash -c ls”命令之后就停止了。
有时候需要在后台持续地运行一个容器,这就需要让Docker容器以守护进程的形式在后台运行。可以在docker run命令之后添加-d选项来实现,但是需要注意容器所运行的程序不能结束。
例如,下面的容器会持续在后台运行:
[root@localhost ~]# docker run -d centos /usr/bin/bash -c "while true;do echo hello;done"
ea73977a968541126588220ced16473672229fc3351a6a21f707632daac58a46
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea73977a9685 centos "/usr/bin/bash -c 'wh" 22 seconds ago Up22seconds mad_lovelace
查看容器的运行状态,可以看出容器始终处于UP的运行状态。
2.容器的运行与终止
如果需要终止容器的运行,可以使用docker stop命令。
命令格式:
docker stop 容器的ID/名称
例如:
[root@localhost ~]# docker stop ea73977a9685
ea73977a9685
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea73977a9685 centos "/usr/bin/bash -c 'wh" 7 minutes ago Exited(137)26secondsago mad_lovelace
查看容器的运行状态,可以看出容器处于Exited的终止状态。
3.容器的进入
当需要进入容器进行相应操作时,可以使用docker exec命令。
命令格式:
docker exec -it 容器ID/名称 /bin/bash
其中:
-i——让容器的输入保持打开状态;
-t——让Docker分配一个伪终端。
例如,进入正在运行着的容器ea73977a9685:
[root@ localhost ~]# docker exec -it ea73977a9685 /bin/bash
[root@ea73977a9685 /]#
用户可以通过所创建的终端来输入命令,如通过exit命令退出容器:
[root@ea73977a9685 /]# ls
anaconda-post.log etc lib64 mnt root srv usr
bin home lost+found opt run sys var
dev lib media proc sbin tmp
[root@ea73977a9685 /]# exit
exit
[root@ localhost ~]#
4.容器的导出与导入
用户可以将任何一个Docker容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态。导出文件可以传输到其他机器,也可以通过相应的导入命令实现容器的迁移。
命令格式:
docker export 容器ID/名称>文件名
例如,导出f41fa9c70057容器到文件centos7tar:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f41fa9c70057 centos "/usr/bin/bash-c'wh" 32secondsago Up 18seconds clever_blackwell
[root@localhost ~]#docker export f41fa9c70057>centos7tar
[root@localhost ~]#ls-lcentos7tar
-rw-r--r--. 1 root root 204250112 Apr 28 12:01 centos7tar
将导出的文件从A机器复制到B机器,之后使用dockerimport命令导入为镜像。
命令格式:
cat 文件名|docker import- 生成的镜像名称:标签
例如,导入文件centos7tar成为本地镜像:
[root@localhost ~]#catcentos7tar|dockerimport-centos7:test
4dee686ec62f75b92c3e213def3799844a59ac9ccb920a3110e29dc7ce9fcb66
[root@localhost ~]#dockerimages|grepcentos7
centos7 test 4dee686ec62f 5minutesago 196.7MB
5.容器的删除
可以使用docker rm命令将一个已经处于终止状态的容器删除。
命令格式:
docker m容器ID/名称
例如,删除ID号为23e9bbbd5df5的容器:
[root(@localhost ~]#docker rm 23e9bbbd5dfs
23e9bbbd5dfs
[root@localhost ~]#docker ps-a lgrep 23e9bbbd5dfs
[root@localhost ~]#
如果是删除一个正在运行的容器,可以添加-f选项来强制删除。建议先将容器停止再删除。
Docker默认的存储目录在/var/lib/docker下,Docker的镜像、容器、日志等内容全部存储在此目录中,可以单独使用大容量的分区来存储这些内容。一般选择建立LVM逻辑卷,从而避免Docker运行过程中储存目录容量不足的问题。