docker容器管理

容器生命周期

容器管理 docker container

启动容器 run

每次 run,都会启动一个新的容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# docker run [选项] [镜像名] [shell命令] [参数]
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]

COMMAND:一次性运行容器中命令
OPTIONS:
-i, --interactive Keep STDIN open even if not attached,通常和-t 一起使用
-t, --tty 分配 pseudo-TTY,通常和-i 一起使用,注意对应的容器必须运行 shell 才支持进入
-d, --detach 后台运行容器,并返回容器 ID,默认前台运行
--name string 启动容器时会自动随机字符作为容器名,--name 指定容器名称
-h string 设置虚拟机内的 hostname
--rm 退出后立即删除容器,一次性运行,下次从镜像中启动
-p, --publish list (小写p)暴露指定端口映射,为避免宿主机端口冲突,要做好端口规划
-P, --publish-all (大些P)暴露所有端口,随机,默认从 32768 开始
--dns list Set custom DNS servers
--entrypoint string Overwrite the default ENTRYPOINT of the image
--privileged 赋予虚拟机内的 root 真正的 root 权限,有权限宿主机,没有特殊需求不要使用
-e=[] 传递环境变量
--env-file=[] 传递环境变量,文件
--restart string 容器的重启策略,面向生产环境的启动策略
no # 默认策略,容器退出时不重启容器
on-failure # 容器非正常退出时(退出状态非 0),才会重启容器
on-failure:3 # 容器非正常退出时重启容器,最多重启 3 次
always # 容器退出时总是重启容器,设置为 always,则启动 docker 服务的时候会自动启动容器
unless-stopped # 容器退出时总是重启容器,但是不考虑在 docker 守护进程启动时就已经停止了的容器
-v,--volume list 数据卷相关

注意:容器启动后,如果容器内没有前台运行的进程,将自动退出停止

退出容器:exit 容器停止;ctrl+p+q 容器不停止

查看容器信息

查看当前存在的容器 ls
1
2
3
4
5
6
7
8
9
10
docker ps [OPTIONS]
docker container ls [OPTIONS]

选项:
-a, --all 查看所所有容器,包括退出状态的容器(默认只显示处于运行状态的容器)
-q, --quiet Only display numeric IDs
-s, --size 显示容器大小
-f, --filter 过滤,例如 `-f status=exited`
-l, --latest 显示最新创建的容器
-n, --last int Show n last created containers (includes all states)(default -1)
查看容器内的进程 top
1
docker container top CONTAINER [ps OPTIONS]
查看容器资源使用情况 stats
1
2
3
4
5
6
7
8
# docker container stats --help
Usage: docker container stats [OPTIONS] [CONTAINER...]

Options:
-a, --all Show all containers (default shows just running)
--format string Pretty-print images using a Go template
--no-stream Disable streaming stats and only pull the first result
--no-trunc Do not truncate output
查看容器的详细信息 inspect
1
2
3
4
5
6
# docker container inspect --help
Usage: docker container inspect [OPTIONS] CONTAINER [CONTAINER...]

Options:
-f, --format string Format the output using the given Go template
-s, --size Display total file sizes

范例:

1
2
3
docker inspect 9997
docker inspect -f "{{.Metadata}}" test:v1.0 # 选择性查看
docker inspect -f "{{.Created}}" c1

删除容器 rmprune

rmprune 都是删除容器。rm 是强制删除,即使容器处于运行状态;prune 只删除停止的容器。

1
2
3
4
5
6
7
# docker container rm --help
Usage: docker container rm [OPTIONS] CONTAINER [CONTAINER...]

Options:
-f, --force Force the removal of a running container (uses SIGKILL)
-l, --link Remove the specified link
-v, --volumes 同时删除数据卷
1
2
3
4
5
6
# docker container prune --help
Usage: docker container prune [OPTIONS]

Options:
--filter filter Provide filter values (e.g. 'until=<timestamp>')
-f, --force 不提示确认信息

范例:删除指定状态的容器

1
docker rm `docker ps -qf status=exited`
1
alias rmc='docker container ls -aq | xargs -n1 docker container rm -f'

容器的启动和停止

1
docker start|stop|restart|pause|unpause 容器ID
  • start:启动容器,后台启动,并执行默认 COMMAND
  • stop:关闭容器
  • restart:重启容器
  • pause:暂停容器中的所有进程
  • unpause:恢复容器中的进程

给正在运行的容器发信号 kill

默认信号 SIGKILL,即 9 信号

1
2
3
4
5
# docker container kill --help
Usage: docker container kill [OPTIONS] CONTAINER [CONTAINER...]

Options:
-s, --signal string Signal to send to the container (default "KILL")

进入正在运行的容器 exec

run -it 是新建容器,并进入,如果要进入正在运行的容器,推荐使用 exec,exit 退出的时候容器不停止。

此外 attach 也可以进入容器,但是 exit 退出后容器会自动关闭,所以不推荐使用。

exec 的作用是在运行的容器中执行命令

1
2
3
4
5
6
7
8
9
10
11
12
# docker container exec --help
Usage: docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]

Options:
-d, --detach Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching a container
-e, --env list Set environment variables
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format: <name|uid>[:<group|gid>])
-w, --workdir string Working directory inside the containe

常见用法:

1
2
#常见用法
docker exec -it 容器ID sh|bash # 进入容器,且exit退出但容器不停止

暴露端口

端口映射的本质就是利用 NAT 技术实现的

暴露所有端口,随机:大写 P

1
docker container run -P

暴露指定端口:小写 p

1
2
3
4
5
6
7
8
9
10
docker container run -p

# 范例
docker run -p 80 --name nginx-test-port1 nginx # 容器80映射到宿主机随机端口
docker run -p 81:80 --name nginx-test-port2 nginx # 容器80端口映射到宿主机本地端口81
docker run -p 10.0.0.100:82:80 --name nginx-test-port3 docker.io/nginx # 指定宿主机ip
docker run -p 10.0.0.100::80 --name nginx-test-port4 docker.io/nginx
docker run -p 10.0.0.100:83:80/udp --name nginx-test-port5 docker.io/nginx #指定udp,默认tcp
# 一次性映射多个端口+协议
docker run -p 8080:80/tcp -p 8443:443/tcp -p 53:53/udp --name nginx-test-port6 nginx

查看容器日志 logs

查看容器中运行的进程在控制台输出的日志信息,如果容器中的进程不在控制台输出日志,那就没办法了,所以这种方法一般不用

1
2
3
4
5
6
7
8
9
10
# docker container logs --help
Usage: docker container logs [OPTIONS] CONTAINER

Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
--tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)

传递运行命令

docker run xxx启动容器,如果 xxx 容器中没有常驻前台的进程,xxx 会认为没什么任务,在启动后马上退出,有的服务支持前台运行,有的不支持,如果服务不支持前台运行,我们可以启动一个常驻前台的进程,阻止容器推出,常用的方式是让容器运行tail -f /etc/hosts命令,注意不要监听频繁更改的文件,避免产生不必要的磁盘 IO

范例:

1
2
3
4
5
6
# nginx前台运行,直接后台启动即可
docker container run -d nginx:1120
# alpine没有常驻前台的进程,以下两种方式均可
# 在容器内执行`/bin/sh`,然后把容器放到宿主机后台,sh是交互式命令,所以也有常驻前台的效果
docker container run -itd alpine
docker run -d alpine 'tail -f /etc/hosts'

指定容器 DNS

默认采用宿主机的 dns 地址,可以在 run 启动容器时指定

范例:

1
2
3
4
5
root@Z510:~# docker container run -it --dns 1.1.1.1 --dns 8.8.8.8 alpine:1119
/ # cat /etc/resolv.conf
search magedu.com
nameserver 1.1.1.1
nameserver 8.8.8.8

容器内和宿主机之间复制文件 cp

1
2
3
4
5
6
7
# docker container cp --help
Usage: docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker container cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

Options:
-a, --archive Archive mode (copy all uid/gid information)
-L, --follow-link Always follow symbol link in SRC_PATH

使用 systemd 控制容器运行

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# /lib/systemd/system/hello.service
[Unit]
Description=Hello World
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox-hello
ExecStartPre=-/usr/bin/docker rm busybox-hello
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox-hello busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/usr/bin/docker kill busybox-hello
[Install]
WantedBy=multi-user.target

传递环境变量

docker container -edocker container --env-file

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
docker run \
-d \
--name mysql-test1 \
-v /data/mysql:/var/lib/mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=123456 \
mysql:5.7.30

# 或
docker run \
-d \
--name mysql-test2 \
-v /root/mysql/:/etc/mysql/conf.d \
-v /data/mysql2:/var/lib/mysql \
-p 3307:3306 \
--env-file=env.list \
mysql:5.7.30

cat env.list
MYSQL_ROOT_PASSWORD=123456
MYSQL_DATABASE=wordpress
MYSQL_USER=wpuser
MYSQL_PASSWORD=wppass