Docker容器技术与高可用实战
上QQ阅读APP看书,第一时间看更新

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运行过程中储存目录容量不足的问题。