对 Docker 命令有一个宏观上的介绍,并给出其大部分的参数含义。
Docker命令基本概念介绍
镜像:一个镜像代表一个应用环境,他是一个只读的文件,如 mysql 镜像,tomcat 镜像等
容器:镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写
仓库:用来存放镜像的位置,类似于 maven 仓库,也是镜像下载和上传的位置
dockerFile:Docker 生成镜像配置文件,用来书写自定义镜像的一些配置
tar:一个对镜像打包的文件,日后可以还原成镜像
镜像仓库
search
从 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
- 在指定镜像上创建一个可写的容器层(
/containers/create
) - 启动该容器(
/containers/(id)/start
) - 使用指定的 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
,指令包括 FROM
、MAINTAINER
、RUN
等。
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
。
为后续的 RUN
、CMD
、ENTRYPOINT
指令配置工作目录。
可以使用多个 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 之间相互通信的端口