容器是 docker 的其中一个核心概念,简单的来说容器就是一个镜像运行的实例,不同的是镜像只是一个静态的只读的文件,而容器带有运行时需要的可写文件层。
创建容器
使用 docker create 可以新建一个容器,如 docker create -it ubuntu:lastest,新创建的容器是停止的,创建完成后可以使用 docker start 来启动新建的容器。 create 命令和 run 命令支持的选项比较复杂,主要包含以下的几大类:容器运行模式有关,与容器和环境配置有关,与容器资源限制和安全有关。
与容器运行模式相关的选项如下表:
与容器环境和配置相关的选项如下:
与容器资源限制和安全保护相关的选项如下:
docker 常用的操作命令
使用 docker start 命令启动一个已经创建好的容器。
# 使用如下命令启动 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 会再后台执行如下标准操作:
- 检查本地是否存在指定镜像,不存在就从公有仓库下载。
- 利用镜像创建一个容器,并启动该容器。
- 分配一个文件系统给容器,并在只读的镜像外层在挂一个可读写层。
- 从宿主机配置的网桥中桥接一个虚拟接口到容器。
- 从网桥的地址池配置一个 IP 地址给容器。
- 执用户指定的程序。
- 执行完后容器会被自动的终止。
使用 docker run -it ubuntu:14.04 bash 启动一个 bash 终端以便可以和容器进行交互。使用上述命令当运行的应用退出之后,容器将会被自动的退出,其原因在于运行完成用户的程序后容器自然而然的也就不存在继续运行的必要了。
使用 -d 参数可以保持 docker 容器的守护态运行。
docker run -d ubuntu:14.04
终止容器
使用 docker stop 可以终止一个运行中的容器。
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。
# 使用-it 参数来保持标准输入打开,并且分配一个伪终端。
docer exec -it 243c32535da7 /bin/bash
有时你可能不知道容器内是否存在 bash 终端,当你不确认时,可以使用如下命令查看容器内支持的终端。
docker run 容器所使用的镜像ID cat /etc/shells
使用 nsenter 工具
netsenter 工具属于 untils-linux 的一个软件包,使用此工具时需要先找到 docekr 容器的 pid 才可使用,pid 获取方式如下。
PID=$(docker inspect --format"{{.State.Pid}}") container
PID=$(docker-pid243c32535da7)
nesenter --target 10982 --mount --uts --ipc --net --pid
删除容器
使用 docker rm 可以删除容器,其使用如下:
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 导出容器方便迁移,其命令格式为:
docker export [-o|--output[=""]] CONTAINER
docker export -o test_for_run.tar 243c32535da7
使用 docker import 命令可以导如容器,其命令格式为:
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 则不会,同时使用前者导出的镜像文件要远小于后者。