第四章 操作Docker容器
Posted lingxiaolong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四章 操作Docker容器相关的知识,希望对你有一定的参考价值。
容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立运行的一个(或一组)应用,以及它们必须的运行环境。
4.1 创建容器
4.1.1 新建容器
可以使用docker create 命令新建一个容器:
[[email protected] ~]# docker run -it ubuntu:latest
Create命令支持的选项主要分为三大类:与容器运行模式相关、与容器和环境配置相关、与容器资源限制和安全保护相关。
表4-1 create命令与容器运行环境模式相关的选项
表4-2 create命令与容器环境和配置相关的选项
表4-3 create命令与容器资源限制和安全保护相关的选项
其他比较重要的选项还包括:
·-l,--label=[]:以键值对方式指定容器的标签信息;
·--label-file=[]:从文件中读取标签信息。
4.1.2 启动容器
使用docker start 命令来启动一个已经创建的容器
[[email protected] ~]# docker run -it ubuntu:latest
[email protected]:/# exit
exit
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ccbcb73a3f8e ubuntu:latest "/bin/bash" 3 seconds ago Exited (0) 1 second ago modest_allen
[[email protected] ~]# docker start cc
cc
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ccbcb73a3f8e ubuntu:latest "/bin/bash" 26 minutes ago Up 4 seconds modest_allen
4.1.3 新建并启动容器
docker run 等同于 docker create + docker start
[[email protected] ~]# docker run ubuntu /bin/echo "Hello World"
Hello World
当利用docker run 来创建并启动容器时,Docker 会在后台运行的标准操作包括:
■ 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
■ 利用镜像创建一个容器,并启动该容器;
■ 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
■ 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
■ 从网桥的地址池配置一个IP地址给容器;
■ 执行用户指定的应用程序;
启动一个bash终端,允许用户进行交互:
[[email protected] ~]# docker run -it ubuntu:latest /bin/bash
-i:让容器的标准输入保持打开
-t::让docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
用户可以按Ctrl+d或输入exit命令来退出容器:
[email protected]:/# exit
[[email protected] ~]#
对于所创建的bash容器,当使用exit命令退出之后,容器就自动处于退出(Exited)状态了。这时因为对于Docker容器来说,当运行的应用退出后,容器也就没有继续运行的必要了。
4.1.4 守护态运行
更多的时候,需要让Docker容器在后天以守护态(daemonized)形式运行。此时,可以通过使用-d参数来实现。
[[email protected] ~]# docker run -d ubuntu:latest /bin/sh -c "while true;do echo hello world;sleep 3;done"
c6c8392f965ec5516de23c344576ad43851322d69c45dc50d436fa1da9cf8001
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6c8392f965e ubuntu:latest "/bin/sh -c ‘while..." 3 seconds ago Up 2 seconds mystifying_hypatia
要获取容器的输出信息,可以使用docker logs命令:
[[email protected] ~]# docker logs c6c8
hello world
hello world
hello world
4.2 终止容器
可以使用docker stop 来终止一个运行的容器。该命令的格式为docker stop [-t] --time[=10] [CONTAINER…]。
首先向容器发送SIGTERM信号,等待一段超时时间(默认为10秒)后,再发送SIGKILL信号来终止容器:
[[email protected] ~]# docker stop c6c8
c6c8
docker kill 命令会直接发送SIGKILL信号来强行终止容器。
docker start 来启动容器
docker restart 将一个运行的容器先终止,然后再重新启动它。
4.3 进入容器
在使用-d参数时,容器启动后进入后台,用户无法看到容器中的信息,也无法进行操作。
这个时候需要进入容器进行操作。attach、exec、以及第三方工具nsenter等。
4.3.1 attach命令
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ccbcb73a3f8e ubuntu:latest "/bin/bash" About an hour ago Up About an hour modest_allen
[[email protected] ~]# docker attach ccbc
退出时Ctrl+p Ctrl+q;
当多个窗口同时用attach命令连到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令堵塞时,其他窗口也无法执行操作了。因此一般不推荐使用。
4.3.2 exec命令
[[email protected] ~]# docker exec -it ccbc /bin/bash
-i,interactive=true|false:打开标准输入接受用户输入命令,默认是false;
-t,--tty=ture|false:分配伪终端,默认是false。
通过指定-it参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作时最为推荐的方式。
4.3.3 nsenter工具
无
4.4 删除容器
可以使用docker rm 命令来删除处于终止和退出状态的容器。
-f,--force=false:是否强制终止并删除一个运行中的容器;
-l,--link=false:删除容器的连接,但保留容器;
-v,--volumes=false:删除容器挂载的数据卷。
[[email protected] ~]# docker rm 26d32
26d32
默认情况下,docker rm 命令只能删除处于终止或退出状态的容器,并不能删除还处在运行状态的容器。
如果要直接删除一个运行中的容器,可以添加-f参数。Docker 会发送SIGKILL信号给容器,终止其中的应用,之后强行删除。
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ccbcb73a3f8e ubuntu:latest "/bin/bash" About an hour ago Up About an hour modest_allen
[[email protected] ~]# docker rm -f ccbcb
ccbcb
4.5 导入和导出容器
某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用docker 的导入和导出功能。
4.5.1 导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令。其中,可以通过-o选项来指定导出的tar文件名,也可以直接通过重定向来实现。
[[email protected] ~]# docker export -o test_for_run.tar c6c8392f965e
或者
[[email protected] ~]# docker export 840842ee3d89 > test_for_stop.tar
之后,可将导出来的tar文件传输到其他机器上,然后再通过导入命令导入到系统中,从而实现容器的迁移。
4.5.2 导入容器
导出的文件可以使用docker import 命令导入变成镜像,
[[email protected] ~]# scp test_for_stop.tar 192.168.161.140:/root/
[email protected]‘s password:
test_for_stop.tar
[[email protected] ~]# scp test_for_run.tar 192.168.161.140:/root/
[email protected]‘s password:
test_for_run.tar
[[email protected] ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg test_for_run.tar test_for_stop.tar
[[email protected] ~]# docker import test_for_run.tar test/ubuntu:v1.0
sha256:69063d822150aad4780ee8065d432a774e81a298a4e4bdcd2b8370260c259b2d
[[email protected] ~]# docker import test_for_stop.tar test/ubuntu:v1.1
sha256:dab1dea762ca46a14d40af7a65795d0e942093a8e17d1281a7c6a55bf94f259e
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1.1 dab1dea762ca 3 seconds ago 69.8 MB
test/ubuntu v1.0 69063d822150 48 seconds ago 69.8 MB
实际上,即可以使用docker load 命令来导入镜像存储文件到本地镜像,也可以使用docker import 命令来导入一个容器快照到本地镜像库。
这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当前的快照状态),而镜像存储文件将保存完整的记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
以上是关于第四章 操作Docker容器的主要内容,如果未能解决你的问题,请参考以下文章