1、docker run 简介
docker run
是用来启动容器,如果本地没有要启动的镜像,会自动下载,每次新建一个容器。docker start
只是单纯的启动,而不会新建容器。Docker在隔离的容器中运行进程。容器是运行在主机上的进程。主机可以是本地的,也可以是远程的。当操作员执行docker run
时,运行的容器进程是隔离的,因为它有自己的文件系统,自己的网络,自己的隔离进程树,与主机分离。
2、docker run 语法
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
docker run
命令必须指定一个IMAGE来派生容器。镜像开发人员可以定义与以下相关的镜像默认值:
1)后台或前台运行
2)容器标识
3)网络设置
4)CPU和内存的运行时限制
通过docker运行[OPTIONS],操作员可以添加或覆盖开发人员设置的镜像默认值。此外,操作符可以覆盖Docker运行时本身设置的几乎所有默认值。操作员能够覆盖image和Docker运行时默认值,这也是docker run比其他Docker命令有更多选项的原因。
参考文档:https://docs.docker.com/engine/reference/run/
3、docker run 命令
1)指定端口和镜像后台运行nginx容器
docker run -d -p 80:80 my_image nginx -g 'daemon off;'
2)通过向命令中添加image[:tag]来指定运行容器的镜像版本
docker run ubuntu:14.04
3)通过向命令中添加iImage[@digest]来指定运行容器的镜像
docker run alpine@sha256:9cacb71397b640eca97488cf08582ae4e4068513101088e9f96c9814bfda95e0 date
4)使用--pid=host使容器能够看到宿主机上的进程
echo 'FROM alpine:latest RUN apk add --update htop && rm -rf /var/cache/apk/* CMD ["htop"]' > Dockerfile docker build -t myhtop . docker run -it --rm --pid=host myhtop
5)通过--pid=container:container_name运行另一个容器方式来调试容器
docker run --name my-redis -d redis docker run -it --pid=container:my-redis my_strace_docker_image bash strace -p 1
strace -p pid
:指定pid调试进程,来跟踪进程执行时的系统调用和接收的信号。
6) 通过--network container:container_name来共享另一个容器的网络
docker run -d --name redis example/redis --bind 127.0.0.1 docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1
7)通过--add-host向容器的/etc/hosts文件添加记录
$ docker run -it --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts
172.17.0.22 09d03f76bf2c
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
86.75.30.9 db-static
8)通过--restart指定重启策略
docker run --restart=always redis
docker run --restart=on-failure:10 redis
注意:--restart=on-failure:10
是将重新启动策略设为on-failure
,最大重新启动次数为10。如果redis容器以非零退出状态连续退出超过10次,Docker将中止重新启动容器的尝试。提供最大重启限制仅对故障策略有效。
9)输出容器的退出状态码
$ docker run --foo busybox; echo $?
flag provided but not defined: --foo
See 'docker run --help'.
125
$ docker run busybox /etc; echo $?
$ docker: Error response from daemon: Container command '/etc' could not be invoked.
126
$ docker run busybox foo; echo $?
$ docker: Error response from daemon: Container command 'foo' not found or does not exist.
127
$ docker run busybox /bin/sh -c 'exit 3'
$ echo $?
3
10)限制容器的内存和交换内存
docker run -it -m 300M --memory-swap 1G ubuntu:14.04 /bin/bash
11)限制容器使用cpu
docker run -it --cpuset-cpus="0-2" ubuntu:14.04 /bin/bash docker run -it --cpuset-mems="1,3" ubuntu:14.04 /bin/bash
12)添加要运行的其他组
$ docker run --rm --group-add audio --group-add nogroup --group-add 777 busybox id
uid=0(root) gid=0(root) groups=10(wheel),29(audio),99(nogroup),777
13)使用--entrypoint指定在运行时执行的默认命令
docker run -it --entrypoint /bin/bash example/redis -c ls -l docker run -it --entrypoint /usr/bin/redis-cli example/redis --help
注意:除了--privileged
之外,还可以使用--cap-add
和--cap-drop
对功能进行细粒度控制。默认情况下,Docker有一个保留的默认功能列表。下表列出了默认情况下允许并且可以删除的Linux功能选项。
4、选项说明
选项 | 默认 | 描述 |
--add-host list | 添加自定义主机到IP映射(主机IP) | |
-a, --attach list | 连接到stdin、stdout或stderr | |
--blkio-weight uint16 | 块IO(相对权重),介于10到1000之间, 或0到禁用(默认为0) | |
--blkio-weight-device list | 块IO权重(相对设备权重)(默认值[]) | |
--cap-add list | 添加Linux功能 | |
--cap-drop list | 放弃Linux功能 | |
--cgroup-parent string | 容器的可选父cgroup | |
--cidfile string | 将容器id写入文件 | |
--cpu-period int | 限制CPU CFS(完全公平调度程序)周期 | |
--cpu-quota int | 限制CPU CFS(完全公平调度程序)配额 | |
--cpu-rt-period int | 限制CPU实时周期(微秒) | |
--cpu-rt-runtime int | 限制CPU实时运行时间(微秒) | |
-c, --cpu-shares int | CPU共享(相对权重) | |
--cpus decimal | CPU数量 | |
--cpuset-cpus string | 允许执行的CPU(0-3、0、1) | |
--cpuset-mems string | 允许执行的微机电系统(0-3、0、1) | |
-d, --detach | 在后台运行容器并打印容器ID | |
--detach-keys string | 重写用于分离容器的键序列 | |
--device list | 将主机设备添加到容器 | |
--device-cgroup-rule list | 将规则添加到cgroup allowed devices列表 | |
--device-read-bps list | 限制设备的读取速率(字节/秒)(默认为[]) | |
--device-read-iops list | 限制设备的读取速率(IO/秒)(默认值[]) | |
--device-write-bps list | 限制对设备的写入速率(字节/秒)(默认值[]) | |
--device-write-iops list | 限制设备的写入速率(IO/秒)(默认值[]) | |
--disable-content-trust | true | 跳过图像验证(默认为true) |
--dns list | 设置自定义DNS服务器 | |
--dns-option list | 设置DNS选项 | |
--dns-search list | 设置自定义DNS搜索域 | |
--domainname string | 容器NIS域名 | |
--entrypoint string | 覆盖图像的默认入口点 | |
-e, --env list | 设置环境变量 | |
--env-file list | 读取环境变量文件 | |
--expose list | 公开一个或一系列端口 | |
--gpus gpu-request | 要添加到容器的GPU设备(“all”用于传递所有GPU) | |
--group-add list | 添加要加入的其他组 | |
--health-cmd string | 运行以检查运行状况的命令 | |
--health-interval duration | 运行检查之间的时间(m s s m h) (默认为0s) | |
--health-retries int | 需要连续失败才能报告不正常 | |
--health-start-period duration | 开始运行状况重试倒计时之前 容器初始化的开始时间(m s s m h) (默认为0) | |
--health-timeout duration | 允许一个检查运行的最大时间(ms s m m h) (默认值0) | |
--help | 打印使用 | |
-h, --hostname string | 容器主机名 | |
--init | 在转发信号和获取进程的容器中运行init | |
-i, --interactive | 即使没有连接,也保持stdin打开 | |
--ip string | IPv4地址(例如172.30.100.104) | |
--ip6 string | IPv6地址(例如,2001:db833) | |
--ipc string | 要使用的IPC模式 | |
--isolation string | 集装箱隔离技术 | |
--kernel-memory bytes | 内核内存限制 | |
-l, --label list | 在容器上设置元数据 | |
--label-file list | 读取以行分隔的标签文件 | |
--link list | 将链接添加到另一个容器 | |
--link-local-ip list | 容器IPv4/IPv6链路本地地址 | |
--log-driver string | 容器的日志驱动程序 | |
--log-opt list | 日志驱动程序选项 | |
--mac-address string | 容器MAC地址(例如92:d0:c6:0a:29:33) | |
-m, --memory bytes | 记忆极限 | |
--memory-reservation bytes | 存储器软限制 | |
--memory-swap bytes | 交换限制等于内存加交换'-1'以启用无限制交换 | |
--memory-swappiness int | -1 | 调整容器内存交换(0到100)(默认-1) |
--mount mount | 将文件系统装载附加到容器 | |
--name string | 为容器指定名称 | |
--network network | 将容器连接到网络 | |
--network-alias list | 为容器添加网络范围的别名 | |
--no-healthcheck | 禁用任何容器指定的运行状况检查 | |
--oom-kill-disable | 禁用OOM杀手 | |
--oom-score-adj int | 调整主机的OOM首选项(-1000到1000) | |
--pid string | 要使用的PID命名空间 | |
--pids-limit int | 调整容器PIDS限制(设置-1表示无限制) | |
--privileged | 授予此容器扩展权限 | |
-p, --publish list | 将容器的端口发布到主机 | |
-P, --publish-all | 将所有公开的端口发布到随机端口 | |
--pull | missing | 在运行前拉取镜像(always, missing, never) |
--quiet , -q | 抑制pull输出 | |
--read-only | 将容器的根文件系统装载为只读 | |
--restart string | 重新启动策略以在容器退出时应用(默认为“否”) | |
--rm | 容器退出时自动拆卸 | |
--runtime string | 用于此容器的运行时 | |
--security-opt list | 安全选项 | |
--shm-size bytes | /dev/shm的大小 | |
--sig-proxy | 代理接收到进程的信号(默认为true) | |
--stop-signal string | 停止容器的信号(默认为“sigterm”) | |
--stop-timeout int | 停止容器超时(秒) | |
--storage-opt list | 容器的存储驱动程序选项 | |
--sysctl map | sysctl选项(默认映射[]) | |
--tmpfs list | 装入tmpfs目录 | |
-t, --tty | 分配一个伪tty | |
--ulimit ulimit | ulimit选项(默认值[]) | |
-u, --user string | 用户名或uid(格式[]) | |
--userns string | 要使用的用户命名空间 | |
--uts string | 要使用的uts命名空间 | |
-v, --volume list | 绑定装入卷 | |
--volume-driver string | 容器的可选卷驱动程序 | |
--volumes-from list | 从指定容器装入卷 | |
-w, --workdir string | 容器内的工作目录 |