Docker 之三 Docker 容器管理命令

Docker 新建并启动容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 语法
# docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# 新建并以交互式启动centos容器,并为容器重新分配一个伪输入终端,同时指定容器名称
# docker run -it --name="centos" centos /bin/bash

# 新建并后台启动centos容器,如果启动后的容器内部没有前台运行的进程,容器默认会马上停止
# docker run -d centos

# 参数OPTIONS
# --name="new-name" 或者 --name new-name:为容器指定一个名称,该名称会在执行"docker ps"的时候显示出来
# -d:后台启动容器,并返回容器ID,即启动守护式容器
# -i:以交互式运行容器,通常与-t同时使用
# -t:为容器重新分配一个伪输入终端,通常与-i同时使用
# -P:随机端口映射
# -p:指定端口映射,有四种格式:ip:hostport:containerport、ip::containerport、hostport:containerport、containerport
# --privileged=true:使用该参数指定容器内的root拥有真正的root权限,false代表容器内的root只拥有外部宿主机的一个普通用户权限

Docker 容器的重启策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# --restart=no:表示当容器退出时不要自动重启,no是默认值
# --restart=always:表示不管容器以什么退出状态码退出,总是尝试重启容器
# --restart=on-failure:5:表示当容器以非0退出状态码退出时尝试重启容器,且最大尝试重启次数为5
# --restart=unless-stopped – 表示不管容器以什么退出状态码退出,总是尝试重启容器;不过当daemon启动时,如果发现容器之前已经处于退出状态,则不会尝试启动容器

# 设置容器重启策略为on-failure,且最大尝试重启次数为5
# docker run -it --restart=on-failure:5 --name="centos" centos /bin/bash

# 获取容器的重启次数
# docker inspect -f "{{ .RestartCount }}" centos
0

# 获取容器上一次重启的时间
# docker inspect -f "{{ .State.StartedAt }}" centos
2019-01-27T03:54:44.510836372Z

Docker 列出当前正在运行的容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 语法
# docker ps [OPTIONS]

# 显示当前正在运行的容器
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04c9fdf618f6 1e1148e4cc2c "/bin/bash" 5 minutes ago Up 4 minutes hardcore_leavitt

# 更改容器名称
# docker rename old_container_name new_container_name

# 参数OPTIONS
# -a:显示所有正在运行的容器,包括历史上运行过的
# -l:显示最近创建的容器
# -n:列出最近创建的n个容器,例如“-n 5”
# -s:显示总的文件大小
# -q:静默模式,只显示容器编号
# --no-trunc:不截断输出

Docker 断开与当前容器的连接

1
2
3
4
5
6
7
8
# 当以交互式启动容器时,容器停止,断开连接
# exit

# 当以交互式启动容器时,容器不停止,断开连接,使用以下组合快捷键
ctrl + p + q

# 当以后台方式启动容器时,直接断开连接即可,容器默认不会停止
# exit

Docker 在运行的容器中执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 语法,参数CONTAINER值可以是容器ID或者容器名称
# docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

# 在ID为1a3941b6ae8e的容器中,开启一个交互模式的伪输入终端
# docker exec -it 1a3941b6ae8e /bin/bash

# 在ID为1a3941b6ae8e的容器中,以交互模式执行容器内的/root/monitor.sh脚本
# docker exec -it 1a3941b6ae8e /bin/bash /root/monitor.sh

# 在ID为1a3941b6ae8e的容器中,执行查询系统时间的命令
# docker exec -t 1a3941b6ae8e date

# 参数OPTIONS
# -d:守护式运行,即在后台运行
# -i:以交互式运行容器,通常与-t同时使用
# -t:为容器重新分配一个伪输入终端,通常与-i同时使用

Docker 连接到正在运行的容器

1
2
3
4
5
6
7
8
9
10
11
# 语法,参数CONTAINER值可以是容器ID或者容器名称
# docker attach [OPTIONS] CONTAINER

# 连接到ID为1a3941b6ae8e的容器
# docker attach 1a3941b6ae8e

# 或者执行以下命令,在ID为1a3941b6ae8e的容器中,开启一个交互模式的伪输入终端(推荐此方式)
# docker exec -it 1a3941b6ae8e /bin/bash

# 参数OPTIONS
# --sig-proxy=false:确保CTRL-D或CTRL-C不会关闭容器

Docker 启动、重启、停止、强制停止容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 语法,参数CONTAINER值可以是容器ID或者容器名称
# docker start [OPTIONS] CONTAINER [CONTAINER...]
# docker restart [OPTIONS] CONTAINER [CONTAINER...]
# docker stop [OPTIONS] CONTAINER [CONTAINER...]
# docker kill [OPTIONS] CONTAINER [CONTAINER...]

# 启动ID为1a3941b6ae8e的容器
# docker start 1a3941b6ae8e

# 重启ID为1a3941b6ae8e的容器
# docker restart 1a3941b6ae8e

# 停止ID为1a3941b6ae8e的容器
# docker stop 1a3941b6ae8e

# 强制停止ID为1a3941b6ae8e的容器
# docker kill 1a3941b6ae8e

Docker 删除容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 语法,参数CONTAINER值可以是容器ID或者容器名称
# docker rm [OPTIONS] CONTAINER [CONTAINER...]

# 删除ID为1a3941b6ae8e的容器
# docker rm 1a3941b6ae8e

# 强制删除ID为1a3941b6ae8e的容器,即使容器正在运行
# docker rm -f 1a3941b6ae8e

# 批量删除容器,第一种写法
# docker rm $(docker ps -aq)

# 批量删除容器,第二种写法
# docker ps -aq | xargs docker rm

# 参数OPTIONS
# -f:通过SIGKILL信号强制删除一个运行中的容器
# -l:移除容器间的网络连接,而非容器本身
# -v:删除与容器关联的卷

Docker 显示容器内部的日志信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 语法,参数CONTAINER值可以是容器ID或者容器名称
# docker logs [OPTIONS] CONTAINER

# 显示ID为1a3941b6ae8e的容器的内部日志信息
# docker logs 1a3941b6ae8e

# 跟踪显示ID为1a3941b6ae8e的容器的内部日志信息
# docker logs -t -f --tail 5 1a3941b6ae8e

# 停止日志输出,使用以下组合快捷键
ctrl + c

# 参数OPTIONS
# -t:加入时间戳
# -f:跟踪最新的日志打印
# --since:显示某个开始时间的所有日志
# --until:显示某个结束时间之前的所有日志
# --tail:仅列出最新的N条日志,例如 --tail 5

Docker 显示容器内部运行的进程

1
2
3
4
5
# 语法,参数CONTAINER值可以是容器ID或者容器名称
# docker top CONTAINER [ps OPTIONS]

# 显示ID为1a3941b6ae8e的容器的内部进程
# docker top 1a3941b6ae8e

Docker 容器与宿主机互相拷贝文件

1
2
3
4
5
6
7
8
9
10
# 语法,参数CONTAINER值可以是容器ID或者容器名称
# docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
# docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

# 从ID为1a3941b6ae8e的容器中,拷贝文件/root/anaconda-ks.cfg到宿主机的/root目录下
# docker cp 1a3941b6ae8e:/root/anaconda-ks.cfg /root

# 将宿主机的/root/monitor.log文件,拷贝到ID为1a3941b6ae8e的容器的/root目录下
# docker cp /root/monitor.log 1a3941b6ae8e:/root

Docker 显示容器的内部细节

1
2
3
4
5
6
7
8
9
10
# 语法,参数CONTAINER值可以是容器ID或者容器名称
# docker inspect [OPTIONS] NAME|ID [NAME|ID...]

# 显示ID为1a3941b6ae8e的容器的内部细节
# docker inspect 1a3941b6ae8e

# 参数OPTIONS
# -f:指定返回值的模板文件
# -s:显示总的文件大小
# --type:返回指定类型的JSON

Docker 新建并启动 Tomcat 容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 下载最新的Tomcat镜像(可能基于Debian/Alpine/Centos、依赖OpenJDK)
# docker pull tomcat

# 前台方式新建并启动Tomcat容器,指定映射端口
# docker run -it -p 8888:8080 --name="tomcat8.5" tomcat

# 前台方式新建并启动Tomcat容器,随机映射端口
# docker run -it -P --name="tomcat8.5" tomcat

# 前台方式新建并启动Tomcat容器,可以使用快捷键断开连接,不停止Tomcat容器
ctrl + p + q

# 后台方式新建并启动Tomcat容器,指定映射端口
# docker run -d -p 8888:8080 --name="tomcat8.5" tomcat

# 后台方式新建并启动Tomcat容器,随机映射端口
# docker run -d -P --name="tomcat8.5" tomcat

# 无论前台还是后台方式启动Tomcat容器,都可以执行以下命令连接到Tomcat容器,进一步配置Tomcat服务器
# docker exec -it tomcat8.5 /bin/bash

Docker 提交容器副本,生成新的 Docker 镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 语法,参数CONTAINER值可以是容器ID或者容器名称
# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

# 提交容器副本作为一个新的镜像
# docker commit -a "peter@163.com" -m "first commit" 1a3941b6ae8e peter/mytomcat:8.5

# 查看刚创建的新镜像
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
peter/mytomcat 8.5 1ca4c9763049 16 seconds ago 475MB

# 参数OPTIONS
# -a:提交镜像的作者
# -c:使用Dockerfile指令来创建镜像
# -m:提交时的说明文字
# -p:在commit的时候暂停容器,默认选项

Docker 新建并后台启动容器的介绍

一. Docker 新建并后台启动容器(“docker run -d xxxx”),然后通过命令”docker ps -a” 进行查看,会发现容器已经退出;这里必须注意的是,Docker 容器后台启动之后,就必须有一个前台进程。容器启动的命令,如果不是那些一直挂器起的命令(top、tail),默认就是会自动停止。

二。以 Nginx 为例,正常情况下配置启动服务只需要启动相应的 Service 即可,例如执行命令”systemctl start nginx”。但是这样做,Nginx 如果以后台进程模式运行,会导致 Docker 前台没有运行的应用;这样的容器在后台启动后,会立即自杀,因为容器觉得自身没事可做了;这一点与 Supervistor 配置程序后台运行很相似。所以,最佳的解决方案是将需要运行的程序以前台进程的形式运行。

三。实践操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 新建并后台启动centos容器,并在前台执行指定的shell脚本
# docker run -d centos /bin/sh -c "while true;do echo hello docker;sleep 2;done"
1a3941b6ae8e

# 显示当前正在运行的容器,发现刚才以后台方式启动的容器不会再自动停止
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a3941b6ae8e centos "/bin/sh -c 'while t…" 11 minutes ago Up 11 minutes infallible_haslett

# 跟踪显示ID为1a3941b6ae8e的容器的内部日志信息
# docker logs -f -t --tail 5 1a3941b6ae8e
2018-12-24T19:06:07.180718501Z hello docker
2018-12-24T19:06:09.185193606Z hello docker
2018-12-24T19:06:11.189919184Z hello docker
2018-12-24T19:06:13.193004892Z hello docker
2018-12-24T19:06:15.196940992Z hello docker

Docker 常用命令图解

docker-commands-diagram