操作Docker容器
文章目录
1. 创建容器
1.1 新建容器
docker create
create命令与容器运行模式相关的选项:
选项 | 说明 |
---|---|
-a, --attach=[] | 是否绑定到标准输出 |
-d, --detach=true|false | 是否在后台运行容器 |
--detach-keys="" | 从 attach 模式退出的快捷键 |
--entrypoint="" | 镜像存在入口命令时,覆盖新的命令 |
--expose=[] | 指定容器会暴露出来的端口 或 端口范围 |
--group-add=[] | 运行容器的用户组 |
-i, --interactive=true|false | 保持标准输入打开,默认 false |
--ipc="" | 容器IPC命名空间,可以为其他容器或主机 |
--isolation="default" | 容器使用的隔离机制 |
--log-driver="json-file" | 指定容器的日志驱动类型,可以为:json-file ,syslog ,journald ,gelf ,fluentd ,awslogs ,splunk ,etwlogs ,gcplogs 或 none |
--log-opt=[] | 传递给日志驱动的选项 |
--net="bridge" | 指定容器网络模式,包括 bridge 、none 、其他容器内网络、host网络或某个现有的网络 |
--net-alias=[] | 容器在网络中的别名 |
-P, --publish-all=true|false | 通过NAT机制将容器标记暴露的端口自动映射到本地主机的零时端口 |
-p, --publish=[] | 指定如何映射到本地主机端口,例如 -p 11234 -12234 : 1234-2234 |
--pid=host | 容器PID 的命名空间 |
--userns="" | 启用userns-remap 时配置用户命名空间的模式 |
--uts-host | 容器的UTS命名空间 |
--restart-="no" | 容器的重启策略,包括:no , no-failure[:max-retry] , always , unless-stopped 等 |
--rm=true|false | 容器退出后是否自动删除, 不能跟-d 同时使用 |
-t, --tty=true|false | 是否分配一个伪终端,默认为 : false |
--tmpfs=[] | 挂载零时文件系统到容器 |
-v, --volume[=[[HOST-DIR:] CONTAINERE-DIR [:OPTIONS]]] | 挂在主机上的文件卷到容器内 |
--volume-driver="" | 挂载文件卷的驱动类型 |
--volumes-form=[] | 其他容器挂载卷 |
-w, --workdir="" | 容器内的默认工作目录 |
create命令与容器环境和配置相关的选项
选项 | 说明 |
---|---|
--add-host=[] | 在容器内添加一个主机名到IP地址的映射关系 (通过 /etc/hosts 文件) |
--device=[] | 映射物理机上的设备到容器内 |
--dns-search=[] | DNS 搜索域 |
--dns-opt=[] | 自定义DNS |
--dns=[] | 自定义DNS服务器 |
-e, --env=[] | 指定容器内的环境变量 |
-h, hostname=[] | 指定容器内的主机名 |
--ip="" | 指定容器的ipv4 地址 |
--ip6="" | 指定容器的ipv6 地址 |
--link=[<name or id>:alias] | 链接到其他容器 |
--mac-address="" | 指定容器的MAC地址 |
--name="" | 指定容器的别名 |
create命令与容器资源限制和安全保护相关的选项
选项 | 说明 |
---|---|
--blkio-weight=10~1000 | 容器的读写块设备的I/O性能权重,默认为 0 |
--blkio-weight-device=[DEVICE_NAME:WEIGHT] | 指定各个设备的 I/O 性能权重, |
--cpu-shares=0 | 允许容器使用CPU资源的对权重, 默认一个容器能用满一个核的CPU |
--cap-add=[] | 增加容器的 Linux 指定安全能力 |
--cap-drop=[] | 移除容器的 Linux 指定安全能力 |
--cgroup-parent="" | 容器cgroups 限制的创建路径 |
--cid-file="" | 指定容器进程ID号写到文件 |
--cpu-period=0 | 限制容器在CFS调度器下 的CPU 占用时间片 |
--cpuset-cpus="" | 限制容器能用那些CPU核心 |
--cpuset-mems="" | NUMA架构下使用那些核心的内存 |
--cpu-quota=0 | 限制容器在CFS 调度器下的CPU 配额 |
--device-read-bps=[] | 挂在设备的读吞吐率(以 bps 为单位)限制 |
--device-write-bps=[] | 挂在设备的写吞吐率(以 bps 为单位)限制 |
--device-read-iops=[] | 挂在设备的读速率(以每秒 i/o 次数 为单位)限制 |
--device-write-iops=[] | 挂在设备的写速率(以每秒 i/o 次数 为单位)限制 |
--kernel-memory="" | 限制容器使用内核的内存大小,单位可以是 b 、k 、m 或 g |
-m, --memory="" | 限制容器内使用的内存,单位可以是 b 、k 、m 或 g |
--memory-reservation="" | 当系统中内存过低时,容器会被牵制限制内存到给定值,默认情况下等于内存限制值 |
--memory-swap="LIMIT" | 限制容器是用内存和交换区的总大小 |
--oom-kill-disable=true|false | 内存耗尽(Out-Of-Memory)时是否杀死容器 |
--oom-score-adj="" | 调整容器内存耗尽参数 |
--pids-limit="" | 限制容器的pid个数 |
--privileged=true|false | 是否给容器以最高权限,这意味着容器内应用将不受权限下限制,一般不推荐 |
--read-only=true|false | 是否让容器内的文件系统只读 |
--security-opt=[] | 指定一些安全参数,包括权限、安全能力、apparmor 等 |
--stop-signal=SIGTERM | 指定停止容器的系统信号 |
--shm-size="" | /dev/shm 的大小 |
--sig-proxy=true|false | 是否代理收到的信号给应用,默认为true,不能代理SIGCHLD、SIGSTOP 和 SIGKILL 信号 |
memory-swappiness="0~100" | 调整容器内内存交换区参数 |
-u, --user="" | 指定容器在执行命令的用户信息 |
--ulimit=[] | 通过ulimit 来限制最大文件数、 最大进程数等 |
其他比较重要的选项还包括:
l,--label=[]
:以键值对方式指定容器的标签信息;
--label-file=[]
:从文件中读取标签信息。
1.2 启动容器
docker start
例如 : docker start af
af 为容器 id 的缩写, 即可定位容器
1.3 新建并启动容器
docker run
例如:
docker run ubuntu /bin/echo 'Hello world'
docker run -it ubuntu:14.04 /bin/bash
-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i
则让容器的标准输入保持打开。更多的命令选项可以通过man docker-run
命令来查看
1.4 守护态运行
可以通过添加-d
参数来实现
例如下面的命令会在后台运行容器:
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
ce554267d7a4c34eefc92c5517051dc37b918b588736d0823e4c846596b04d83
要获取容器的输出信息,可以如下使用docker logs
命令
$ docker logs ce5
hello world
hello world
hello world
2. 终止容器
docker stop[-t|--time[=10]][CONTAINER...]
例如: docker stop ce5
3. 进入容器
3.1 attach命令
docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
子命令说明:
--detach-keys[=[]]
:指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q;
--no-stdin=true|false
:是否关闭标准输入,默认是保持打开;
--sig-proxy=true|false
:是否代理收到的系统信号给应用进程,默认为true。
例如:
$ docker run -itd ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds
nostalgic_hypatia
$ docker attach nostalgic_hypatia
root@243c32535da7:/#
3.2 exec命令
docker exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]
比较重要的参数有:
-i,--interactive=true|false
:打开标准输入接受用户输入命令,默认为false;
--privileged=true|false
:是否给执行命令以高权限,默认为false;
-t,--tty=true|false
:分配伪终端,默认为false;
-u,--user=""
:执行命令的用户名或ID。
例如 : docker exec -it 243c32535da7 /bin/bash
通过指定-it
参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式
4. 删除容器
docker rm[-f|--force][-l|--link][-v|--volumes]CONTAINER[CONTAINER...]
主要支持的选项包括:
-f,--force=false
:是否强行终止并删除一个运行中的容器;
-l,--link=false
:删除容器的连接,但保留容器;
-v,--volumes=false
:删除容器挂载的数据卷。
默认情况下,docker rm
命令只能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器,如果要直接删除一个运行中的容器,可以添加-f
参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除,如下所示:
root@ubuntu:~# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
43c1b1b60ca5de4e0d01cd655179b1c95703bd01083adaa9ff0a1edb2232b0bc
root@ubuntu:~# docker rm 43
Error response from daemon:
You cannot remove a running container 43c1b1b60ca5de4e0d01cd655179b1c95703bd01083adaa9ff0a1edb2232b0bc.
Stop the container before attempting removal or force remove
root@ubuntu:~# docker rm -f 43
43
root@ubuntu:~#
5. 导入和导出容器
5.1 导出容器
docker export[-o|--output[=""]]CONTAINER
。
例如:
docker export -o test_for_run.tar ce5
docker export e81 > test_for_stop.tar
5.2 导入容器
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY [:TAG]]
例如:
docker import test_for_run.tar - test/ubuntu:v1.0
实际上,既可以使用docker load
命令来导入镜像存储文件到本地镜像库,也可以使用docker import
命令来导入一个容器快照到本地镜像库, 这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息