操作 Docker 容器

围绕容器的重要操作,包括创建一个容器、启动容器、终止一个容器、进入容器内执行操作、删除容器和通过导入导出容器来实现容器迁移等。

操作 Docker 容器

容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。

1. 新建容器

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

例子:

$ docker create -it ubuntu:latest
af8f4f922dafee22c8fe6cd2ae11d16e25087d61f1b1fa55b36e94db7ef45178
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af8f4f922daf ubuntu:latest "/bin/bash" 17 seconds ago Created silly_euler

使用docker create 命令新建的容器处于停止状态,可以使用docker start命令来启动它。

Create命令和后续的run命令支持的选项都十分复杂,主要包括如下几大类:与容器运行模式相关、与容器和环境配置相关、与容器资源限制和安全保护相关。 具体详情可以通过命令 docker create --help 获得。

2. 启动容器

docker start [OPTIONS] CONTAINER [CONTAINER...]

3. 新建并启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

当利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:

·检查本地是否存在指定的镜像,不存在就从公有仓库下载;

·利用镜像创建一个容器,并启动该容器;

·分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;

·从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;

·从网桥的地址池配置一个IP地址给容器;

·执行用户指定的应用程序;

·执行完毕后容器被自动终止。

对于所创建的bash容器,当使用exit命令退出之后,容器就自动处于退出(Exited)状态了。这是因为对Docker容器来说,当运行的应用退出后,容器也就没有继续运行的必要了。

某些时候,执行docker run会出错,因为命令无法正常执行容器会直接退出,此时可以查看退出的错误代码。

默认情况下,常见错误代码包括: ·125:Docker daemon执行出错,例如指定了不支持的Docker命令参数; ·126:所指定命令无法执行,例如权限出错; ·127:容器内命令无法找到。

命令执行后出错,会默认返回错误码。

4. 守护态运行

让Docker容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d参数来实现。

$ docker run -d ubuntu  /bin/sh \ 
-c "while true; do echo hello world; sleep 1; done"
ce554267d7a4c34eefc92c5517051dc37b918b588736d0823e4c846596b04d83

终止容器

docker stop [OPTIONS] CONTAINER [CONTAINER...]

首先向容器发送SIGTERM信号,等待一段超时时间(默认为10秒)后,再发送SIGKILL信号来终止容器

注意:docker kill命令会直接发送SIGKILL信号来强行终止容器。 此外,当Docker容器中指定的应用终结时,容器也会自动终止。例如对于上一节中只启动了一个终端的容器,用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。

进入容器

1. attach 命令

docker attach [OPTIONS] CONTAINER

支持三个主要选项:

--detach-keys[=[]] 指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q

--no-stdin=true|false 是否关闭标准输入,默认是保持打开

--sig-proxy=true|false 是否代理收到的系统信号给应用进程,默认为true

但是使用attach命令有时候并不方便。当多个窗口同时用attach命令连到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

2. exec 命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

-i,--interactive=true|false 打开标准输入接受用户输入命令,默认为false

--privileged=true|false 是否给执行命令以高权限,默认为false

-t,--tty=true|false 分配伪终端,默认为false

-u,--user="" 执行命令的用户名或ID

通过指定-it参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式。

删除容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]

主要支持的选项包括:

-f,--force=false 是否强行终止并删除一个运行中的容器

-l,--link=false 删除容器的连接,但保留容器

-v,--volumes=false 删除容器挂载的数据卷

默认情况下,docker rm命令只能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器。

如果要直接删除一个运行中的容器,可以添加-f参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除。

导入和导出容器

1. 导出容器

docker export [OPTIONS] CONTAINER

例子:

$ docker export -o test_for_run.tar ce5
$ ls
test_for_run.tar
$ docker export e81 >test_for_stop.tar
$ ls
test_for_run.tar test_for_stop.tar

2.导入容器

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

用户可以通过-c,–change=[]选项在导入的同时执行对容器进行修改的Dockerfile指令

$ docker import test_for_run.tar - test/ubuntu:v1.0
$ docker images
REPOSITORY        TAG      IMAGE ID       CREATED              VIRTUAL SIZE
test/ubuntu       v1.0     9d37a6082e97   About a minute ago   171.3 MB