【翻译】docker run手册
docker运行的进程是相互隔离的,一个容器在宿主机器上也就是一个普通的进程。当执行docker run
的时候,一个容器进程会被启动,他有自己的文件系统,有自己的网络,有自己的进程树。这篇文章将会详细额介绍docker run
的每个命令行参数,来通知容器的运行时状态。
基本的docker run
看起来像这样:
$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
docker run
命令必须给定一个明确的镜像。容器执行能够指定如下参数:
- 前台运行还是后台运行
- 容器的唯一标示
- 网络设置
- 运行是时的CPU和内存相关设置
使用docker run
命令行选项能够覆盖镜像的一些默认参数。因为docker版本的设置,你运行docker命令的时候,也许需要sudo
,为了避免在执行docker命令的时候使用sudo
,你可以创建一个docker
的用户组,将当前用户加入到docker
这个用户分组中来。
前台运行还是后台运行
默认情况下,启动容器后容器是前台运行的,如果你需要容器在后台运行,那么你需要使用 -d
选项来指定运行模式。
-d=false: Detached mode: Run container in the background, print new container id
启动容器的时候,使用-d=true
或者直接-d
选项,容器会在后台启动。docker容器设计的是,当容器中的进程退出,那么容器就会自动退出。除非你使用了--rm
选项。如果你同时使用-d
和--rm
选项,容器中进程退出偶,容器首先就会被删除掉。
不要使用service x start
来启动一个后台的容器,例如,这里尝试启动nginx
服务:
$ docker run -d -p 80:80 my_image service nginx start
这里成功的启动了nginx服务,然而这样nginx经常退出,容器是没有感知的,最后导致以为服务存在,其实是服务是不可用的。正确的启动nginx的方式如下:
$ 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会被自动写入到这个文件中。
--cidfile="": Write the container ID to the file
和容器一样,进行也是有唯一标示的可以通过image[:tag]
来指定一个镜像,例如:
docker run ubuntu:14.04.
镜像也是有id的,我们也可以通过Image[@digest]
的方式来指定一个镜像.
每一个容器启动,默认情况下进程都是相互隔离,当然也通过指定pid namespace来指定命令空间,例如,在容器执行htop
:
FROM alpine:latest
RUN apk add --update htop && rm -rf /var/cache/apk/*
CMD ["htop"]
编译镜像
$ docker build -t myhtop .
运行如下命令执行htop:
$ docker run -it --rm --pid=host myhtop
也可以加入到另一个容器的命令空间
$ docker run --name my-redis -d redis
通过如下命令来调试这个redis进程
$ docker run -it --pid=container:my-redis my_strace_docker_image bash
$ strace -p 1