4、docker 容器
docker 容器
本章要点:docker容器启动、停止、删除、创建以及部分使用命令,容器导入导出
容器是镜像的一个运行实例,所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境、其它系统环境)和跑在上面的应用 ,那么Docker容器就是独立运行的一个(或一组)应用 ,以及它们必需的运行环境。总结:Docker 容器是轻量级、可移植的虚拟化单元,基于镜像运行,通过隔离环境实现“一次封装,到处运行”
容器启动
启动容器有二种方式,一种是基于镜像新建一个容器并启动,一种是将在终止状态( stopped )的容器重新启动,
-
启动原理说明
当利用
docker run
来创建并启动docker时,Docker在后台运行的标准操作为:- 检查本地是否存在指定镜像,不存在就从公有仓库下载
- 利用镜像创建一个容器,并启动该容器;
- 分配 一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
- 从网桥的地址池配置一个IP地址给容器;
- 执行用户指定的应用程序;
- 执行完毕后容器被自动终止。
-
容器使用关键操作 - 先来个总结步骤
操作目标 命令示例 说明 拉取镜像 docker pull ubuntu:20.04
从仓库下载指定版本镜像,默认从 Docker Hub 获取 启动容器(后台) docker run -d --name mynginx nginx
-d
后台运行,--name
指定容器名,nginx
为镜像名进入容器 docker exec -it mynginx /bin/bash
-it
交互模式,mynginx
为容器名,/bin/bash
为执行命令查看容器列表 docker ps -a
-a
显示所有状态容器(默认仅运行中)停止/删除容器 docker stop mynginx
/docker rm mynginx
停止后需手动删除,删除前确保容器已停止 -
启动示例
使用语法:
docker run 参数 镜像名称:tag
常用几个参数如下-
常用参数如下
参数 说明 -i 保持和 docker 容器内的交互,启动容器时,运⾏的命令结束后,
容器依然存活,没有退出(默认是会退出,即停⽌的)-t 为容器的标准输⼊虚拟⼀个tty -d 后台运⾏容器 –rm 容器在启动后,执⾏完成命令或程序后就销毁 –name 给容器起⼀个⾃定义名称 -p 宿主机:内部端口 -
使用示例
-
会运行在前台,如果ctrl+c会直接退出,没有指定-p也无法访问
docker run -it 镜像名称|镜像tag|id
-
容器端口映射可通过
-p hostPort:containerPort
实现,如docker run -p 8080:80 nginx
将容器 80 端口映射到主机 8080 端口docker run -it -p 8080:8080 镜像名称|镜像tag|id
-
运行后台,指定端口
docker run -itd -p 8080:8080 edf8233555ae 8132038b18bc24c27eb322f79f33113ee652871a5e785453981b341c9dd64118# 也可以通过 docker ps 查看 , 如果使用 docker ps -a 可以看到上面运行前台ctrl+c结束后stop的容器 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8132038b18bc edf8233555ae "catalina.sh run" 52 seconds ago Up 46 seconds 0.0.0.0:8080->8080/tcp xenodochial_wescoff
-
用完就删,ctrl+c 之后通过
docker ps -a
也查看不到状态docker run --rm 镜像名称|镜像tag|id
-
启动停止后的全部容器
# 注意 如果指定了端口 -p,地址冲突会导致起不来 docker start $(docker ps -a -q)
-
-
容器停止
-
停止单个
docker stop id号
-
停止全部
docker stop $(docker ps -a -q)
容器删除
⚠️ 运行中的容器无法被删除,需要先stop
-
原理说明
- 如果有多个TAG的则只会删除tag, 否则就会直接删除这个镜像所有层
docker rm -f ID
强制删除镜像docker -l ID
删除容器的连接,但保留容器
-
使用示例
-
删除单个
docker stop id号|或者指定的 --name名称 docker rm id号|或者指定的 --name名称# 或者, 强制干掉 docker rm -f id号|或者指定的 --name名称
-
删除全部
docker stop $(docker ps -a -q) # 停止全部的运行中容器 docker rm $(docker ps -a -q) # 删除
-
进入容器
⚠️ 容器是一个最小化阉割的操作系统,进去之后很多命令是没有的
-
附加容器:
docker attr
, 同时只能查看一个容器,当执行A时,B会阻塞 -
docker exec
-i : 打开标准输入接受用户输入命令,默认为false --privileged=true|false : 是否给执行命令以最高权限,默认false -t : 分配伪终端,默认为false -u : 执行命令的用户名或IDdocker exec -it 容器ID /bin/bash 在不影响容器内其它应用的前提下,用户可以很容器与容器进行交互
容器导入\导出
-
导出容器:
docker export
~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0da5b23e3008 ubuntu "/bin/bash" 12 minutes ago Up 12 minutes fervent_ptolemy~]# docker export -o ubuntu_start.tar 0da [root@docker-test ~]# ll -h -rw------- 1 root root 72M 5月 6 11:18 ubuntu_start.tar
-
导入容器:
docker import
~]# docker import ubuntu_start.tar test:v0.1sha256:e8dbb87af2a114651fbad4657a6835c1907b9a1e9141bae902197c6267b993f1~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEtest v0.1 e8dbb87af2a1 4 seconds ago 72.7MB# 也可以直接使用 docker load 进行导入
-
import 与load导入的区别
-
Docker中import和load是两种导入命令,前者导入容器快照生成新镜像(丢失历史和元数据),后者加载完整镜像文件(保留分层和配置),核心差异体现在数据保留和使用场景
-
操作对象与命令格式
维度 import load 操作对象 容器导出的tar文件(export产物) 镜像保存的tar文件(save产物) 导入命令 docker import 文件名.tar 新镜像名:标签
docker load -i 文件名.tar
重命名支持 可指定新镜像名和标签 不可重命名,需导入后手动tag -
数据保留差异
- import(仅保留文件系统)
❌ 丢失镜像历史层:无法查看构建过程(如RUN、COPY指令)。
❌ 丢失元数据:环境变量、启动命令(CMD/ENTRYPOINT)、端口映射等配置不保留1。
✅ 文件体积小:仅导出容器当前状态的单层文件系统。 - load(保留完整镜像)
✅ 保留分层结构:支持回滚到历史版本
✅ 保留元数据:标签、作者信息、启动命令等完整恢复
❌ 文件体积大:包含所有镜像层数据
- import(仅保留文件系统)
-
适用场景对比
场景需求 推荐命令 原因分析 快速备份容器文件状态 import 轻量级快照,适合调试后环境备份 迁移完整镜像(含配置) load 保留元数据,确保导入后可直接运行 制作基础镜像 import 精简历史层,减少冗余体积 批量迁移多个镜像 load 支持一次性打包多个镜像到单个文件
-
容器其它命令
-
ps --> container ls 查看正在运行的容器
-
docker container run 容器名称
-
docker kill 名称 kill正在运行的容器
-
docker container pause id\名称 --> 暂停
-
docker container top id\名称 查看资源排行
~]# docker top id\名称 UID PID PPID TTY TIME CMD root 20390 20370 pts/0 00:00:00 nginx: master process nginx -g daemon off;
-
docker container create\stop\start\status 镜像
-
docker logs 容器 如果添加了 -d 的参数 可以使用log来获取容器的日志
-
原理示意图
-
使用参数
参数 说明 –since 此参数指定了输出日志开始日期,即只输出指定日期之后的日志 -f 查看实时日志 -t 查看日志产生的日期 –tail=10 或 -n 10 查看最后的10条日志 qfjy_exam 容器名称 -
使用示例
-
指定时间
docker logs --since "2025-10-09" 容器名/id
-
查看实时
docker logs -f 容器名/id
-
查看最后多少条
docker logs -n 10 容器名/id
-
-
容器间交换文件
docker cp命令用于容器与主机间复制文件/目录,支持运行或停止的容器,需指定源路径和目标路径,并注意路径格式与限制,使用格式如下
-
基础语法
容器 → 主机: docker cp [OPTIONS] 容器:SRC_PATH DEST_PATH 主机 → 容器: docker cp [OPTIONS] SRC_PATH 容器:DEST_PATH
-
常用选项
选项 说明 -L
跟随源路径中的符号链接(复制链接指向的实际文件) -a
保留文件原始属性(所有者、权限等) -p
保留源文件时间戳 -
使用示例
-
主机复制文件到容器
# 将本机的index.html文件复制到 ROOT目录下,如果加了-p 就能直接访问页面 ~]# docker cp index.html tomcat1:/usr/local/tomcat/webapps/ROOT/ Successfully copied 2.05kB to tomcat1:/usr/local/tomcat/webapps/ROOT/
-
容器复制目录到主机
# 将容器的index.html复制到本机 ~]# docker cp tomcat1:/usr/local/tomcat/webapps/ROOT/index.html . Successfully copied 2.05kB to /root/.
-
一两个文件临时更新可以用这个测试,更多的还是推荐使用存储卷
-
容器创建
用的少,直接用dockerfile
-
新建容器
docker craete
-
create 命令与容器运行模式相关的选项
# -------------- 使用比较多的 -------------- --rm=true | false : 容器退出后是否自动删除,不能跟-d同时使用 -d,--detach=true| false : 是否在后台运行容器,默认为否 --expose= [] : 设定容器会暴露出来的端口或端口范围 -P,--publish-all=true | false : 通过NAT机制将容器标记暴露的端口自动映射到本地主机的临时端口 -p, --publish=[] : 定如何映射到本地主机端口,例如-p 11234-12234:1234-2234 --restart= "no" : 容器的重启策略,包括no、on- failure[:max-retry]、always、unless- stopped等 -t,--tty=true | false : 否分配-一个伪终端,默认为false --net= "bridge" : 指定容器网络模式,包括bridge、none、 其他容器内网络、host 的网络或某个现有网络等# -------------- 第二梯队,可能会使的 -------------- -v| --volume="" : 挂载主机上的文件卷到容器内 --volume-driver="" : 挂载文件卷的驱动类型 --volumes-from= [] : 从其他容器挂载卷 -W,--workdir="" : 容器内的默认工作目录 --entrypoint="" : 像存在人口命令时,覆盖为新的命令 --uts=host : 容器的utS命名空间 --tmpfs= [] : 挂载临时文件系统到容器# -------------- 第三梯队, 使用可能性低的 -------------- -a,--attach= [] : 是否绑定到标准输人、输出和错误 --detach-keys="" : 从attach模式退出的快捷键 --group-add= [] : 运行容器的用户组 -i,-- interactive=true| false : 保持标准输人打开,默认为false --ipc="" : 容器IPC命名空间,可以为其他容器或主机 --isolation= "default" : 容器使用的隔离机制 --log-driver= "json-file" : 指定容器的日志驱动类型,可以为json-file、syslog、journald、gelf、fluentd、awslogs、splunk、etwlogs、gcplogs或none --log-opt=[] : 传递给日志驱动的选项 --net-alias= [] : 容器在网络中的别名 --pid=host : 容器的PID命名空间
-
create命令与容器环境和配置相关的选项
# 使用比较多的参数 --name="" : 指定容器的别名 --dns= [] : 自定义的DNS服务器 -e,--env= [] : 指定容器内环境变量 --env-file= [] : 从文件中读取环境变量到容器内 --link= [名称或ID] : 链接到其他容器# 不怎么使用的 --add-host= [] : 在容器内添加一个 主机名到IP地址的映射关系(通过/etc/hosts 文件) --device= [] : 映射物理机上的设备到容器内 --dns-search= [] : DNS搜索域 --dns-opt= [] : 自定义的DNS选项 -h,--hostname="" : 指定容器内的主机名 --ip="" : 指定容器的IPv4地址 --ip6="" : 指定容器的IPv6地址 --link-local-ip=[]: : 容器的本地链接地址列表 --mac-address="" : 指定容器的Mac地址
-
create命令与容器资源限制和安全保护相关的选项
# 使用较多的 -m,--memory=" " : 限制容器内应用使用的内存,单位可以是b、k、m或g --oom-kill-disable=true|false : 内存耗尽时是否杀死容器 --privileged=true|false : 是否给容器高权限,这意味着容器内应用将不受权限的限制,一般不推荐 -U,--user="" : 指定在容器内执行命令的用户信息 --userns="" : 指定用户命名空间 --ulimit=[] : 通过ulimit来限制最大文件数、最大进程数# 可根据需求来定义 --blkio-weight=10~1000 : 容器读写块设备的1/0性能权重,默认为0 --blkio-weight-device=[名称:WEIGHT] : 指定各个块设备的I/O性能权重 --cpu-shares=0 : 允许容器使用CPU资源的相对权重,默认一个容器能用满个核的 CPU --cap-add=[] : 增加容器的Linux指定安全能力 --cap-drop=[] : 移除容器的Linux指定安全能力 --cgroup-parent=" " : 容器cgroups 限制的创建路径 --cidfile="" : 指定容器的进程ID号写到文件 --cpu-period=0 : 限制容器在CFS调度器下的CPU占用时间片 --cpuset-cpus=" " : 限制容器能使用哪些CPU核心 --cpuset-mems=" " : NUMA架构下使用哪些核心的内存 --cpu-quota=0 : 限制容器在CFS调度器下的CPU配额 --device-read-bps=[] : 挂载设备的读吞吐率(以bps为单位)限制 --device-write-bps=[] : 挂载设备的写吞吐率(以bps为单位)限制 --device-read-iops=[] : 挂载设备的读速率(以每秒io次数为单位)限制 --device-write-iops=[] : 挂载设备的写速率(以每秒i/o次数为单位)限制 --health-cmd=" " : 指定检查容器健康状态的命令 --health-interval=0s : 执行健康检查的间隔时间,单位可以为ms、s、 m或h --health-retries=int : 健康检查失败重试次数,超过则认为不健康 --health-start-period=0s : 容器启动后进行健康检查的等待时间,单位可以为ms、s、m或h --health-timeout=0s : 健康检查的执行超时,单位可以为ms、s、m或h --no-healthcheck=true|false : 是否禁用健康检查 --init : 在容器中执行-一个init进程,来负责响应信号和处理僵尸状态子进程 --kernel-memory=" " : 限制容器使用内核的内存大小,单位可以是b、k、m或g --memory-reservation="" : 当系统中内存过低时,容器会被强制限制内存到给定值,默认情况下等于内存限制值 --memory-swap="LIMIT" : 限制容器使用内存和交换区的总大小 --00m-score-adj="" : 调整容器的内存耗尽参数 --pids-limit="" : 限制容器的pid个数 --read-only=true|false : 是否让容器内的文件系统只读 --security-opt= [] : 指定一些安全参数,包括权限、安全能力、apparmor等 --stop-signal=SIGTERM : 指定停止容器的系统信号 --shm-size="" : /dev/shm的大小 --sig-proxy=true| false : 是否代理收到的信号给应用,默认为true,不能代理SIGCHLD、SIGSTOP和SIGKILL信号 --memory-swappiness="0~100" : 调整容器的内存交换区参数
-