Skip to content

容器是 docker 的其中一个核心概念,简单的来说容器就是一个镜像运行的实例,不同的是镜像只是一个静态的只读的文件,而容器带有运行时需要的可写文件层。

创建容器

使用 docker create 可以新建一个容器,如 docker create -it ubuntu:lastest,新创建的容器是停止的,创建完成后可以使用 docker start 来启动新建的容器。 create 命令和 run 命令支持的选项比较复杂,主要包含以下的几大类:容器运行模式有关,与容器和环境配置有关,与容器资源限制和安全有关。

与容器运行模式相关的选项如下表:

与容器环境和配置相关的选项如下:

与容器资源限制和安全保护相关的选项如下:

docker 常用的操作命令

使用 docker start 命令启动一个已经创建好的容器。

shell
# 使用如下命令启动 docker 容器并输出 af
docker start af

通过 docker ps 命令可以查看一个运行中容器。

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                                                                                                                                        NAMES
98547050a3b9        laradock_jenkins         "/bin/tini -- /usr/l…"   7 weeks ago         Up 46 minutes       0.0.0.0:50000->50000/tcp, 0.0.0.0:8090->8080/tcp                                                                                                             laradock_jenkins_1
aee69141b9de        laradock_kibana          "/usr/local/bin/dumb…"   3 months ago        Up 46 minutes       0.0.0.0:5601->5601/tcp                                                                                                                                       laradock_kibana_1
9fe44a4122f5        laradock_elasticsearch   "/usr/local/bin/dock…"   3 months ago        Up 46 minutes       0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp                                                                                                               laradock_elasticsearch_1
13c80cc469ce        laradock_rabbitmq        "docker-entrypoint.s…"   3 months ago        Up 46 minutes       4369/tcp, 0.0.0.0:5672->5672/tcp, 5671/tcp, 25672/tcp, 0.0.0.0:15671-15672->15671-15672/tcp                                                                  laradock_rabbitmq_1
cbb89cd4ca5d        laradock_nginx           "/bin/bash /opt/star…"   3 months ago        Up 46 minutes       0.0.0.0:80-81->80-81/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:2020->2020/tcp                                                                                       laradock_nginx_1
6cb66b18af83        laradock_php-fpm         "docker-php-entrypoi…"   3 months ago        Up 46 minutes       9000/tcp                                                                                                                                                     laradock_php-fpm_1
34f68ace5c1d        laradock_workspace       "/sbin/my_init"          3 months ago        Up 46 minutes       0.0.0.0:3000-3001->3000-3001/tcp, 0.0.0.0:4200->4200/tcp, 0.0.0.0:8080->8080/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8001->8000/tcp                               laradock_workspace_1
3ec2dcef59f6        consul:latest            "docker-entrypoint.s…"   3 months ago        Up 46 minutes       0.0.0.0:53->53/udp, 0.0.0.0:8300-8302->8300-8302/tcp, 0.0.0.0:8400->8400/tcp, 0.0.0.0:8301-8302->8301-8302/udp, 0.0.0.0:8500->8500/tcp, 8600/tcp, 8600/udp   laradock_consul_1
03e43aaab97c        laradock_mongo           "docker-entrypoint.s…"   6 months ago        Up 46 minutes       0.0.0.0:27017->27017/tcp                                                                                                                                     laradock_mongo_1
cdbb5a335e0e        docker:19.03-dind        "dockerd-entrypoint.…"   7 months ago        Up 46 minutes       2375-2376/tcp                                                                                                                                                laradock_docker-in-docker_1
542f0c10a41c        laradock_redis           "docker-entrypoint.s…"   7 months ago        Up 46 minutes       0.0.0.0:6379->6379/tcp                                                                                                                                       laradock_redis_1

使用 docker run 命令启动并运行一个容器

使用 docker run 命令其效果等同于分别执行 docker create 和 docker start。使用 docker run 启动一个容器,docker 会再后台执行如下标准操作:

  1. 检查本地是否存在指定镜像,不存在就从公有仓库下载。
  2. 利用镜像创建一个容器,并启动该容器。
  3. 分配一个文件系统给容器,并在只读的镜像外层在挂一个可读写层。
  4. 从宿主机配置的网桥中桥接一个虚拟接口到容器。
  5. 从网桥的地址池配置一个 IP 地址给容器。
  6. 执用户指定的程序。
  7. 执行完后容器会被自动的终止。

使用 docker run -it ubuntu:14.04 bash 启动一个 bash 终端以便可以和容器进行交互。使用上述命令当运行的应用退出之后,容器将会被自动的退出,其原因在于运行完成用户的程序后容器自然而然的也就不存在继续运行的必要了。

使用 -d 参数可以保持 docker 容器的守护态运行。

shell
docker run -d ubuntu:14.04

终止容器

使用 docker stop 可以终止一个运行中的容器。

shell
docker stop [-t|--time[=10]] container 可以再10秒后再终止容器,其原理是先向容器发送 SIGNTERM 信号,等待一段时间后再想容器发送 SIGKILL 信号来终止容器
docker kill 则是直接向容器发送 SIGKILL 信号

进入容器

进入容器有三种方法,attach、exec 和 nsenter

使用 attache

attach 是 docker 自带的命令,其格式为:docker attach [--detacg-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] container,此命令是 docker 自带的命令,使用此命令有时候会存在不方便,当多个窗口同时使用此命令连接到同一个容器时,所有的窗口会同步显示,当某个窗口因命令阻塞时,其他窗口也无法执行操作。

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

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

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

使用 exec

exec 命令,此命令是 docker 版本 1.3.0 版本以后提供的一个命令,其参数为 docker exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user=[=[]]] container comand [ARG...]

-i,-interactive=true|false 打开标准输入接收用户输入的耳鸣了,默认为 false。

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

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

-u --user="" 执行命令的用户或者 id。

shell
# 使用-it 参数来保持标准输入打开,并且分配一个伪终端。
docer exec -it 243c32535da7 /bin/bash

有时你可能不知道容器内是否存在 bash 终端,当你不确认时,可以使用如下命令查看容器内支持的终端。

docker run 容器所使用的镜像ID cat /etc/shells

使用 nsenter 工具

netsenter 工具属于 untils-linux 的一个软件包,使用此工具时需要先找到 docekr 容器的 pid 才可使用,pid 获取方式如下。

shell
PID=$(docker inspect --format"{{.State.Pid}}") container
PID=$(docker-pid243c32535da7)
nesenter --target 10982 --mount --uts --ipc --net --pid

删除容器

使用 docker rm 可以删除容器,其使用如下:

shell
docker rm [-f|--force] [-l|--link] [-v|--volnumes] CONTAINER [CONTAINER...]
-f,--force=false #是否强制终止并删除一个容器
-l,--link=false #删除容器的链接,但是保留容器。
-v,--volnums=false #删除容器挂载的数据卷

默认情况下 docker rm 只能删除停止或者退出状态的容器,可以使用-f 参数强制删除正在运行中容器,此时 docker 会先发送 SIGKILL 信号给容器,终止其中的应用,之后强制删除。

导出导出容器

在某些时候从一个系统迁移到另一个系统,可以使用 docker export 导出容器方便迁移,其命令格式为:

shell
docker export [-o|--output[=""]] CONTAINER
docker export -o test_for_run.tar 243c32535da7

使用 docker import 命令可以导如容器,其命令格式为:

shell
docker import [-c|--change[-c|--change]] [-m|-message=[=MESSAGE]] file|URL-[REPOSITORY[:TAG]]
# 使用-c 可以在执行导入的时候触发对容器进行修改的 Dockerfile 指令
docker import test_for_run.tar - test:ubuntu:v0.0.1

使用 docker load 导出镜像文件到本地镜像库与 docker import 导入的区别是使用 load 导入将会丢失历史记录和元信息,使用 import 则不会,同时使用前者导出的镜像文件要远小于后者。