【Docker】容器
一.容器(container)
1.概念
通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态。
虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本。
2.容器生命周期
容器的生命周期是容器可能处于的状态:
created | 初建状态 |
running | 运行状态 |
stopped | 停止状态 |
paused | 暂停状态 |
deleted | 删除状态 |
docker create | 创建容器后,不立即启动运行,容器进入初建状态 |
docker run | 创建容器,并立即启动运行,进入运行状态 |
docker start | 容器转为运行状态 |
docker stop | 容器将转入停止状态 |
docker kill | 容器在故障(死机)时,执行 kill(断电),容器转入停止状态,这种操作容易丢失数据,除非必要,否则不建议使用 |
docker restart | 重启容器,容器转入运行状态 |
docker pause | 容器进入暂停状态 |
docker unpause | 取消暂停状态,容器进入运行状态 |
docker rm | 删除容器,容器转入删除状态 |
killed by out-of-memory(因内存不足被终止) | 宿主机内存被耗尽,也被称为 OOM:非计划终止 这时需要杀死最吃内存的容器 |
container process exitde(异常终止) | 出现容器被终止后,将进入 Should restart?选择操作: yes 需要重启,容器执行 start 命令,转为运行状态。 no 不需要重启,容器转为停止状态 |
二.容器命令
1)docker create
创建一个新的容器但不启动它。
语法:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
关键参数:
-i | 以交互模式运行容器,通常与 -t 同时使用 |
-P | 随机端口映射,容器内部端口随机映射到主机的端口 |
-p | 指定端口映射,格式为:主机(宿主)端口:容器端口 |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用 |
--name="容器名" | 为容器指定一个名称 |
-h "mars" | 指定容器的 hostname |
-e username="ritchie" | 设置环境变量 |
--cpuset-cpus="0-2" or --cpuset-cpus="0,1,2" | 绑定容器到指定 CPU 运行 |
-m | 设置容器使用内存最大值 |
--network="bridge" | 指定容器的网络连接类型 |
--link=[] | 添加链接到另一个容器 |
--volume,-v | 绑定一个卷 |
--rm :shell | 退出的时候自动删除容器 |
--restart | 自动重启 |
2)docker run
创建一个新的容器并运行一个命令。
语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
关键参数,上面create命令的参数都有,只是多了下面的参数:
-d | 后台运行容器,并返回容器 ID |
-rm | 容器停止后自动删除 |
-e | 设置系统变量 |
3)docker ps
列出容器。
语法:
docker ps [OPTIONS]
关键参数:
-a | 显示所有的容器,包括未运行的 |
-f | 根据条件过滤显示的内容 |
--format | 指定返回值的模板文件。如 json 或者 table |
-l | 显示 latest 的容器 |
-n | 列出最近创建的 n 个容器 |
--no-trunc | 不截断输出 |
-q | 静默模式,只显示容器编号 |
-s | 显示总的文件大小 |
4)docker logs
查看容器日志。
语法:
docker logs [OPTIONS] CONTAINER
关键参数:
-f ,--follow | 跟踪日志输出 |
--since | 显示某个开始时间的所有日志 |
-t,--timestamps | 显示时间戳 |
-n,--tail | 仅列出最新 N 条容器日志 |
5)docker attach
连接到正在运行中的容器。
语法:
docker attach [OPTIONS] CONTAINER
关键参数:
--sig-proxy | 是否将所有信号代理,默认是 true,如果设置为 false,退出的话不会影响容器,否则退出会导致容器退出 |
6)docker exec
在容器中执行命令。
语法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
关键参数:
-d | 分离模式: 在后台运行 |
-i | 即使没有附加也保持 STDIN 打开 |
-t | 分配一个伪终端 |
-e | 设置环境变量 |
-u,--user | 指定用户 "<name|uid>[:<group|gid>]" |
-w,--workdir | 指定工作目录 |
7)docker start
启动停止的容器。
语法:
docker start [OPTIONS] CONTAINER [CONTAINER...]
8)docker stop
停止运行的容器。
语法:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
关键参数:
-s | 发送的信号 |
9)docker restart
重启容器。
语法:
docker restart [OPTIONS] CONTAINER [CONTAINER...]
关键参数:
-s | 发送的信号 |
10)docker kill
强制退出容器。
语法:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
关键参数:
-s | 发送的信号 |
11)docker top
查看容器中运行的进程信息,支持ps命令参数
语法:
docker top CONTAINER [ps OPTIONS]
12)docker stats
显示容器资源的使用情况,包括:CPU、内存、网络 I/O等。
语法:
docker stats [OPTIONS] [CONTAINER...]
关键参数:
--all ,-a | 显示所有的容器,包括未运行的 |
--format | 指定返回值的模板文件。如 table,json |
--no-stream | 展示当前状态就直接退出了,不再实时更新 |
--no-trunc | 不截断输出 |
返回报文:
CONTAINER ID 与 NAME | 容器 ID 与名称 |
CPU % 与 MEM % | 容器使用的 CPU 和内存的百分比 |
MEM USAGE / LIMIT | 容器正在使用的总内存,以及允许使用的内存总量 |
NET I/O | 容器通过其网络接口发送和接收的数据量 |
BLOCK I/O | 容器从主机上的块设备读取和写入的数据量 |
PIDs | 容器创建的进程或线程数 |
13)docker container inspect
查看容器详细信息。
语法:
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
关键参数:
-f | 指定返回值的模板文件。如 table、json |
-s | 显示总的文件大小 |
14)docker port
用于列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。
语法:
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
15)docker cp
在容器和宿主机之间拷贝文件。
语法:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] 容器名或ID:容器内文件路径 宿主机目标路径|-docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
docker cp [OPTIONS] 宿主机源文件路径|- 容器名或ID:容器内目标路径
16)docker diff
检查容器里文件结构的更改。
语法:
docker diff CONTAINER
17)docker commit
从容器创建要给新的镜像。
语法:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
关键参数:
-a | 提交的镜像作者 |
-c | 使用 Dockerfile 指令来创建镜像;可以修改启动指令 |
-m | 提交时的说明文字 |
-p | 在 commit 时,将容器暂停 |
18)docker pause
暂停容器中所有的进程。
语法:
docker pause CONTAINER [CONTAINER...]
细节半圆:
19)docker unpause
恢复容器中所有的进程。
语法:
docker unpause CONTAINER [CONTAINER...]
20)docker rm
删除停止的容器。
语法:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
关键参数:
-f | 通过 SIGKILL 信号强制删除一个运行中的容器 |
21)docker export
导出容器内容为tar文件。
语法:
docker export [OPTIONS] CONTAINER
关键参数:
-o | 写入到文件 |
22)docker wait
阻塞运行直到容器停止,然后打印出它的退出代码。
语法:
docker wait CONTAINER [CONTAINER...]
23)docker rename
重命名容器。
语法:
docker rename CONTAINER NEW_NAME
24)docker container prune
删除所有停止的容器。
语法:
docker container prune [OPTIONS]
关键参数:
-f, --force | 不提示是否进行确认 |
25)docker update
更新容器配置。
语法:
docker update [OPTIONS] CONTAINER [CONTAINER...]
关键参数:
--cpus | cpu 数量 |
--cpuset-cpus | 使用哪些 cpu |
--memory | 内存限制 |
--memory-swap | 交换内存 |
--cpu-period | 是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配 |
--cpu-quota | 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器 |
三.操作实例
1.批量处理
命令 | 解释 |
docker container ls -qf name=xxx | 根据名称过滤得到容器编号 |
docker container ls --filter status=running | 根据状态过滤容器信息 |
docker container ls -aq | 静默获取全部容器 id |
docker container ls --filter ancestor=xxx | 过滤镜像名为 xxx 的容器信息 |
docker container ls --filter ancestor=xxx | 过滤镜像 id 为 xxx 的容器信息 |
参数:
-a | 表示打印所有的容器信息,包括正在运行和已退出的 |
-q | 表示只返回容器ID |
-f | 表示基于给的条件过滤 等价于 --filter选项 |
1)批量删除容器
docker container rm $(docker container ls -aq)
2)按照状态过滤删除已经退出的容器
docker container rm $(docker container ls -q --f status=exited)
2.容器交互模式
1)attached 模式
docker container run -p 80:80 nginx
通过上面是方式创建容器就是 attached 模式,这样容器会在前台运行。
访问服务器网址的时候,每访问一次,命令窗口就会打印一次日志,Docker 容器
的日志会实时的展现到窗口并且占用此端口。
如果是在 Linux 服务器上,按 Ctrl+C 就会停止掉 Docker 服务,很容易误操作,
所以我们需要一个更好的,更稳定的模式,对应的是 detached 模式
attached 模式仅适用于容器和程序的调试阶段。
2)detached 模式
在 docker container run -p 80:80 nginx 命令基础上加一个-d 或者--detach选项表示 detached 模式, 即在后台执行。
在后台运行,启动后只显示容器 ID,并且可以输入任何命令。
就算关掉窗口依然继续运行,停止和删除容器都需要使用 shell 命令,减少了很多的误操作。
比起 attached 模式更建议使用。
3)interactive 模式
当我们创建好一个容器之后, 可能需要去容器内部获取一些信息或执行一些命令,就需要进入到交互式模式。例如创建一个 Ubuntu 容器之后,需要到系统里输入各种 Shell 命令和系统进行交互就需要进入交互式模式才可以完成。
docker run -it --name nginx -p 80:80 41f689c20910 bashdocker run -d --name nginx -p 80:80 41f689c20910
docker exec -it nginx bash
3.容器自启动
docker run --restart=no [容器名] | 默认值不自动重启 |
docker run --restart=on-failure:3 [容器名] | on-failure 若容器的退出状态非 0,则 docker 自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃 |
docker run --restart=always [容器名] | always 容器退出时总是重启 |
docker run --restart=unless-stopped [容器名] | unless-stopped 容器退出时总是重启,但不考虑 Docker 守护进程启动时就已经停止的容器 |
如果容器启动时没有设置–restart 参数,则通过下面命令进行更新:docker update --restart=always [容器名] 。