Docker run 参数使用记录

2018/03/06 Docker

docker run 应该说是使用最多的一个命令了,通过在命令行输入docker run --help 可以获取到此参数支持的众多选项,如下:

root@gengqijun-test-bjqw:~ # docker run --help

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

Options:
      --add-host list                  Add a custom host-to-IP mapping (host:ip)
  -a, --attach list                    Attach to STDIN, STDOUT or STDERR
      --blkio-weight uint16            Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
      --blkio-weight-device list       Block IO weight (relative device weight) (default [])
      --cap-add list                   Add Linux capabilities
      --cap-drop list                  Drop Linux capabilities
      --cgroup-parent string           Optional parent cgroup for the container
      --cidfile string                 Write the container ID to the file
      --cpu-period int                 Limit CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int                  Limit CPU CFS (Completely Fair Scheduler) quota
      --cpu-rt-period int              Limit CPU real-time period in microseconds
      --cpu-rt-runtime int             Limit CPU real-time runtime in microseconds
  -c, --cpu-shares int                 CPU shares (relative weight)
      --cpus decimal                   Number of CPUs
      --cpuset-cpus string             CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string             MEMs in which to allow execution (0-3, 0,1)
  -d, --detach                         Run container in background and print container ID
      --detach-keys string             Override the key sequence for detaching a container
      --device list                    Add a host device to the container
      --device-cgroup-rule list        Add a rule to the cgroup allowed devices list
      --device-read-bps list           Limit read rate (bytes per second) from a device (default [])
      --device-read-iops list          Limit read rate (IO per second) from a device (default [])
      --device-write-bps list          Limit write rate (bytes per second) to a device (default [])
      --device-write-iops list         Limit write rate (IO per second) to a device (default [])
      --disable-content-trust          Skip image verification (default true)
      --dns list                       Set custom DNS servers
      --dns-option list                Set DNS options
      --dns-search list                Set custom DNS search domains
      --entrypoint string              Overwrite the default ENTRYPOINT of the image
  -e, --env list                       Set environment variables
      --env-file list                  Read in a file of environment variables
      --expose list                    Expose a port or a range of ports
      --group-add list                 Add additional groups to join
      --health-cmd string              Command to run to check health
      --health-interval duration       Time between running the check (ms|s|m|h) (default 0s)
      --health-retries int             Consecutive failures needed to report unhealthy
      --health-start-period duration   Start period for the container to initialize before starting health-retries
                                       countdown (ms|s|m|h) (default 0s)
      --health-timeout duration        Maximum time to allow one check to run (ms|s|m|h) (default 0s)
      --help                           Print usage
  -h, --hostname string                Container host name
      --init                           Run an init inside the container that forwards signals and reaps processes
  -i, --interactive                    Keep STDIN open even if not attached
      --ip string                      IPv4 address (e.g., 172.30.100.104)
      --ip6 string                     IPv6 address (e.g., 2001:db8::33)
      --ipc string                     IPC mode to use
      --isolation string               Container isolation technology
      --kernel-memory bytes            Kernel memory limit
  -l, --label list                     Set meta data on a container
      --label-file list                Read in a line delimited file of labels
      --link list                      Add link to another container
      --link-local-ip list             Container IPv4/IPv6 link-local addresses
      --log-driver string              Logging driver for the container
      --log-opt list                   Log driver options
      --mac-address string             Container MAC address (e.g., 92:d0:c6:0a:29:33)
  -m, --memory bytes                   Memory limit
      --memory-reservation bytes       Memory soft limit
      --memory-swap bytes              Swap limit equal to memory plus swap: '-1' to enable unlimited swap
      --memory-swappiness int          Tune container memory swappiness (0 to 100) (default -1)
      --mount mount                    Attach a filesystem mount to the container
      --name string                    Assign a name to the container
      --network string                 Connect a container to a network (default "default")
      --network-alias list             Add network-scoped alias for the container
      --no-healthcheck                 Disable any container-specified HEALTHCHECK
      --oom-kill-disable               Disable OOM Killer
      --oom-score-adj int              Tune host's OOM preferences (-1000 to 1000)
      --pid string                     PID namespace to use
      --pids-limit int                 Tune container pids limit (set -1 for unlimited)
      --privileged                     Give extended privileges to this container
  -p, --publish list                   Publish a container's port(s) to the host
  -P, --publish-all                    Publish all exposed ports to random ports
      --read-only                      Mount the container's root filesystem as read only
      --restart string                 Restart policy to apply when a container exits (default "no")
      --rm                             Automatically remove the container when it exits
      --runtime string                 Runtime to use for this container
      --security-opt list              Security Options
      --shm-size bytes                 Size of /dev/shm
      --sig-proxy                      Proxy received signals to the process (default true)
      --stop-signal string             Signal to stop a container (default "SIGTERM")
      --stop-timeout int               Timeout (in seconds) to stop a container
      --storage-opt list               Storage driver options for the container
      --sysctl map                     Sysctl options (default map[])
      --tmpfs list                     Mount a tmpfs directory
  -t, --tty                            Allocate a pseudo-TTY
      --ulimit ulimit                  Ulimit options (default [])
  -u, --user string                    Username or UID (format: <name|uid>[:<group|gid>])
      --userns string                  User namespace to use
      --uts string                     UTS namespace to use
  -v, --volume list                    Bind mount a volume
      --volume-driver string           Optional volume driver for the container
      --volumes-from list              Mount volumes from the specified container(s)
  -w, --workdir string                 Working directory inside the container

1. 后台运行 Detached

使用 -d 选项可以让容器创建以后直接运行在后台。需要注意的是如果使用了-d 选项使容器进入后台模式运行,那么将无法配合--rm 参数。

  • 示例
root@gengqijun-test-bjqw:~ # docker run -d --name web_server nginx
20aa8e9c8300359f667dbc93074bce0d8adfeac82a444d5b5ee199b4bb7bd5b9
root@gengqijun-test-bjqw:~ # docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
20aa8e9c8300        nginx               "nginx -g 'daemon of…"   6 seconds ago       Up 6 seconds        80/tcp              web_server

运行在后台的容器可以通过执行docker attach 或者 docker exec 来进入容器里面。

2. 终端交互式运行

使用-it 两个选项可以让我们像平时使用 Linux 服务器一样直接在终端窗口进行交互式的操作。

  • 参数说明
-i, --interactive    Keep STDIN open even if not attached 
# 保持标准输入,常同-t一起使用来申请一个控制台进行数据交互;

-t, --tty            Allocate a pseudo-TTY 
# 分配一个模拟终端,常和 -i 一块使用;
  • 示例

运行一个 centos 容器,并交互式的进行操作。

root@gengqijun-test-bjqw:~ # docker run -it --rm --name centos centos:7.4.1708
[root@f0fb25c1a97f /]# date
Tue Mar  6 05:58:30 UTC 2018
[root@f0fb25c1a97f /]# pwd
/

此时如果我们想先暂时离开当前容器可以在容器内按Ctrl+p 松开后按Ctrl+q 键来让容器继续运行在后台。

3. 指定容器的名字

使用--name 参数可以在运行容器时给容器指定一个名字,如果不指定--name 默认情况下 docker 会自动分配给容器一个唯一的名字。

  • 示例

运行一个 Nginx 镜像,命名为 web_nginx

root@gengqijun-test-bjqw:~ # docker run -d --name web_nginx nginx
92e1201b09f09dffd5d38da6f306bae0879c22321b2e579f5db5fa27c1b42164
root@gengqijun-test-bjqw:~ # docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
92e1201b09f0        nginx               "nginx -g 'daemon of…"   3 seconds ago       Up 2 seconds        80/tcp              web_nginx

4. 容器退出后自动清除容器

默认情况下,每个容器在退出时,它的文件系统会保存下来。方便通过查看日志等方式确定容器的最终状态。另一方面可以保存容器产生的数据。当你仅仅需要临时运行一个容器并且需要在前台运行,这些数据又不需要保留。就可以在运行容器时使用--rm 参数来在容器退出时自动清理。

  • 示例
root@gengqijun-test-bjqw:~ # docker run -it --name centos --rm centos:7.4.1708
[root@b62554a17d11 /]# echo "Hello Docker"
Hello Docker
[root@b62554a17d11 /]# exit
exit

5. 数据卷 (-v)

-v 参数的作用就是挂载一个文件目录到指定容器中去,实现容器数据持久化。-v 参数可以使用一次或多次将多个目录挂载至容器内。

  • 示例挂载目录

挂载 Docker Host 主机目录 /data/www/html/ 挂载至 Nginx 容器中的 /usr/share/nginx/html/ 作为静态页的存放位置。

# 在 Docker Host 上创建一个默认首页面
root@gengqijun-test-bjqw:~ # cat /data/www/html/index.html 
Hello Docker

# 运行容器将目录挂载到容器
root@gengqijun-test-bjqw:~ # docker run -d --name nginx -p 80:80 -v /data/www/html:/usr/share/nginx/html nginx
2c696d26f675d52a1eaf594db8074c469d277773300f5ca3059bfa44808e42fc

# 请求宿主机的80端口
root@gengqijun-test-bjqw:~ # curl 10.100.4.192
Hello Docker

# 进入容器内查看默认首页面
root@gengqijun-test-bjqw:~ # docker exec -it nginx bash
root@2c696d26f675:/# cat /usr/share/nginx/html/index.html 
Hello Docker
  • 示例挂载文件
root@gengqijun-test-bjqw:~ # docker run -it --name c1 --rm -v /etc/fstab:/tmp/fstab centos:7.4.1708

6. 数据卷容器

--volumes-from 就是从另一个容器当中挂载容器中已经创建好的数据卷。

如果你有一些持续更新的数据需要在容器中共享,最好创建数据卷容器。其实就是一个正常的容器不干别的,专门用来提供数据卷供其它容器挂载使用。

  • 示例创建数据卷容器

创建一个数据卷容器名为 datavolume

root@gengqijun-test-bjqw:~ # docker run -d --name datavolume -v /data/www/html:/data/www/html centos:7.4.1708
952535b6f50fece9e3ec56387e63fe101176fb07dad04f8ac8e1fb6b52968a21

root@gengqijun-test-bjqw:~ # docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
952535b6f50f        centos:7.4.1708     "/bin/bash"         3 seconds ago       Exited (0) 3 seconds ago                       datavolume

执行docker ps -a 发现创建好的数据卷容器处于停止运行的状态,因为容器卷本身不提供任何服务,并不需要处于运行状态。

  • 示例创建容器挂载数据卷容器
root@gengqijun-test-bjqw:~ # docker run -it --name test1 --volumes-from datavolume centos:7.4.1708
[root@9fa4e9afc293 /]# ls /data/www/html/
index.html

还可以使用多个 –volumes-from 参数来从多个容器挂载多个数据卷。 也可以从其他已经挂载了数据卷的容器来挂载数据卷。

如果删除了挂载的容器,数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。 这可以让用户在容器之间升级和移动数据卷。

7. 内存资源限制

默认情况下运行的容器可以无限制的使用主机上的资源,可以使用-m, --memory-swap, --oom-kill-disable 来控制内存的资源。

  • 参数说明
# 设置容器使用的最大内存上限。默认单位为byte,可以使用K、G、M等带单位的字符串。
-m, --memory bytes                   Memory limit

# 等于内存和swap分区大小的总和,设置为-1时,表示swap分区的大小是无限的。默认单位为byte,可以使用K、G、M等带单位的字符串。如果–memory-swap的设置值小于–memory的值,则使用默认值,为–memory-swap值的两倍。
--memory-swap bytes              Swap limit equal to memory plus swap: '-1' to enable unlimited swap

# 如果发生内存溢出错误,内核讲kill掉容器中的进程。如果你想控制,可以配合使用- -oom-kill-disable参数。
--oom-kill-disable               Disable OOM Killer
  • 示例

限制内存最多使用1G,swap 没有限制

root@gengqijun-test-bjqw:~ # docker run -it --name centos -m 1G centos:7.4.1708
  • 示例

限制内存最多使用500M,swap为1G

root@gengqijun-test-bjqw:~ # docker run -it --name centos --rm -m 500M --memory-swap 1G --oom-kill-disable centos:7.4.1708 bash

8. CPU 资源限制

默认所有的容器对于 CPU 的利用占比都是一样的,-c 或者 –cpu-shares 可以设置 CPU 利用率权重,默认为 1024,可以设置权重为 2 或者更高(单个 CPU 为 1024,两个为 2048,以此类推)。如果设置选项为 0,则系统会忽略该选项并且使用默认值 1024。通过以上设置,只会在 CPU 密集(繁忙)型运行进程时体现出来。当一个 container 空闲时,其它容器都是可以占用 CPU 的。cpu-shares 值为一个相对值,实际 CPU 利用率则取决于系统上运行容器的数量。

假如一个 1core 的主机运行 3 个 container,其中一个 cpu-shares 设置为 1024,而其它 cpu-shares 被设置成 512。当 3 个容器中的进程尝试使用 100% CPU 的时候「尝试使用 100% CPU 很重要,此时才可以体现设置值」,则设置 1024 的容器会占用 50% 的 CPU 时间。如果又添加一个 cpu-shares 为 1024 的 container,那么两个设置为 1024 的容器 CPU 利用占比为 33%,而另外两个则为 16.5%。简单的算法就是,所有设置的值相加,每个容器的占比就是 CPU 的利用率,如果只有一个容器,那么此时它无论设置 512 或者 1024,CPU 利用率都将是 100%。当然,如果主机是 3core,运行 3 个容器,两个 cpu-shares 设置为 512,一个设置为 1024,则此时每个 container 都能占用其中一个 CPU 为 100%。

  • 压测工具使用的是stress工具在容器内执行
  • 测试主机「4core」当只有 1 个 container 时,可以使用任意的 CPU:
root@gengqijun-test-bjqw:~ # docker run -it --rm --name stress --cpu-shares 512 sjug/centos-stress bash      
[root@5cb09ec7523a jmeter]# stress -c 4
stress: info: [15] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd

在打开一个新的窗口使用 docker stats 查看容器资源使用情况

docker stats stress

测试两个 container,一个设置为 3072,一个设置 1024,CPU 占用如下:

root@gengqijun-test-bjqw:~ # docker run -it --rm --name test1 --cpu-shares 3072 sjug/centos-stress bash          
[root@7914e83be290 jmeter]# stress -c 4
stress: info: [15] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd

运行第二个容器 占比为1024

root@gengqijun-test-bjqw:~ # docker run -it --rm --name test2 --cpu-shares 1024 sjug/centos-stress bash     
[root@efa9e36d9cdd jmeter]# stress -c 4
stress: info: [14] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd

查看两个容器的资源使用情况

docker stats

9. 端口映射

有时候,容器要运行一些网络应用,需要外部能访问到这些应用,就需要使用-p/P 参数指定一个主机端口,映射到容器端口中。其中使用-P系统会分配一个随机的端口到内部容器开放的网络端口。

  • 示例

拿 Nginx 服务镜像来做例子;

root@gengqijun-test-bjqw:~ # docker run -d --name nginx -P nginx
f6e38b3039faaf75748baa6e5039ace1ea55bba1fc8d28cf2d24839c12a63701
root@gengqijun-test-bjqw:~ # docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
f6e38b3039fa        nginx               "nginx -g 'daemon of…"   2 seconds ago       Up 1 second         0.0.0.0:1024->80/tcp   nginx

我们可以看到,当我们加上-P大写的,docker会任意分配一个端口给容器。也就是宿主机的IP 和端口就可以访问到该容器内提供的服务,这里是Nginx服务。如下

使用 -p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有

-p <containerPort>:将容器的端口映射至主机所有地址的一个动态端口;
-p <hostPort>:<containerPort>:将容器端口<containerPort>映射至指定的主机端口<hostPort>;
-p <ip>::<containerPort>:将指定的容器端口<containerPort>映射至主机指定<ip>的动态端口;
-p <ip>:<hostPort>:<containerPort>:将指定的容器端口<containerPort>映射至主机指定<ip>的端口<hostPort>

"动态端口" 指随机端口,具体的映射结果可以使用docker port命令查看。
  • 示例

将主机上的 80 端口映射到容器的 80 端口;

root@gengqijun-test-bjqw:~ # docker run -d --name nginx -p 80:80 nginx

10. 容器间通信

多个容器需要通信时除了使用容器IP的方式还可以使用link的方式为容器建立连接。

使用--link=name:alias name就是要访问的目标容器,alias就是自定的别名。

  • 示例

假如这里有两个容器 Tomcat 和 MySQL ,通常情况下 Tomcat 程序需要从MySQL中获取数据,那么在docker内就可以使用link的方式建立通信方式。

先创建MySQL容器

root@gengqijun-test-bjqw:~ # docker run -it --name mysql --rm centos:7.4.1708

在创建Tomcat容器加上--link参数

root@gengqijun-test-bjqw:~ # docker run -it --name tomcat --link=mysql:db centos:7.4.1708

我们查看Tomcat容器内的/etc/hosts 文件看看发生了什么

[root@e52f35dcf330 /]# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3      db ac9327e7c5cb mysql
172.17.0.4      e52f35dcf330

可以看到使用--link 其实是在hosts中添加了解析这样使用容器名或者alias定义的名称都可以直接访问到MySQL容器了。

11. 设定主机名

使用 --hostname 选项为容器设定主机名。

  • 示例
root@gengqijun-test-bjqw:~ # docker run -it --name container1 --hostname container-node1 --rm centos:7.4.1708
[root@container-node1 /]# hostname
container-node1

12. 添加主机名解析

使用--add-host 选项可以在运行容器时在hosts文件中添加主机名的映射。

  • 示例
root@gengqijun-test-bjqw:~ # docker run -it --name container1 --rm --add-host "node1.enzhi.com:192.168.1.10" centos:7.4.1708     
[root@25b39d7cd3a8 /]# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.1.10    node1.enzhi.com
172.17.0.2      25b39d7cd3a8

Search

    Table of Contents