0%

Docker 命令手册

对 Docker 命令有一个宏观上的介绍,并给出其大部分的参数含义。

Docker命令基本概念介绍

镜像:一个镜像代表一个应用环境,他是一个只读的文件,如 mysql 镜像,tomcat 镜像等

容器:镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写

仓库:用来存放镜像的位置,类似于 maven 仓库,也是镜像下载和上传的位置

dockerFile:Docker 生成镜像配置文件,用来书写自定义镜像的一些配置

tar:一个对镜像打包的文件,日后可以还原成镜像

镜像仓库

从 Docker Hub 查找镜像。

Usage

docker search [OPTIONS] TERM

Options

Option Desc
-f, —filter filter 根据提供的 filter 过滤输出
—limit int 搜索结果条数最大为 int(默认25)
—no-trunc 显示完整的镜像 description
—format 使用 Go 模板进行美观打印

Examples

# 搜索 star 数量 > 3 的镜像
docker search --filter stars=3 java
# 搜索可自动构建(automated-build)的镜像
docker search --filter is-automated=true java
# 搜索官方版本的镜像
docker search --filter is-official=true java
# 多条件过滤 
docker search -f condition1 -f condition2 TERM

pull

从镜像仓库中拉取或更新镜像。

Usage

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

TAG:标签,不写的话默认是 latest 最新版,它可以从 DockerHub 上看到。

Options

Option Desc
-a, —all-tags[=false] 拉取所有 tagged 镜像
—disable-content-trust[=true] 忽略镜像的校验
—platform=”” 若服务支持多平台,这里可以设置平台
-q, —quiet[=false] 概要输出

Examples

# 等价写法
docker pull tomcat:8
docker pull docker.io/library/tomcat:8

push

将本地的镜像或上传到镜像仓库,要先登录到镜像仓库。

Usage

docker push [OPTIONS] NAME[:TAG]

Options

Option Desc
—disable-content-trust 忽略镜像的校验,默认开启
-a, —all-tags
-q, —quiet 概要输出

login

登录 Docker 镜像仓库,默认是 Docker Hub。

Usage

docker login [OPTIONS] [SERVER]

Options

Option Desc
-u 账号
-p 密码
—password-stdin 通过 STDIN 提供密码

Examples

# 三种不同方式
docker login
docker login -u poloyy -p ***
cat pwd.txt | docker login -u poloyy --password-stdin # 将文件中的内容写到密码中

logout

退出 Docker 镜像仓库,默认是 Docker Hub。

Usage

docker logout [SERVER]

本地镜像管理

images

列出所有的本地镜像。

Usage

docker images [OPTIONS] [REPOSITORY[:TAG]]

Options

Option Desc
-a, —all 列出本地所有的镜像(含中间镜像层,默认情况下,过滤掉中间映像层)
—digests 显示镜像的摘要信息
-f, —filter filter 显示满足条件(filter)的镜像
—format string 使用模板格式化输出
—no-trunc 显示完整的镜像信息
-q, —quiet 只显示镜像ID

rmi

删除一个或多个镜像。

Usage

docker rmi [OPTIONS] IMAGE [IMAGE...]

Options

Option Desc
-f 强制删除
—no-prune 不移除该镜像的过程镜像,默认移除

Examples

# 通过 REPO 删除镜像
docker rmi tomcat
# 通过 REPO:TAG 删除镜像
docker rmi -f tomcat:latest
# 通过 IMAGE ID 删除镜像
docker rmi -f fd484f19954f
# 删除所有镜像
docker rmi -f $(docker images -aq)
# 删除多个镜像
docker rmi -f tomcat mysql

tag

给本地镜像打一个版本标记(tag),可将其归入某一仓库,其 IMAGE ID 与源镜像相同。

Usage

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

Examples

docker tag jenkins:latest elijah/jenkins:0.0.1

打了新的 TAG 虽然会多了一条记录,但是从 IMAGE ID 可以得知他们是同一个镜像

Gracefully Use

  • 当镜像配置到一定程度时,想打个 tag 进行记录当前版本,可以打个 V1
  • 再次更新镜像时,又可以打个 V2
  • 当是最新版本待上传时,可以不打默认就是 latest 最新
  • 这样不仅能保存最新版本的镜像,也能保存历史版本的镜像,方便新版本镜像出问题时进行版本回溯

export

将容器的文件系统导出为 tar 文件。

Usage

docker export [OPTIONS] CONTAINER 

Options

Option Desc
-o 将输入内容写到文件

Examples

docker export -o redis-export.tar redis6

import

从 tar 归档文件(由 export 命令导出)中创建镜像。

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

Options

Option Desc
-m,—message string 提交时的说明文字
-c,—change list 将Dockerfile指令应用于创建的映像

Examples

docker import elijah.tomcat.tar elijah/tomcat

容器生命周期管理

run

创建一个新的容器并运行一个命令。其参数是 create 和 start 参数的集合。

Usage

docker run [OPTIONS] IMAGE [COMMAND] [ARG...] #COMMAND 容器内执行的命令 ARG 执行命令的参数

命令行退出容器方法:

exit         #容器直接退出
ctrl +P +Q   #容器不停止退出

Process

  1. 在指定镜像上创建一个可写的容器层(/containers/create
  2. 启动该容器(/containers/(id)/start
  3. 使用指定的 COMMAND 命令启动它

Options

Option Desc
—name string 容器名字
-h, —hostname string 指定容器的 host name
—dns 8.8.8.8 指定容器 dns 服务器

Options & Examples

-p-P 的用法

Option Desc
-p,—publish list 指定端口映射,指定容器内部端口映射到主机端口
-P,—publish-all 随机端口映射,容器内部暴露的端口随机映射到主机端口
# docker run -p 6379 redis:6 redis-server
-P # 0.0.0.0:61555->6379/tcp
-p 6359 # random host port -> specific container port    0.0.0.0:61575->6379/tcp
-p 6359:6359 # sprcific host port -> specific container port    0.0.0.0:61575->6379/tcp
-p 127.0.0.1:6359:6359 

-i-t-d 的用法

Option Desc
-i,—interactive 启动容器后,打开标准输入设备(stdin),可是用键盘进行输入
-t,-tty 启动容器后,为容器分配一个伪终端(pseudo-TTY),将与服务器建立一个会话
-d,—detach 后台运行该容器,并输出 Container ID
# 后台运行一个镜像
docker run -d IMAGE
# 以tomcat为例,启动tomcat并进入命令行
docker run -it tomcat:7 bash
# 以tomcat为例,启动tomcat并查看启动线程输出
docker run -it tomcat:7

有的镜像文件添加了 CMD 命令,例如:CMD ["redis-server"]。意思就是当你在后台运行的时候,这个镜像创建的容器会首先执行 redis-server,如果这时添加 bash Command:docker run -p 6379:6379 redis:6 bash,bash 命令会替换掉 CMD["redis-server"] 使得 redis 启动失败,进而使得容器启动失败。

解决方法:通过 -i 或者 -t-d 提供一个伪”tty n“,但 redis-server 依旧不能提供服务,至少容器可以正常启动。

-v 的用法

Option Desc
-v, —volume 目录映射,主机目录映射到容器目录,格式: :<容器目录>
docker run -d -p 9999:8080 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat:7

--privileged 的用法

Option Desc
—privileged 容器内是否使用真正的 root 权限
-u, —user string 以指定用户身份创建容器
# 以 root 权限创建容器,当进入容器之后,拥有 root 权限去执行命令
docker run -d --privileged=true jenkins/jenkins
# 但拥有 root 权限并不一定有 root 身份,最好同时通过 -u root 指定
docker run -d --privileged=true -u root jenkins/jenkins
# 同样的拥有 root 身份并不一定有 root 权限

--restart 的用法

Option Desc
—restart Docker 重启后,容器是否自动重启。(default no)
docker run -d --restart always tomcat:7 # 自动重启

create

创建一个新的容器但不启动它。

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

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
    --cgroupns string                Cgroup namespace to use (host|private)
                                     'host':    Run the container in the Docker host's cgroup namespace
                                     'private': Run the container in its own private cgroup namespace
                                     '':        Use the cgroup namespace as configured by the
                                                default-cgroupns-mode option on the daemon (default)
    --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)
    --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
    --domainname string              Container NIS domain name
    --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
    --gpus gpu-request               GPU devices to add to the container ('all' to pass all GPUs)
    --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 network                Connect a container to a network
    --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)
    --platform string                Set platform if server is multi-platform capable
    --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
    --pull string                    Pull image before creating ("always"|"missing"|"never") (default "missing")
    --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
    --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

start

启动一个或多个已经被停止的容器。

Usage

docker start [OPTIONS] CONTAINER [CONTAINER...]

Options

Option Desc
-a, —attach Attach STDOUT/STDERR and forward signals
—detach-keys string Override the key sequence for detaching a container
-i, —interactive Attach container’s STDIN

Example

# 根据容器 ID、Name 操作
docker start container_id 
docker start container_name
# 启动所有容器
docker start $(docker ps -a -q)

stop

停止一个或多个运行中的容器。

Usage

docker stop [OPTIONS] CONTAINER [CONTAINER...]

Options

Option Desc
-t, —time 杀死容器之前等待停止的秒数(默认为10)

restart

重启一个或多个容器。

Usage

docker restart [OPTIONS] CONTAINER [CONTAINER...]

Options

Option Desc
-t, —time 杀死容器之前等待停止的秒数(默认为10)

pause/unpause

docker pause:暂停一个或多个容器中的所有进程
docker unpause:恢复一个或多个容器中的所有进程

Usage

docker pause CONTAINER [CONTAINER...]
docker unpause CONTAINER [CONTAINER...]

Examples

# 暂停 tomcat7 容器的服务
docker pause tomcat7
# 恢复 tomcat7 容器的服务
docker unpause tomcat7

kill

杀死一个或多个正在运行的容器。

Usage

docker kill [OPTIONS] CONTAINER [CONTAINER...]

Options

Option Desc
-s,—signal 发送信号到容器,默认 KILL

rm

删除一个或多个容器

Usage

docker rm [OPTIONS] CONTAINER [CONTAINER...]

Options

Option Desc
-f,—force 通过 SIGKILL 信号删除一个正在运行的容器
-l,—link 移除容器间的网络,而非容器本身
-v,—volumes 删除与容器映射的目录

Examples

# 强制删除容器
docker rm -f tomcat7
# 删除所有已停止的容器
docker rm $(docker ps -a -q)
# 删除所有容器
docker rm -f $(docker ps -aq)
docker ps -a -q|xargs docker rm
# 删除容器 tomcat7,并删除容器映射到本机的目录

# 创建一个容器
# 共有两个 -v,对/usr/local/tomcat/webapps 目录进行两次映射
# 第一个 -v 没有指定主机映射目录
# 第二个 -v 指定了主机映射目录
docker create -v /usr/local/tomcat/webapps -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps --name tomcat7 tomcat:7
# 删除容器和它在主机的映射目录
docker rm -f -v tomcat7
# 只有指定了主机映射目录的 webapps 目录不会被删除,而没有指定的映射目录则会被删除

exec

在正在运行的容器中运行命令

Usage

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Options

Option Desc
-d,—detach 在后台运行命令
-i,—interactive 即使没有附加也保持 STDIN 打开,和 -t 配合
-t,—tty 进入容器的 CLI 模式
-e,—env list 设置环境变量
—env-file 读入环境变量文件
-w,—workdir string 需要执行命令的目录
-u,—user string 指定访问容器的用户名

Examples

# 执行 tomcat 容器的 startup.sh 脚本
docker exec -it tomcat7 startup.sh
# 进入容器的 CLI 模式(最常用)
docker exec -it tomcat7 bash
# 执行普通命令
docker exec -it tomcat7 pwd
# 指定工作目录执行命令
docker exec -it -w /usr tomcat7 pwd
# 以 root 用户身份进入容器(重点)
docker exec -it -uroot tomcat7 bash

attach

进入容器正在执行的终端。

Usage

docker attach [OPTIONS] CONTAINER

Options

Option Desc
—detach-keys 覆盖用于分离容器的键序列
—no-stdin 不要附加标准输入
—sig-proxy 所有接收到的信号代理到进程

和 exec 的区别

#进入当前容器后开启一个新的终端,可以在里面操作。(常用)
docker exec 

# 进入容器正在执行某个命令的终端,不能在里面操作
docker attach 

容器操作

需要注意的是,对于所有容器操作,CONTAINER 可传入 CONTAINER ID 或 CONTAINER NAME。

ps

列出容器

Usage

docker ps [OPTIONS]

Options

Option Desc
-a, —all 显示全部容器(默认只显示运行中的容器)
-f, —filter filter 根据提供的 filter 过滤输出
-n, —last int 列出最近创建的 n 个容器(默认-1,代表全部)
-l, —latest 显示最近创建的容器(包括所有状态的容器)
-s, —size 显示总的文件大小
—no-trunc 显示完整的镜像 ID
-q, —quiet 静默模式,只显示容器 ID

top

显示容器正在运行的进程

Usage

docker top CONTAINER [ps OPTIONS]

logs

获取容器日志。

Usage

docker logs [OPTIONS] CONTAINER

Options

Option Desc
—details 显示提供给日志的其他详细信息
-f,—follow 跟踪日志输出
-n,—tail 仅列出最新N条容器日志
-t,—timestamps 显示时间戳
—since string 依据时间戳(e.g. 2013-01-02T13:23:37Z)或相对时间(e.g. 42m for 42 minutes)显示 log
—until string 依据时间戳(e.g. 2013-01-02T13:23:37Z)或相对时间(e.g. 42m for 42 minutes)显示 log

port

列出指定的容器的端口映射。

Usage

docker port CONTAINER [PRIVATE_PORT[/PROTO]]
  • PRIVATE_PORT:指定查询的端口
  • PROTO:协议类型(tcp、udp)

容器 rootfs 命令

cp

在容器和主机之间复制文件/文件夹。

Usage

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- # 从容器复制到主机
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH # 从主机复制到容器

重点

  • 容器 container 可以是正在运行或已停止的容器
  • SRC_PATH 或 DEST_PATH 可以是文件或目录
  • 该命令会假定容器路径相对于容器的 /(根)目录
  • 而主机路径则是相对于执行 docker cp 命令的当前目录

Options

Option Desc
-a,—archive 存档模式(复制所有uid / gid信息)
-L,—follow-link 保持源目标中的链接

SRC_PATH 和 DEST_PATH 的讲解

SRC_PATH 指定一个文件

  • 若 DEST_PATH 不存在

    创建 DEST_PATH 所需的文件夹,文件正常保存到 DEST_PATH 中

  • 若 DEST_PATH 不存在,并以 / 结尾

    错误:目标目录必须存在

  • 若 DEST_PATH 存在并且是一个文件

    目标被源文件的内容覆盖

  • 若 DEST_PATH 存在并且是目录

    使用 SRC_PATH 中的基本名称将文件复制到此目录中

SRC_PATH 指定目录

  • 若 DEST_PATH 不存在

    将 DEST_PATH 创建为目录,并将源目录的内容复制到该目录中

  • 若 DEST_PATH存在并且是一个文件

    错误:无法将目录复制到文件

  • 若 DEST_PATH存在并且是目录

    SRC_PATH 不以 /. 结尾,源目录复制到此目录

    SRC_PATH 以 /. 结尾,源目录的内容被复制到该目录中

Examples

docker cp tomcat7:usr/local/tomcat/README.md ./

diff

检查容器文件系统上文件或目录的更改情况。

Usage

docker diff CONTAINER

修改类型

字符 说明
A 添加了文件或目录
D 删除了文件或目录
C 修改了文件或目录

submit

从容器创建一个新的镜像。

Usage

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Options

Option Desc
-a,—author string 提交镜像的作者
-c,—change list 使用 Dockerfile 指令来创建镜像
-m,—message string 提交时的说明文字
-p,—pause commit 时,将容器暂停

查看容器信息

info

显示 Docker 系统信息,包括镜像和容器数。

Usage

docker info [OPTIONS]

version

显示 Docker 版本信息。

Usage

docker version [OPTIONS]

inspect

获取容器/镜像的元数据(JSON格式)。

Usage

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

Options

Option Desc
-f,—format string 指定返回值的模板文件
-s,—size 如果类型为容器,则显示文件总大小
—type 返回指定类型的JSON

网络配置

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。

同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。

当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。

注意:某个容器指定在某个网桥内时,该容器的 IP 地址和容器名相映射,可以使用该网桥内的任意一个容器的主机名与其他容器进行通信。

Usage

docker network COMMAND

Commands

Command Desc
connect 连接容器到网络
disconnect 断开容器到网络
create 创建一个网桥
inspect 查看网桥细节
ls 查看网络信息
prune 删除全部未使用网桥
rm 删除一个网桥

数据卷配置

数据卷(Volume)是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅数据卷为空时会复制)。

Usage

docker volume COMMAND

Commands

Command Desc
create 创建数据卷
inspect 查看数据卷
ls 查看全部数据卷
prune 删除没有使用的数据卷
rm 删除一个或多个数据卷

Dockerfile

基本结构

Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。

一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

例如

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..

# Base image to use, this must be set as the first line
FROM ubuntu

# Maintainer: docker_user <docker_user at email.com> (@docker_user)
MAINTAINER docker_user docker_user@email.com

# Commands to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# Commands when creating a new container
CMD /usr/sbin/nginx

指令

指令的一般格式为 INSTRUCTION arguments,指令包括 FROMMAINTAINERRUN 等。

FROM

格式为 FROM <image>FROM <image>:<tag>

第一条指令必须为 FROM 指令。并且,如果在同一个 Dockerfile 中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)。

MAINTAINER

格式为 MAINTAINER <name>,指定维护者信息。

RUN

格式为 RUN <command>RUN ["executable", "param1", "param2"]

前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现,例如 RUN ["/bin/bash", "-c", "echo hello"]

每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。

CMD

支持三种格式

  • CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
  • CMD command param1 param2/bin/sh 中执行,提供给需要交互的应用;
  • CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;

指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。

如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

EXPOSE

格式为 EXPOSE <port> [<port>...]

告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。

ENV

格式为 ENV <key> <value>。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。

例如

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

ADD

格式为 ADD <src> <dest>

该命令将复制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。

COPY

格式为 COPY <src> <dest>

复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>(无法自动解压)。

当使用本地目录为源目录时,推荐使用 COPY

ENTRYPOINT

两种格式:

  • ENTRYPOINT ["executable", "param1", "param2"]
  • ENTRYPOINT command param1 param2(shell中执行)。

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

VOLUME

格式为 VOLUME ["/data"]

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

USER

格式为 USER daemon

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。

当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要临时获取管理员权限可以使用 gosu,而不推荐 sudo

WORKDIR

格式为 WORKDIR /path/to/workdir

为后续的 RUNCMDENTRYPOINT 指令配置工作目录。

可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

则最终路径为 /a/b/c

ONBUILD

格式为 ONBUILD [INSTRUCTION]

配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。

例如,Dockerfile 使用如下的内容创建了镜像 image-A

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

如果基于 image-A 创建新的镜像时,新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行ONBUILD 指令内容,等价于在后面添加了两条指令。

FROM image-A

#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild

创建镜像

编写完成 Dockerfile 之后,可以通过 docker build 命令来创建镜像。基本的格式为 docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的 Dockerfile,并将该路径下所有内容发送给 Docker 服务端,由服务端来创建镜像。因此一般建议放置 Dockerfile 的目录为空目录。也可以通过 .dockerignore 文件(每一行添加一条匹配模式)来让 Docker 忽略路径下的目录和文件。

安装常用软件

MySQL

docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

Redis

docker run -itd --name redis -p 6379:6379 redis

Jenkins

docker run -d -p 8080:8080 -v ~/jenkins:/var/jenkins_home -u root --name jenkins jenkins

由于 Jenkins 默认以 jenkins:jenkins 用户运行,对于 ~/jenkins 目录没有写入权限,因此会报错;只需要给对应角色授权或者以 root 权限运行即可(-u root)。

对于 0.0.0.0:8080->8080/tcp, 50000/tcp 我们可以看到, 8080 端口对应的是 Jenkins 的管理页面;而 50000 则是 Jenkins 的 Master 与 Slave 之间相互通信的端口