Docker 是一个开放源代码的软件项目,该项目在 2013 年开源于 GitHub。它是云服务技术上的一次创新,让应用程序布署在软件容器下的工作可以自动化进行,借此在 Linux 操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。
1. 容器生命周期
主要介绍容器的运行和进入操作
1.1 run 命令
- 定义:创建一个新的容器并运行一个命令
- 格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
编号 |
参数 |
解释说明 |
1 |
--name="nginx-lb" |
为容器指定一个名称 |
2 |
-d |
后台运行容器并返回容器 ID |
3 |
-i |
以交互模式运行容器,通常与-t 同时使用 |
4 |
-t |
为容器重新分配一个伪输入终端,通常与-i 同时使用 |
5 |
-p |
端口映射,格式为<宿主机端口:容器端口> |
6 |
-v |
给容器挂载存储卷,挂载到容器的某个目录 |
7 |
--entrypoint="" |
覆盖 image 的入口点 |
8 |
-e user="escape" |
设置环境变量 |
9 |
--env-file=[] |
从指定文件读入环境变量 |
10 |
-h "node1" |
指定容器的 hostname 属性 |
11 |
--dns 8.8.8.8 |
指定容器使用的 DNS 服务器,默认和宿主一致 |
12 |
--cpuset="0,1,2" |
绑定容器到指定 CPU 运行 |
13 |
-m |
设置容器使用内存的最大值 |
14 |
--net="bridge" |
指定容器的网络连接类型,支持 bridge/host/none/container 类型 |
15 |
--link=[] |
添加链接到另一个容器 |
16 |
--expose=[] |
开放一个端口或一组端口 |
17 |
--add-host |
添加自定义主机到 IP 映射,会写入容器的 hosts 文件中 |
18 |
--health-cmd |
运行检查运行状况的命令 |
19 |
--ip |
指定容器的 IP 地址 |
20 |
--mount |
将文件系统挂载附加到容器 |
21 |
--rm |
退出时自动删除容器 |
22 |
--restart |
重新启动容器退出时应用的策略 |
23 |
--user |
以那个用户去运行容器 |
# 以后台模式启动一个容器并将容器命名为nginx-slb
$ docker run --name="nginx-slb" -d -p 80:80 -v /data:/data nginx:latest
# 绑定容器的8080端口,并将其映射到本地主机127.0.0.1的80端口上
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
# 以交互模式启动一个容器,并在容器内执行/bin/bash命令
$ docker run -it nginx:latest /bin/bash
1.2 start/stop/restart 命令
- 启动:docker start [OPTIONS] CONTAINER [CONTAINER...]
- 停止:docker stop [OPTIONS] CONTAINER [CONTAINER...]
- 重启:docker restart [OPTIONS] CONTAINER [CONTAINER...]
编号 |
命令 |
解释说明 |
1 |
docker start |
启动已经被停止的容器 |
2 |
docker stop |
停止运行中的容器 |
3 |
docker restart |
重启容器 |
# 启动已被停止的容器
$ docker start nginx-slb
# 停止运行中的容器
$ docker stop nginx-slb
# 重启容器
$ docker restart nginx-slb
1.3 kill 命令
- 定义:杀掉一个或多个运行中的容器
- 格式:docker kill [OPTIONS] CONTAINER [CONTAINER...]
编号 |
参数 |
解释说明 |
1 |
-s |
向容器发送一个信号 |
# 杀掉运行中的容器
$ docker kill -s KILL nginx-slb
1.4 rm 命令
- 定义:删除一个或多少容器
- 格式:docker rm [OPTIONS] CONTAINER [CONTAINER...]
编号 |
参数 |
解释说明 |
1 |
-f |
通过 SIGKILL 信号强制删除一个运行中的容器 |
2 |
-l |
移除容器间的网络连接,而非容器本身 |
3 |
-v |
删除容器本身并删除与容器关联的卷 |
# 强制删除容器
$ docker rm -f nginx-slb
# 移除容器nginx对容器redis的连接,连接名backend
$ docker rm -l backend
# 删除容器并删除容器挂载的数据卷
$ docker rm -v nginx-slb
1.5 pause/unpause 命令
- 停止:docker pause [OPTIONS] CONTAINER [CONTAINER...]
- 恢复:docker unpause [OPTIONS] CONTAINER [CONTAINER...]
编号 |
命令 |
解释说明 |
1 |
docker pause |
暂停容器中所有的进程 |
2 |
docker unpause |
恢复容器中所有的进程 |
# 暂停容器
$ docker pause nginx-slb
# 恢复容器
$ docker unpause nginx-slb
1.6 create 命令
- 定义:创建一个新的容器但不启动它
- 格式:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
编号 |
参数 |
解释说明 |
1 |
-w |
设置容器内的工作目录 |
2 |
--mac-address |
设置容器的 MAC 地址 |
# 创建一个容器
$ docker create -v /home/docker:/docker --name docker ubuntu
2. 容器基本操作
使用容器的日常操作基本需要使用命令
2.1 ps 命令
- 定义:列出容器
- 格式:docker ps [OPTIONS]
编号 |
参数 |
解释说明 |
1 |
-a |
显示所有的容器,包括未运行的容器 |
2 |
-q |
静默模式,只显示容器编号 |
3 |
-f |
根据条件过滤显示的内容 |
4 |
--format |
指定返回值的模板文件 |
5 |
-l |
显示最近创建的容器 |
6 |
-n |
列出最近创建的 n 个容器 |
7 |
-s |
显示总的文件大小 |
8 |
--no-trunc |
不截断输出 |
# 列出所有创建的容器ID
$ docker ps -a -q
# 列出最近创建的5个容器信息
$ docker ps -n 5
# 筛选
$ docker ps -f since=6e63f6ff38b0
$ docker ps --filter status=running
$ docker ps --filter "name=nostalgic_stallman"
# 格式化
$ docker network inspect --format "{{.ID}}" net1
$ docker ps --filter volume=/data --format "table {{.ID}}t{{.Mounts}}"
2.2 inspect 命令
- 定义:获取容器/镜像的元数据
- 格式:docker inspect [OPTIONS] NAME|ID [NAME|ID...]
编号 |
参数 |
解释说明 |
1 |
-f |
指定返回值的模板文件 |
2 |
-s |
显示总的文件大小 |
3 |
--type |
为指定类型返回 JSON |
# 获取容器IP地址
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $INSTANCE_ID
# 获取容器MAC地址
$ $ docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $INSTANCE_ID
# 获取容器日志路径
$ docker inspect --format='{{.LogPath}}' $INSTANCE_ID
# 获取容器名称
$ docker inspect --format='{{.Config.Image}}' $INSTANCE_ID
2.3 exec 命令
- 定义:在运行的容器中执行命令
- 格式:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
编号 |
参数 |
解释说明 |
1 |
-d |
在后台运行 |
2 |
-i |
即使没有附加也保持 STDIN 打开 |
3 |
-t |
分配一个伪终端 |
4 |
-e |
设置环境变量 |
5 |
-u |
设置用户 |
6 |
-w |
设置容器的工作目录 |
# 后台执行创建文件
$ docker exec -d ubuntu_bash touch /tmp/execWorks
# 设置环境变量
$ docker exec -it -e VAR=1 ubuntu_bash bash
# 设置工作目录
$ docker exec -it -w /root ubuntu_bash pwd
2.4 attach 命令
- 定义:连接到正在运行中的容器
- 格式:docker attach [OPTIONS] CONTAINER
编号 |
参数 |
解释说明 |
1 |
--sig-proxy |
代理收到所有进程的信号,默认为 true |
# 连接连接到容器查看访问信息
# 在attach是可以带上--sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器
$ docker attach --sig-proxy=false nginx-slb
2.5 logs 命令
- 定义:获取容器的日志
- 格式:docker logs [OPTIONS] CONTAINER
编号 |
参数 |
解释说明 |
1 |
-f |
跟踪日志输出 |
2 |
-t |
显示时间戳 |
3 |
--tail |
仅列出最新 N 条容器日志 |
4 |
--since |
显示某个开始时间的所有日志 |
# 查看容器从2018年11月11日后的最新10条日志
$ docker logs --since="2018-11-11" --tail=10 nginx-slb
2.6 export 命令
- 定义:将文件系统作为一个 tar 归档文件导出到 STDOUT
编号 |
参数 |
解释说明 |
1 |
-o |
将输入内容写到文件 |
# 导出镜像
$ docker export a404c6c174a2 > latest.tar
$ docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2
2.7 top 命令
- 定义:查看容器中运行的进程信息,支持 ps 命令参数
- 格式:docker top [OPTIONS] CONTAINER [ps OPTIONS]
# 容器运行时不一定有/bin/bash终端来交互执行top命令
# 而且容器还不一定有top命令可以使用docker top来实现查看
$ docker top nginx-slb
2.8 stats 命令
- 定义:用来显示容器使用的系统资源
- 格式:docker stats [OPTIONS] [CONTAINER]
编号 |
参数 |
解释说明 |
1 |
--all |
Show all containers (default shows just running) |
2 |
--format string |
Pretty-print images using a Go template |
3 |
--no-stream |
Disable streaming stats and only pull the first result |
4 |
--no-trunc |
Do not truncate output |
# 不带任何选项,则会默认输出并输出全部容器的使用情况
# [CONTAINER]: 以短格式显示容器的ID
# [CPU %]: CPU的使用情况
# [MEM USAGE/LIMIT]: 当前使用的内存和最大可以使用的内存
# [MEM %]: 以百分比的形式显示内存使用情况
# [NET I/O]: 网络I/O数据
# [BLOCK I/O]: 磁盘I/O数据
# [PIDS]: 显示PID号
$ docker stats
# 可以通过 --no-stream 选项只输出当前的状态
$ docker stats --no-stream
# 只输出指定的容器
# 第一列不再显示默认的容器ID,而是显示了我们传入的容器名称和ID
$ docker stats --no-stream registry
# 基于此,我们可以通过简单的方式使用容器的名称替代默认输出中的容器ID
$ docker stats $(docker ps --format={{.Names}})
# 格式化输出的结果
# .Container => 根据用户指定的名称显示容器的名称或ID
# .Name => 容器名称
# .ID => 容器ID
# .CPUPerc => CPU使用率
# .MemUsage => 内存使用量
# .NetIO => 网络I/O
# .BlockIO => 磁盘I/O
# .MemPerc => 内存使用率
# .PIDs => PID号
$ docker stats --format "table {{.Name}}t{{.CPUPerc}}t{{.MemUsage}}"
# 还可以通过format选项输出json格式的结果
$ docker stats --no-stream --format
"{"container":"{{ .Container }}","memory":{"raw":"{{ .MemUsage }}","percent":"{{ .MemPerc }}"},"cpu":"{{ .CPUPerc }}"}"
2.9 port 命令
- 定义:列出指定的容器的端口映射或查找将 PRIVATE_PORT NAT 公开
- 格式:docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]
# 查看开放端口
$ docker port nginx-slb
2.10 wait 命令
- 定义:阻塞运行直到容器停止,然后打印出它的退出代码
- 格式:docker wait [OPTIONS] CONTAINER [CONTAINER...]
# 会有一个退出码
$ docker wait nginx-slb
2.11 events 命令
- 定义:可以帮助你实时获取 docker 的各种事件信息
- 格式:docker events [OPTIONS]
编号 |
参数 |
解释说明 |
1 |
--filter filter |
Filter output based on conditions provided |
2 |
--format string |
Format the output using the given Go template |
3 |
--since string |
Show all events created since timestamp |
4 |
--until string |
Stream events until this timestamp |
# 比如创建了一个容器
$ docker events
2.12 update 命令
- 定义:不用重新部署服务来调整镜像配置
- 格式:docker update [OPTIONS] CONTAINER [CONTAINER...]
编号 |
参数 |
解释说明 |
1 |
--cpus decimal |
Number of CPUs |
2 |
--memory bytes |
Memory limit |
3 |
--restart string |
Restart policy to apply when a container exits |
4 |
--pids-limit int |
Tune container pids limit (set -1 for unlimited) |
# 设置的nginx容器cpu或者内存太小
$ docker update nginx --cpus 2
3. 容器文件系统
排错和查看容器的命令
3.1 commit 命令
- 定义:从容器创建一个新的镜像
- 格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
编号 |
参数 |
解释说明 |
1 |
-a |
提交的镜像作者 |
2 |
-c |
使用 Dockerfile 指令来创建镜像 |
3 |
-m |
提交时的说明文字 |
4 |
-p |
在 commit 时,将容器暂停 |
# 将容器倒为一个镜像
$ docker commit -a "escape" -m "slb" a404c6c174a2 nginx-slb:v1
3.2 diff 命令
- 定义:检查容器里文件结构的更改
- 格式:docker diff [OPTIONS] CONTAINER
# 查看数据层的变化
$ docker diff 1fdfd1f54c1b
C /dev
C /dev/console
C /dev/core
C /dev/stdout
C /dev/fd
C /dev/ptmx
3.3 cp 命令
- 定义:用于容器与主机之间的数据拷贝
- 格式:docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
- 格式:docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
编号 |
参数 |
解释说明 |
1 |
-a |
存档模式 |
2 |
-L |
保持源目标中的链接 |
# 数据拷贝
$ docker cp /www/nginx 96f7f14e99ab:/www/
4. 镜像仓库使用
上传或者下载镜像的命令和操作
4.1 login/logout 命令
- 登录:docker login [OPTIONS] [SERVER]
- 退出:docker logout [OPTIONS] [SERVER]
编号 |
命令 |
解释说明 |
1 |
docker login |
登陆到一个 Docker 镜像仓库 |
2 |
docker logout |
登出到一个 Docker 镜像仓库 |
# 登录
$ docker login localhost:8080
$ cat ~/my_password.txt | docker login --username foo --password-stdin
4.2 pull 命令
- 定义:从镜像仓库中拉取或者更新指定镜像
- 格式:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
编号 |
参数 |
解释说明 |
1 |
-a |
拉取所有 tagged 镜像 |
2 |
--disable-content-trust |
忽略镜像的校验,默认开启 |
# 拉取或者更新
$ docker pull debian:jessie
4.3 push 命令
- 定义:将本地的镜像上传到镜像仓库
- 格式:docker push [OPTIONS] NAME[:TAG]
编号 |
参数 |
解释说明 |
1 |
--disable-content-trust |
忽略镜像的校验,默认开启 |
# 上传
$ docker push nginx-slb:0.-.1
4.4 search 命令
- 定义:从 Docker Hub 查找镜像
- 格式:docker search [OPTIONS] TERM
编号 |
参数 |
解释说明 |
1 |
--automated |
只列出 automated build 类型的镜像 |
2 |
--no-trunc |
显示完整的镜像描述 |
3 |
-s |
列出收藏数不小于指定值的镜像 |
# 收藏数大于10的镜像
$ docker search -s 10 java
4.5 load/save 命令
- 定义:可以导入导出本地镜像
- 格式:docker load [OPTIONS]
- 格式: docker save [OPTIONS] IMAGE [IMAGE...]
编号 |
参数 |
解释说明 |
1 |
load |
可以把镜像从 tar 文件导入到 docker 中 |
2 |
save |
把一个镜像保存到 tar 文件中 |
# 导入
$ docker load -i registry-2.7.1.tar
# 导出
$ docker save registry:2.7.1 -o registry-2.7.1.tar
5. 本地镜像管理
更好的管理我们本地的镜像文件
5.1 images 命令
- 定义:列出本地镜像
- 格式:docker images [OPTIONS] [REPOSITORY[:TAG]]
编号 |
参数 |
解释说明 |
1 |
-a |
列出本地所有的镜像 |
2 |
---digests |
显示镜像的摘要信息 |
3 |
-f |
显示满足条件的镜像 |
4 |
--format |
指定返回值的模板文件 |
5 |
--no-trunc |
显示完整的镜像信息 |
6 |
-q |
只显示镜像 ID |
# 查看镜像
$ docker images -a
5.2 rmi 命令
- 定义:删除本地一个或多个镜像
- 格式:docker rmi [OPTIONS] IMAGE [IMAGE...]
编号 |
参数 |
解释说明 |
1 |
-f |
强制删除 |
2 |
--no-prune |
不移除该镜像的过程镜像,默认移除 |
# 删除镜像
$ docker rmi -f runoob/ubuntu:v4
5.3 tag 命令
- 定义:标记本地镜像,将其归入某一仓库
- 格式:docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# 重命名
$ docker tag httpd fedora/httpd:version1.0
5.4 build 命令
- 定义:用于使用 Dockerfile 创建镜像
- 格式:docker build [OPTIONS] PATH | URL | -
编号 |
参数 |
解释说明 |
1 |
--build-arg=[] |
设置镜像创建时的变量 |
2 |
-f |
指定要使用的 Dockerfile 路径,默认为当前目录下的 Dockerfile 文件 |
3 |
--force-rm |
设置镜像过程中删除中间容器 |
4 |
--isolation |
使用容器隔离技术 |
5 |
--label=[] |
设置镜像使用的元数据 |
6 |
-m |
设置内存最大值 |
7 |
--no-cache |
创建镜像的过程不使用缓存 |
8 |
--pull |
尝试去更新镜像的新版本 |
9 |
-q |
安静模式,成功后只输出镜像 ID |
10 |
--rm |
设置镜像成功后删除中间容器 |
11 |
-t |
镜像的名字及标签 |
12 |
--network |
默认 default,在构建期间设置 RUN 指令的网络模式 |
13 |
--add-host |
添加自定义主机到 IP 映射 |
14 |
--target |
只构建某一阶段的镜像 |
# 常见构建方式
$ docker build .
# 设置标签
$ docker build -t vieux/apache:2.0 .
# 冲远程服务器获取文件构建
$ curl example.com/remote/Dockerfile | docker build -f - .
# 添加自定义主机到IP映射
$ docker build --add-host=docker:10.180.0.1 .
# 只构建某一阶段的镜像
$ docker build -t mybuildimage --target build-env .
# 指定代理地址
$ docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 .
5.5 history 命令
- 定义:查看指定镜像的创建历史
- 格式:docker history [OPTIONS] IMAGE
编号 |
参数 |
解释说明 |
1 |
-H |
以可读的格式打印镜像大小和日期 |
2 |
--no-trunc |
显示完整的提交记录 |
3 |
-q |
仅列出提交记录 ID |
# 查看本地镜像的创建历史
$ docker history nginx:v3
5.6 save 命令
- 定义:将指定镜像保存成 tar 归档文件
- 格式:docker save [OPTIONS] IMAGE [IMAGE...]
# 导出
$ docker save ubuntu:v3 -o my_ubuntu_v3.tar
5.7 import 命令
- 定义:从归档文件中创建镜像
- 格式:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
编号 |
参数 |
解释说明 |
1 |
-c |
应用 docker 指令创建镜像 |
2 |
-m |
提交时的说明文字 |
# 镜像归档文件
$ docker import my_ubuntu_v3.tar
$ docker import my_ubuntu_v3.tar ubuntu:v4