"在哪里走散,你都会找到我~"
Docker 容器
什么是容器?
通俗来讲,容器是镜像运行的实体。我们对于镜像的认知是,“存储在磁盘上的只读文件”。当我们启动一个容器的本质,就是启动一个进程,即容器运行着真正的应用进程。
它具有容器有初建、运行、停止、暂停和删除五种状态。
虽然容器的本质是一个进程。但是容器有自己的命名空间隔离和资源限制。也就是说,在容器内部,无法看到宿主机上的进程、环境变量、网络等信息。这是容器与直接运行在主机上进程的本质区别。
容器的运行机制:
容器是基于镜像创建的可运行实例,并且单独存在。一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本。
为什么需要容器?
镜像是静态的文件,并不能提供服务,所以我们需要一个容器,作为镜像提供服务的实体。至于容器还能带来哪些收益,可以参考这篇文章: 容器化与虚拟化
容器的生命周期
容器的本质就是一个进程,所以这里谈及的生命周期与进程的生命周期类似:
created:初建状态 running:运行状态 stopped:停止状态
paused:暂停状态 deleted:删除状态
各生命周期之间的转换关系如图所示:
其中红标方框都会出现在下面容器命令清单中,这里就不做多的解释。只来谈谈其中几个容器异常退出情况:
🧶 容器OOM
Docker在处理OOM事件时,会分三种情况:
🧶 容器异常退出
每个容器内部都存在一个 Init 进程,容器中其他所有进程都是此进程的子进程。当 Init 进程退出时,也就代表着此容器被关闭。
🧶 容器暂停
Docker“剥夺”了此容器的 CPU 资源。失去了 CPU 资源的进程,是不会被主机内核系统所调度的。所以此容器就处于“冰封”状态。
Docker容器命令清单
命令
|
别名
|
功能
|
docker create | docker container create | 创建容器 |
docker run | docker container run | 运行容器 |
docker attach | docker container attach | 连接到正在运行中的容器 |
docker commit | docker container commit | 将镜像提交为容器 |
docker cp | docker container cp | 在容器和宿主机之间拷贝 |
docker diff | docker container diff | 检查容器里文件结构更改 |
docker exec | docker container exec | 在运行的容器中执行命令 |
docker export | docker container export | 将容器导出为tar |
docker container inspect |
查看容器详细信息
| |
docker kill | docker container kill |
杀死容器
|
docker logs | docker container logs |
查看日志
|
docker ps | docker container ls, docker container list, docker container ps |
查看正在运行的进程
|
docker pause | docker container pause |
暂停进程
|
docker port | docker container pause |
查看容器的端口映射
|
docker container prune |
删除停止的容器
| |
docker rename | docker container rename |
重命名容器
|
docker restart | docker container restart |
重启容器
|
docker rm | docker container rm, docker container remove |
删除容器
|
docker start | docker container start |
启动容器
|
docker stats | docker container stats |
查看资源占用信息
|
docker stop | docker container stop |
停止容器
|
docker top | docker container top |
查看某个容器的资源占用
|
docker unpause | docker container unpause |
继续运行容器
|
docker update | docker container update |
更新容器配置
|
docker wait | docker container wait |
阻止一个或多个容器停
|
容器状态:
🔮 docker create
# 创建一个新的容器但不启动它
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS:
○ -i: 以交互模式运行容器,通常与 -t 同时使用
○ -P: 随机端口映射,容器内部端口随机映射到主机的端口
○ -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
○ -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
○ --name="nginx-lb": 为容器指定一个名称;
○ -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:自动重启
在很多时候,都会在启动容器这一步设置是否在容器出现异常关闭时,自动重启选项。
🔮 docker run
# 创建一个新的容器并运行一个命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS:
○ -d: 后台运行容器,并返回容器 ID;比 create 多了这个参数
○ -i: 以交互模式运行容器,通常与 -t 同时使用;
○ -P: 随机端口映射,容器内部端口随机映射到主机的端口
○ -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
○ -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
○ --name="nginx-lb": 为容器指定一个名称;
○ -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:自动重启
🔮 docker start
# 启动停止的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
🔮 docker stop
# 停止运行的容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS:
○ -s :发送的信号
🔮 docker restart
# 重启容器
docker restart [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS:
○ -s :发送信号
🔮 docker kill
# 强制退出容器
docker kill [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS:
○ -s :发送的信号
🔮 docker pause
# 暂停容器中所有的进程
docker pause CONTAINER [CONTAINER...]
# 恢复容器中所有的进程
docker unpause CONTAINER [CONTAINER...]
🔮 docker rm
# 删除停止的容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
🔮 docker container prune
# 删除所有停止的容器
docker container prune [OPTIONS]
OPTIONS:
○ -f, --force:不提示是否进行确认
容器信息:
⌛ docker ps
# 列出容器
docker ps [OPTIONS]
OPTIONS:
○ -a :显示所有的容器,包括未运行的。
○ -f :根据条件过滤显示的内容。
○ --format :指定返回值的模板文件。如 json 或者 table
○ -l :显示 latest 的容器。
○ -n :列出最近创建的 n 个容器。
○ --no-trunc :不截断输出。
比特就业课
○ -q :静默模式,只显示容器编号。
○ -s :显示总的文件大小。
⌛ docker logs
# 查看容器日志
docker logs [OPTIONS] CONTAINER
OPTIONS:
○ -f ,--follow: 跟踪日志输出
○ --since :显示某个开始时间的所有日志
○ -t,--timestamps : 显示时间戳
○ -n,--tail :仅列出最新 N 条容器日志
⌛ docker top
# 查看容器中运行的进程信息,支持 ps 命令参数
docker top CONTAINER [ps OPTIONS]
注:容器运行时不一定有/bin/bash 终端来交互执行 top 命令,而且容器还不一定有
top 命令,可以使用 docker top 来实现查看 container 中正在运行的进程
⌛ docker stats
# 显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等
docker stats [OPTIONS] [CONTAINER...]
OPTIONS:
○ --all , -a :显示所有的容器,包括未运行的
○ --format :指定返回值的模板文件。如 table,json
○ --no-stream :展示当前状态就直接退出了,不再实时更新
○ --no-trunc :不截断输出
⌛ docker container inspect
# 查看容器详细信息
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS:
○ -f :指定返回值的模板文件。如 table、json
○ -s :显示总的文件大小
⌛ docker port
# 用于列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
其他命令:
⛳ docker attach
# 连接到正在运行中的容器
docker attach [OPTIONS] CONTAINER
OPTIONS:
○ --sig-proxy:是否将所有信号代理,默认是 true,如果设置为 false,退出的
话不会影响容器,否则退出会导致容器退出。
⛳ docker exec
在容器中执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS:
○ -d :分离模式: 在后台运行
○ -i :即使没有附加也保持 STDIN 打开
○ -t :分配一个伪终端
○ -e :设置环境变量
○ -u,--user :指定用户 "<name|uid>[:<group|gid>]"
○ -w,--workdir:指定工作目录
⛳ docker cp
# 在容器和宿主机之间拷贝文件
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
⛳ docker diff
# 检查容器里文件结构的更改
docker diff CONTAINER
⛳ docker commit
# 从容器创建一个新的镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS:
○ -a :提交的镜像作者
○ -c :使用 Dockerfile 指令来创建镜像;可以修改启动指令
○ -m :提交时的说明文字
○ -p :在 commit 时,将容器暂停
⛳ docker export
# 导出容器内容为 tar 文件
docker export [OPTIONS] CONTAINER
OPTIONS:
○ -o:写入到文件
⛳ docker wait
# 阻塞运行直到容器停止,然后打印出它的退出代码
docker wait CONTAINER [CONTAINER...]
⛳ docker rename
# 重命名容器
docker rename CONTAINER NEW_NAME
⛳ docker update
# 更新容器配置
docker update [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS:
○ --cpus:cpu 数量
○ --cpuset-cpus :使用哪些 cpu
○ --memory :内存限制
○ --memory-swap:交换内存
○ --cpu-period :是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配
○ --cpu-quota:是用来指定在这个周期内,最多可以有多少时间用来跑这个容器
容器操作案例
我们现在已经了解到了操作容器的命令,现在我们来使用使用,熟能生巧。
容器生命周期
(1) 通过 nginx 镜像文件创建容器
(2) 容器的列举
我们可以查看新拉取下来,正在 running的容器nginx:
(3) 停止当前正在运行的容器
容器被暂停:
(4) 容器的列举(包含正在运行和退出的容器)
(5) 容器的删除
查看当前容器列表 可以发现 fee20ff860cd 该容器已经被删除。
容器状态更迭
(1) 首先我们创建容器
(2) 通过 docker start 启动容器
(3) 通过 docker stop 可以停止容器
(4) 再次启动容器,然后 kill 容器
(5) 启动容器,然后暂停容器+恢复
(6) 通过 docker rm 可以删除容器
容器批量处理技巧
命令 | 解释 |
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 选项
注:任意容器的ancestor就是它的镜像文件
批量删除容器:
我们现在启动一批容器:
按找以往,我们只是批量 使用 docker rm + ID,这样的效率实在太低。因此,我们可以借助传参的方式批量化删除。
按照状态过滤删除已经退出的容器:
我们查看当前容器,会存在正在运行的和已经陷入 “冰封“状态的。
按照状态过滤删除已经退出的容器:
容器交互模式
🪁 attached 模式
在attached模式下容器会在前台运行。
例如:
docker run -p 80:80 nginx:latest
# -p 80:80 表示端口映射
访问服务器网址的时候,每访问一次,命令窗口就会打印一次日志,Docker 容器 的日志会实时的展现到窗口并且占用此端口:
一旦我们在控制台按下组合键”ctrl + C“,就会发生终止:
因此,在生产线上需要更稳定的模式,attached 模式仅适用于容器和程序的调试阶段
🪁 detached 模式
我们只需要在启动时,添加参数 "--detach"。
docker run -p 80:80 --detach(-d) nginx:latest
在后台运行,启动后只显示容器 ID,并且可以输入任何命令,就算关掉窗口依然继续运行,停止和删除容器都需要使用 shell 命令,减少了很多的误操作。
我们可以使用docker log用来查看容器内部的日志信息:
docker container logs [bb03f5b320f7]
🪁 interactive 模式
当我们创建好一个容器之后, 可能需要去容器内部获取一些信息或执行一些命令,就需要进入到交互式模式。进入交互式模式有两种方式
(1) 创建运行容器并进入到交互模式:
docker run -it nginx:latest sh
就算此时,你使用”Ctrl +C“也不能退出这个交互模式,只能使用”exit“退出容器。
(2) 针对一个已经运行的容器里进入到交互模式
docker container exec -it nginx:latest sh(bash)
此时,即便我们使用”exit“,运行的容器不会受影响。
容器与宿主机内容复制
我们启动一个nginx服务,想修改它的首页信息:
我们切换到交互模式,想去这个容器内部修改首页文件。
可是,我们发现容器内没有配备vim编辑器,所以我们的想法是,将这个文件拿到宿主机来,宿主机可有vim。
将修改号的文件,拷贝回去:
完成后,我们再打开nginx首页,就会发现修改痕迹:
容器自动删除
启动一个 nginx,我们指定--rm 选项
docker run --name mysite -d --rm -p 80:80 nginx:1.22.1
--rm:当容器退出时,自动删除
容器自动重启
容器环境变量设置
例如: 启动一个 nginx 容器,配置环境变量,TEST=1
docker run -d --name website3 -p 8080:80 -e TEST=1 nginx:1.24.0
容器详情查看
我们可以查看一个容器的详细信息,比如我们可以查看所有设置的环境变量:
docker container inspect [container]
容器执行单行命令
我们可以直接借助 docker 的容器环境执行一些命令,比如容器中有某个命令而宿主机上没有这个时候借助容器可以完成某些任务。
docker run --rm -p 8011:80 nginx:1.23.0 echo "hello bit"
容器日志查看
docker container logs bb03f5b320f7 -n 5
当参数带上-f时,就会变成动态查看日志信息;
容器资源查看
我们可以通过 docker top 查看容器中有哪些进程,添加 aux,可以看到占用的内存和 CPU信息
通过 docker stats 可以看到资源的实时占用变化
本篇到此结束,感谢你的阅读
祝你好运,向阳而生~