守护态运行
更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加 -d 参数来实现。
例如下面的命令会在后台运行容器。
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
容器启动后会返回一个唯一的 id,也可以通过 docker ps 命令来查看容器信息。
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
要获取容器的输出信息,可以通过 docker logs 命令。
$ sudo docker logs insane_babbage hello world hello world hello world . .
进入容器
在使用 -d 参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用
docker attach 命令或 nsenter 工具等。
docker attach 是Docker自带的命令。下面示例如何使用该命令。
$ sudo docker run -idt ubuntu 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS 243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds $sudo docker attach nostalgic_hypatia root@243c32535da7:/#
但是使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
nsenter 工具在 util-linux 包2.23版本后包含。 如果系统中 util-linux 包没有该命令,可以按照下面的方法从源码安装。
$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar $ ./configure --without-ncurses $ make nsenter && sudo cp nsenter /usr/local/bin
nsenter 可以访问另一个进程的名字空间。nsenter 要正常工作需要有 root 权限。 很不幸,Ubuntu 14.04仍然使用的是 util-linux 2.20。安装最新版本的 util-linux(2.24)版,请按照以下步骤:
$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-$ cd util-linux-2.24 $ ./configure --without-ncurses && make nsenter $ sudo cp nsenter /usr/local/bin
为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。
PID=$(docker inspect --format "{{ .State.Pid }}" <container>) 通过这个 PID,就可以连接到这个容器: $ nsenter --target $PID --mount --uts --ipc --net --pid
下面给出一个完整的例子。
$ sudo docker run -idt ubuntu 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS 243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds $ PID=$(docker-pid 243c32535da7) 10981 $ sudo nsenter --target 10981 --mount --uts --ipc --net --pid root@243c32535da7:/#
更简单的,建议大家下载 .bashrc_docker,并将内容放到 .bashrc 中。
$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker; $ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
这个文件中定义了很多方便使用 Docker的命令,例如 docker-pid 可以获取某个容器的 PID;而docker-enter 可以进入容器或直接在容器内执行命令。
$ echo $(docker-pid <container>) $ docker-enter <container> ls
导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export 命令。
$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS 7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago $ sudo docker export 7691a814370e > ubuntu.tar
这样将导出容器快照到本地文件。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,例如
$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0 $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
此外,也可以通过指定 URL 或者某个目录来导入,例如
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
*注:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
删除容器
可以使用 docker rm 来删除一个处于终止状态的容器。 例如
$sudo docker rm trusting_newton trusting_newton
如果要删除一个运行中的容器,可以添加 -f 参数。Docker会发送 SIGKILL 信号给容器。
Docker入门教程 | ||
Docker简介 | Docker基本概念 | Docker安装 |
什么是Docker | i.镜像 | 使用Debian操作系统安装Docker |
为什么要用Docker | ii.容器 | 使用CentOS操作系统安装Docker |
iii.仓库 | 使用Ubuntu操作系统安装Docker | |
Docker images镜像详细介绍 | Docker容器 | Docker仓库 |
获取Docker images | Docker容器启动 | Docker Hub |
查找Docker images | Docker容器新建 | 私有仓库 |
下载Docker images | Docker容器终止 | Docker配置文件 |
创建我们自己的Docker images | Docker容器进入容器 | |
Docker容器导出和导入 | ||
Docker容器删除 | ||
Docker数据管理 | Docker网络 | Docker高级网络配置 |
数据卷容器 | 外部访问容器 | 快速配置指南 |
数据卷备份、恢复、迁移 | 容器互联 | 配置 DNS |
容器访问控制 | ||
端口映射实现 | ||
配置 docker0 网桥 | ||
自定义网桥 | ||
实例:创建一个点到点连接 | ||
Docker安全 | Dockerfile | Docker底层实现 |
i. 内核名字空间 | i. 基本结构 | i. 基本架构 |
ii. 控制组 | ii. 指令 | ii. 名字空间 |
iii. 服务端防护 | iii. 创建镜像 | iii. 控制组 |
iv. 内核能力机制 | iv. 联合文件系统 | |
v. 其它安全特性 | v. 容器格式 | |
vi. 总结 | 网络 | |
Docker实战案例 | ||
使用 Supervisor 来管理进程 | ||
创建 tomcat/weblogic 集群 | ||
多台物理主机之间的容器互联 | ||
标准化开发测试和生产环境 |
评论前必须登录!
注册