【翻译】docker run手册

docker运行的进程是相互隔离的,一个容器在宿主机器上也就是一个普通的进程。当执行docker run的时候,一个容器进程会被启动,他有自己的文件系统,有自己的网络,有自己的进程树。这篇文章将会详细额介绍docker run的每个命令行参数,来通知容器的运行时状态。

基本的docker run看起来像这样:

1
$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

docker run命令必须给定一个明确的镜像。容器执行能够指定如下参数:

  • 前台运行还是后台运行
  • 容器的唯一标示
  • 网络设置
  • 运行是时的CPU和内存相关设置

使用docker run命令行选项能够覆盖镜像的一些默认参数。因为docker版本的设置,你运行docker命令的时候,也许需要sudo,为了避免在执行docker命令的时候使用sudo,你可以创建一个docker的用户组,将当前用户加入到docker这个用户分组中来。

前台运行还是后台运行

默认情况下,启动容器后容器是前台运行的,如果你需要容器在后台运行,那么你需要使用 -d选项来指定运行模式。

1
-d=false: Detached mode: Run container in the background, print new container id

启动容器的时候,使用-d=true或者直接-d选项,容器会在后台启动。docker容器设计的是,当容器中的进程退出,那么容器就会自动退出。除非你使用了--rm选项。如果你同时使用-d--rm选项,容器中进程退出偶,容器首先就会被删除掉。

不要使用service x start来启动一个后台的容器,例如,这里尝试启动nginx服务:

1
$ docker run -d -p 80:80 my_image service nginx start

这里成功的启动了nginx服务,然而这样nginx经常退出,容器是没有感知的,最后导致以为服务存在,其实是服务是不可用的。正确的启动nginx的方式如下:

1
$ docker run -d -p 80:80 my_image nginx -g 'daemon off;'

在前台运行的模式(默认-d选项是不激活的),docker容器是在前台运行的,能够在当前的终端输入输入信息,以及错误输出。

容器的唯一标示

唯一标示一个容器有三种方式
|标示类型|例子|
|—|—|
|UUID|”f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778”|
|短UUID|”f78375b1c487”|
|容器名字|”evil_ptolemy”|
UUID产生自后台运行的容器,如果一个容器在启动的时候没有通过--name指定容器名字,那么就会产生一段随机的字符串作为容器的唯一标示。这段随机字符串一个一串uuid,它的长度很长,通常情况我们只需取前面几个字符就能唯一标示一个容器了。如果容器指定了名字,那么容器容器和使用容器ID一样的效果。

我们可以通过--cidfile选择来指定一个文件,容器的ID会被自动写入到这个文件中。

1
--cidfile="": Write the container ID to the file

和容器一样,进行也是有唯一标示的可以通过image[:tag]来指定一个镜像,例如:

1
docker run ubuntu:14.04.

镜像也是有id的,我们也可以通过Image[@digest]的方式来指定一个镜像.

每一个容器启动,默认情况下进程都是相互隔离,当然也通过指定pid namespace来指定命令空间,例如,在容器执行htop:

1
2
3
FROM alpine:latest
RUN apk add --update htop && rm -rf /var/cache/apk/*
CMD ["htop"]

编译镜像

1
$ docker build -t myhtop .

运行如下命令执行htop:

1
$ docker run -it --rm --pid=host myhtop

也可以加入到另一个容器的命令空间

1
$ docker run --name my-redis -d redis

通过如下命令来调试这个redis进程

1
2
$ docker run -it --pid=container:my-redis my_strace_docker_image bash
$ strace -p 1

原文地址: https://docs.docker.com/engine/reference/run/