title: Docker命令解读(一)
date: 2015-11-19 18:15:05
tags: docker
categories: Docker Commands
Docker命令解读系列文章将系统讲解Docker使用的命令,方便大家学习Docker的基本操作。在写这个系列文章的时候,主要参考了Docker官方的文档,有些内容是直接的翻译。原文档地址 Docker Docs
转载请注明出处
首先从docker run
命令开始解读,这是我们使用最多的命令。当我们需要从镜像创建一个容器来运行我们的应用或提供某种服务时,就要使用docker run
命令。
官方文档链接:docker run
可以运行docker run --help
来查看所有的参数和使用方法
格式:
$ docker run [OPTIONS] IMAGE[:TAGS|@DIGEST] [COMMAND] [ARG...]
从格式可以看出,docker run
命令必须指定一个IMAGE来运行容器。容器中有些默认配置和行为,如:
- 后台还是前台运行
- 容器标识
- 容器运行的CPU,内存等限制
- 权限等
使用[OPTIONS]选项可以改变这些默认值,使用这种方法几乎可以改变容器的所有默认行为,这也是为什么docker run
命令有如此多选项的原因。
更多关于[OPTIONS]的内容可以参考Option Types
Note: 你可能需要使用sudo
来运行docker run
命令,如果你不想使用sudo
来运行它,你可以将你的用户加入到你本机的docker组下(注意,这会影响你的系统的安全性)。
下面讲解如下几个方面的[OPTIONS]:
* 前台模式VS后台模式
* 容器标识
* PID设置
* UTS设置
* IPC设置
* 网络模式设置
* 重启策略 --restart
* 清除标识 --rm
* 安全设置
* 自定义cgroups
* 运行时资源约束
* 运行时特权,Linux Capabilities和LXC配置
* 日志驱动器(logging driver)
* 改变Dockerfile设定的默认行为
前台模式VS后台模式
使用docker run
命令运行一个容器时,我们可以选择是让他后台运行(detached模式)或者前台运行(foreground模式【默认】)
后台模式
使用detached模式运行容器,需要在docker run
命令中指定-d=true
(或-d)选项。使用detached模式运行起来的容器停止时不会自动移除,也就是说,在使用了-d
(或-d=true
)选项的docker run
命令中不能指定--rm
选项。
不要将类似于下面的命令传递给一个以detached模式运行起来的容器:
service XXX start
例如下面的命令试图在容器中启动nginx,运行时指定了-d选项:
docker run -d -p 80:80 nginx_image service nginx start
这确实启动了容器中的nginx服务,但是容器却没有保持运行。因为容器中的祖先进程(在这个例子中就是service nginx start
)执行完返回,按照容器的设计,容器中的祖先进程返回后容器就停止了。结果,nginx服务启动了但不能使用。
在这个例子中,我们应该使用这样的命令:
docker run -d -p 80:80 nginx_image nginx -g 'daemon off;'
要与使用detached模式运行起来的容器交换信息,需要使用网络或共享卷(shared volumes),因为在detached
模式下docker run
命令执行完后,容器就不再监听命令行了。
要重新定位到容器可以使用docker attach
命令(参考attach
)。
前台模式
前台模式下,docker run
命令会在新的容器中启动一个进程,并将这个进程的标准输入,标准输出和标准出错绑定到控制台上(甚至是一个伪TTY客户端)。这些都是可以配置的。
-a=[] : 绑定'STDIN', 'STDOUT'和/或'STDERR'
-t=false : 分配一个伪TTY终端
--sig-proxy=true :传递所有的信号给容器中的进程(仅在非tty模式下有效)
-i=false :使STDIN保持打开,即使容器没有被连上(not attached)
如果你没有指明-a
标识,默认会绑定所有的三个标准IO流。你也可以像下面这样绑定三个中的一个或多个:
docker run -a stdin -a stdout -i -t ubuntu /bin/bash
如果要开启一个交互式的容器,必须同时指定