docker run是启动容器的命令,参数很丰富,这里特意学习一下。
一般启动容器的常用命令为
> docker run -d -p [主机端口]:[容器端口] --name [容器名称] [镜像名称]:[tag]
-d:--detach的简写,表示容器在后台运行,打印出容器id
-p:--publish的简写,表示容器和主机之间的端口映射。
--name:赋予容器一个名字。不然,容器就随机取一个名字。
在实际的使用场景中,常用的参数还有一些。
1 常用命令
-
-i
-i等同于--interactive=true,表示打开STDIN,用于控制台交互。默认--interactive=false。 -t
-t等同于--tty=true,表示分配tty设备,可以支持终端登录。默认--tty=false。 下面的命令,拉取ubuntu 16.04版本的镜像,并启动容器,打开一个可以交互的终端。> docker pull ubuntu:16.04 > docker run -it --name ubuntu123 ubuntu:16.04打开的终端如下图所示

-u
等同于--user。指定容器的用户。
下面的例子,使用当前登录的用户的uid(user id)和gid(group id)。可以看到,当前进入容器的用户,已经不是root用户了。因为我们没有指定名字,所以没有用户名。实际上,也不需要让容器依赖于用户名。> docker run --user $(id -u):$(id -g) -it --rm ubuntu:16.04 /bin/bash I have no name!@2cd7f85141a6:/$-w
也可以写为--workdir。指定容器的工作目录。当指定的目录不存在时,则在容器内创建一个目录。
下面的例子,指定工作目录为/work/here。> docker run -w /work/here -it ubuntu:16.04 pwd /work/here-e
也可以写为--env,指定环境变量,容器中可以使用该环境变量。如下面的例子所示。> docker run --env VAR1=value1 --env VAR2=value2 ubuntu:16.04 env | grep VAR输出如下
VAR1=value1 VAR2=value2-m
等同于--memory,指定容器可以使用的内存上限。
例子如下。- 在一个终端中使用如下命令启动一个运行中的容器
> docker run -it -m 1GB ubuntu:16.04 /bin/bash - 在另一个终端中,使用如下命令查看容器的资源使用情况。可以看到内存使用为792K,上限为1G。
> docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 7170f4b198d8 trusting_mclaren 0.00% 792KiB / 1GiB 0.08% 1.11kB / 0B 0B / 0B 1
- 在一个终端中使用如下命令启动一个运行中的容器
-h
等同于--hostname,指定容器的主机名。 下面的例子中,可以看到启动的容器的主机名为mydocker。> docker run -it -h mydocker ubuntu:16.04 /bin/bash root@mydocker:/#-
-v
-v等同于--volume,含义是给容器加载一个用于存储的volume。已经不推荐使用,推荐使用--mount参数。 --mount
用于给容器加载一个volume(卷)、主机文件路径或者tmpfs。--mount的值包含多个key-value对,使用逗号分隔,各个key-value对无需考虑顺序。可以选择的key如下所示- type:可以为bind、volume和tmpfs,通常为volume。type=volume是指加载一个命名卷或者匿名卷,具有很多优点,是推荐的使用方式。type=bind指挂载主机的某个文件路径到容器中,主机上被挂载的这个路径是被共享的。type=tmpfs是指数据仅仅写入主机系统的内存中,不会写入主机的文件系统。
- source:简写为src。type=volume,为挂载的卷名。type=bind,为挂载的文件路径。
- target(或者dst,或者destination):容器中对应的路径
- readonly:可选,表示是否只读。若开启,则表示该路径只读。
- volume-opt:可选。为一个key-value对,用来指定额外的参数。可以多次使用。
例子1:下面的例子,首先创建一个卷,然后启动ubuntu时挂载该卷。
> docker volume create myvol2 #创建一个卷 > docker volume ls #列出所有的卷 > docker volume inspect myvol2 #查询某个卷 > docker run -it --mount source=myvol2,target=/app2 ubuntu:16.04 /bin/bash通过以下命令,在ubuntu里面查看挂载的卷。可以看到有一个路径为
/app2。> df Filesystem 1K-blocks Used Available Use% Mounted on overlay 61255492 6927592 51186576 12% / tmpfs 65536 0 65536 0% /dev tmpfs 1023420 0 1023420 0% /sys/fs/cgroup shm 65536 0 65536 0% /dev/shm /dev/sda1 61255492 6927592 51186576 12% /app2 tmpfs 1023420 0 1023420 0% /proc/acpi tmpfs 1023420 0 1023420 0% /sys/firmware例子2:下面的命令将当前主机的路径映射到容器的路径/mydir/。
> docker run -it --mount type=bind,src=$PWD,target=/mydir/ ubuntu:16.04 /bin/bash #$PWD代表执行命令的当前路径 > ls bin boot dev etc home lib lib64 media mnt mydir opt proc root run sbin srv sys tmp usr var > ls /mydir/ #/mydir映射到了主机的当前路径,这里为我的家目录。 Applications CorpCode Desktop Documents Downloads Library Movies Music Pictures Public SelfCode UserApplications gems jekyll_site这里只是讲述了基本的使用,详情请参考docker volume 容器卷的那些事(一)和Use volumes。
--rm
等同于--rm=true,表示容器停止后自动删除容器(不支持以docker run -d启动的容器)
下面的命令,当容器停止后,容器就会被删除了。> docker run --rm -it ubuntu:16.04 /bin/bash在容器停止后,可以使用
docker ps来查看容器,会发现找不到刚才启动的容器。
2 参考
Docker run 命令参数及使用
docker volumes 中 -v 和 -mount 区别
docker run
docker volume 容器卷的那些事(一)
Use volumes
Running a Docker container as a non-root user