什么是容器?
简单的讲,容器就是镜像的运行实体。
容器是一个轻量级、可移植的软件单元,它包含了运行应用程序所需的所有依赖项。这些容器是基于镜像创建的,而镜像则是静态的只读文件,包含了应用程序的代码、运行时环境、系统库等。容器在运行时会带有可写文件层,并且容器中的进程处于运行状态。
关键特性:
- 隔离性:Docker通过命名空间(NameSpace)和 控制组(cgroups)等技术实现了进程、网络、文件系统等的隔离。这使得容器中的应用程序与主机系统以及其他容器相互独立,互不干扰。
- 可移植性:Docker容器可以在不同的Docker主机上轻松移动,无需改变密码和重新部署配置。这极大提高了应用程序的灵活性和拓展性。
- 一致性:Docker容器确保了应用程序在开发、测试和生产环境中始终如一地运行。这有助于减少因环境差异而导致的错误和问题。
- 资源效率:与虚拟机相比,Docker容器更加轻量级,消耗更少的内存和CPU资源。这使得它更适合于大规模部署和密集计算场景。
- 自动化:Docker提供了丰富的工具和命令,可以自动化构建、部署和管理容器。这提高了开发和运维的效率,降低了运营成本。
Docker的生命周期
Docker的生命周期,是指从创建到销毁的整个过程。
1.已创建(Created)
- 状态说明:容器已经被创建,但尚未启动。此时,容器内的进程还没有运行,但已经分配了唯一的ID,并配置了网络设置和挂载点等。
- 相关命令:使用
docker create
命令可以创建一个新容器,但不启动它。
2.运行中(Running)
- 状态说明:容器已经启动,并且容器内的主进程正在运行。此时,容器可以接收并处理外部请求,执行其设计的任务。
- 相关命令:使用
docker start
命令可以启动一个已经创建的容器;使用docker run
命令可以创建并启动一个新容器,这是docker create
和docker start
的组合。
3.停止(Stopped)
- 状态说明:容器已经停止运行,但容器本身仍然存在,可以被重新启动或删除。停止容器时,Docker会向容器发送SIGTERM信号,等待一段时间让容器优雅关闭。如果容器未能在指定时间内停止,Docker会发送SIGKILL信号强制终止。
- 相关命令:使用
docker stop
命令可以停止一个运行中的容器。
4.暂停中(Paused)
- 状态说明:容器已经被暂停,所有进程都被停止,但容器的状态和数据依然保留在内存中。暂停容器可以保留容器的当前状态,同时释放部分资源。
- 相关命令:使用
docker pause
命令可以暂停一个运行中的容器;使用docker unpause
命令可以恢复被暂停的容器。
5.删除(Deleted)
- 状态说明:容器已经被彻底删除,包括其状态、数据以及所有相关信息。删除容器后,无法再恢复或访问该容器。
- 相关命令:使用
docker rm
命令可以删除一个已经停止的容器。如果尝试删除一个运行中的容器,会收到错误提示。需要先停止容器,才能删除它。另外,使用docker container prune
命令可以删除所有停止的容器。
容器OOM
容器OOM,即容器出现Out of Memory(内存溢出)错误,是一个在使用Docker等容器技术时可能遇到的问题。
当容器尝试使用的内存超出了系统或容器本身可用的内存限制时,就会触发OOM错误。这通常会导致容器被系统强制终止,从而影响应用程序的正常运行。
OOM出错的原因:
- 容器内存限制不足:在创建容器时,如果没有为容器分配足够的内存,或者容器在运行过程中申请的内存超过了其限制,就会触发OOM错误。
- 应用程序内存泄漏:如果容器内运行的应用程序存在内存泄漏,即应用程序在运行过程中未能正确释放不再使用的内存,那么随着时间的推移,应用程序的内存占用会逐渐增加,最终导致OOM错误。
- 应用程序负载过高:当应用程序的负载过高时,可能会在短时间内消耗大量内存,从而触发OOM错误。
常见使用命令
docker create
创建一个新的容器但不启动它;
docker create [OPTIONS] IMAGE [COMMAND][ARG...]
参数描述-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绑定一个卷–rmshell 退出的时候自动删除容器–restart自动重启
例子:
创建一个mynginx1容器:
docker create --name mynginx1 nginx:1.23.4
可以看到状态是创建的状态:
docker ps -a | grep mynginx
docker logs
查看容器日志
docker logs [OPTIONS] CONTAINER
关键参数描述–details显示提供给日志的额外详细信息-f, --follow遵循日志输出–since显示某个时间开始的时间日志-n, --tail all从日志末尾开始显示的行数-t, --timestamps显示时间戳
例子:
运行一个端口映射8081的nginx:
docker run --name mynginx3 -p 8081:80-d nginx:1.23.4
日志追踪:
docker logs -f mynginx3
通过客户端访问:
可以收到http请求操作信息:
docker attach
连接到正在运行中的容器。
docker attach [OPTIONS] CONTAINER
参数:
–sig-proxy:是否将所有信号代理,默认是 true,如果设置为 false,退出的
话不会影响容器,否则退出会导致容器退出。
例子:
先运行一个容器:
docker start mynginx3
连接上一个正在运行的容器:
docker attach mynginx3
按住ctrl+c 退出,会把容器也退出:
如果使用关键参数去连接已经运行的容器:
docker attach --sig-proxy=false mynginx3
按住ctrl+c不会吧容器杀死:
docker exec
在容器中执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
关键参数:
参数描述-d分离模式: 在后台运行-i即使没有附加也保持 STDIN 打开-t分配一个伪终端-e设置环境变量-u,–user指定用户 "<name-w,–workdir指定工作目录
例子:
运行容器打印出"hello":
docker exec -it mynginx3 echo "hello"
在后台运行打印“hello":
docker exec -d mynginx3 echo "hello"
以交互方式在容器中运行bash:
docker exec -it mynginx3 bash
docker start
启动停止的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
例子:
启动退出的mynginx2:
docker start mynginx2
docker stop
停止运行的容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker restart
重启容器
docker restart [OPTIONS] CONTAINER [CONTAINER...]
docker kill
强制退出容器
docker kill [OPTIONS] CONTAINER [CONTAINER...]
注意:
docker stop
发送的是
SIGTERM
信号,
docker kill
发送的是
SIGKILL
信号
docker top
查看容器中运行的进程信息
docker top CONTAINER [ps OPTIONS]
docker stats
显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等。
关键参数
参数描述–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: 容器创建的进程或线程数。
docker stats [OPTIONS][CONTAINER...]
docker container inspect
查看容器详细信息
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
docker port
用于列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口.
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
docker cp
在容器和宿主机之间拷贝文件
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
例子:
在当前目录下创建一个文件:
运行容器,并在容器创建一个对应的目录:
docker run -it --name mynginx4 nginx:1.23.4 bash
mkdir www
将宿主机的文件复制过去:
docker cp /root/Doc/test.txt mynginx4:/www/
查看文件内容:
在容器mynginx4 的www目录下创建文件test2.txt:
将容器mynginx4 的文件复制到宿主机来:
docker cp mynginx4:/www/test2.txt /root/Doc/
docker diff
检查容器里文件结构的更改。
docker diff CONTAINER
例子:
在容器中创建一个目录:
docker exec -it mynginx3 mkdir /www/
再次查看该容器的文件结构:
docker commit
从容器创建一个新的镜像。
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
关键参数
参数描述-a提交的镜像作者;-c使用 Dockerfile 指令来创建镜像;可以修改启动指令-m提交时的说明文字;-p在 commit 时,将容器暂停
例子:
从一个容器中创建出对应的镜像出来:
docker commit mynginx4 mywebsite:1.1
使用选项 -a 和 -m:
docker commit -a 'wahaha'-m 'test docker commit' mynginx4 mywebsite:1.2
使用选项 -c 修改启动命令:
docker commit -c 'CMD["tail","-f","/etc/hosts"]-p mynginx4 mywebsite:1.3
docker pause 和 docker unpause
暂停容器中所有的进程 和 恢复容器中所有的进程
docker pause CONTAINER
docker unpause CONTAINER
例子:
docker rm
删除停止的容器
docker rm [OPTIONS] CONTAINER
关键参数:-f:通过SIGKILL信号强制删除一个运行的容器
例子:
docker export
导出容器内容为 tar 文件
docker export[OPTIONS] CONTAINER
关键参数: -o:写入到文件
例子:
无论容器是否在运行,都可以进行导出:
docker export-o mynginx202411.tar mynginx3
docker wait
阻塞运行直到容器停止,然后打印出它的退出代码。
docker wait CONTAINER [CONTAINER...]
例子:
docker rename
重命名容器
docker rename CONTAINER NEW_NAME
例子:
docker container prune
删除所有停止的容器
docker container prune [OPTIONS]
关键参数: -f : 不提示是否进行确认
例子:
查看所有容器:
docker ps -a
docker container prune
docker update
更新容器配置
docker update [OPTIONS] CONTAINER [CONTAINER...]
关键参数:
参数描述–cpuscpu 数量–cpuset-cpus使用哪些 cpu–memory内存限制–memory-swap交换内存–cpu-period是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配–cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器
例子:
docker update -m 400m mynginx1
版权归原作者 诡异森林。 所有, 如有侵权,请联系我们删除。