Docker实战之容器操作:
新建容器:
docker create创建的容器处于停止状态,可以使用docker start命令启动Docker容器。
使用docker run命令,可以创建一个运行中的容器。
create命令与容器运行模式相关的选项:
-a,--attach=[] 是否绑定到标准输出、输入和错误
-a,--detach=true|false 是否在后台运行容器,默认是否
--detach-keys="" 从attach模式退出的快捷键
--entrypoint="" 镜像存在入口指令时,覆盖为新的命令
--pxpose=[] 指定容器会暴露出来的端口或端口范围
--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,--public=[] 指定如何映射到本地主机端口
--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:]CONTAINER_DIR[:OPTIONS]]] 挂载主机上的文件卷到容器
--volume-driver="" 挂载文件卷的驱动类型
--volume-from=[] 从其他容器挂在卷
-w,--workdir="" 容器内的默认工作目录
create命令与容器环境和配置相关的选项:
--add-host=[] 在容器内添加一个主机名到IP地址的映射关系
--device=[] 映射物理机上的设备到容器
--dns-search=[] DNS搜索域
--dns-opt=[] 自定义的DNS选项
--dns=[] 自定义的DNS服务器
-e,--env=[] 指定容器内环境变量
--env-file=[] 从文件中读取环境变量到容器中
-h,--hostname="" 指定容器内的主机名
--ip="" 指定容器的IPV4地址
--ipv6="" 指定容器的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-parnet="" 指定容器CGroups限制的创建路径
--cidfile="" 指定容器的进程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 内存耗尽的时候是否杀死容器
--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
--memory-swappiness="0~100" 调整容器内存交换区参数
-u,--user="" 指定在容器内执行命令的用户信息
--ulimit=[] 通过ulimit来限制最大文件数,最大进程数
其他常用参数:
-l,--label=[] 以键值对的方式指定容器的标签信息
--label-file=[] 从文件中读取标签信息
docker run来启动容器的时候Docker在后台运行的标准操作包括:
1。检查本地是否存在指定的镜像,不存在就从公有仓库下载。
2.利用镜像创建一个容器,并启动该容器。
3.分配一个文件系统给容器,并在只读的镜像层外边挂载一层可读写层。
4.从宿主机配置的网桥接口中桥接一个虚拟接口到容器中。
5.从网桥的地址池配置一个IP地址给容器
6.执行用户指定的应用程序
对于创建的容器,当使用exit命令退出之后,容器就会自动处于退出状态。
默认情况下,常见的错误代码:
125:Docker daemon执行出错,指定了不支持的Docker命令参数
126:所指定命令无法运行,例如权限不足
127:容器内命令无法找到
命令执行出错,会默认返回错误码。
Docker守护态运行:通过-d参数来实现。
终止容器:
docker stop [-t|--time[=10]] [CONTAINER...]
首先向容器发送SIGTERM信号,等待一段时间(默认10秒)后,在发送SIGKILL信号终止容器。
docker kill命令会直接发送SIGKILL信号来强行终止容器。
进入Docker容器:
docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
支持子选项的作用:
--detach-keys[=[]]:退出attach模式的快捷键序列,默认是CTRL+P,CTRL+Q或CTRL+P+Q
--no-stdin=true|false:是否关闭标准输入,默认是保持打开的
--sig-proxy=true|false:是否代理收到的系统信号给应用程序,默认为true
40d5d3816472175538f48f506eb7aa74019ef643c50a1351cc830f96a1a66217
[email protected]:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
40d5d3816472 centos "/bin/bash" 6 seconds ago Up 4 seconds vigilant_noether
[email protected]:~# docker attach vigilant_noether
[[email protected] /]# ls
anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
当多个窗口同时用attach命令连接同一个容器的时候,所有窗口都会同步显示。当某个窗口因为命令阻塞时,其他窗口也是无法执行操作的。
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
nsenter工具:
[email protected]:~# apt-get install util-linux
nsenter --target $PID --mount --uts --ipc --net --pid
删除容器:
docker rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]
-f,--force=false:是否强行终止并删除一个运行中的容器
-l,--link=false:删除容器的连接,但是保留容器
-v,--volumes=false:删除容器挂载的数据卷
当添加-f参数的时候,Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除。
导出容器:
导出容器指的是导出一个已经创建的文件,不管此时这个容器是否处于运行状态,可以使用docker export命令:
docker export [-o|--output[=""]] CONTAINER
-o选项指定tar包的文件名或者使用>重定向。
[email protected]:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
40d5d3816472 centos "/bin/bash" 27 minutes ago Up 4 seconds vigilant_noether
[email protected]:~# docker export >MyCentOS:6.0.tar 40d5d3816472
[email protected]:~# ll
drwxr-xr-x 16 doc doc 4096 11月 29 22:00 ./
drwxr-xr-x 3 root root 4096 11月 27 21:52 ../
-rw-r--r-- 1 root root 204790272 11月 29 22:00 MyCentOS:6.0.tar
导入容器:
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|url - [REGISTRY[:TAG]]
可以通过-c选项在导入的同时对容器执行Dockerfile指令。
实际上,既可以使用docker load命令来导入镜像库存储文件到本地镜像库,也可以使用docker import命令来导入一个容器快照到本地镜像库。
两者的区别在于容器快照将会丢弃所有的历史记录和元数据信息,而镜像存储文件将保存完整记录,体积也会更大。此外从容器快照文件导入时,也可以重新指定标签等元数据。