第 4 章 容器
4.1 容器生命周期
容器完整状态流转: 创建(create) → 启动(start) → 运行(up) → 暂停(pause) / 停止(stop) → 重启(restart) → 删除(rm)
- create:仅创建容器,不启动,生成容器配置,不运行进程
- start:启动已经创建好的容器
- run =
create + start:最常用,直接创建并立刻启动容器 - pause/unpause:暂停容器内所有进程,不会销毁容器;恢复运行
- stop:优雅停止,给进程发送 SIGTERM 信号,等待超时后强制 kill;
- kill:直接强制杀死容器进程
- restart:重启容器(stop → start)
- rm :删除停止状态的容器;
‑f强制删除正在运行的容器
⚠️关键点:容器进程退出容器就会终止。前台容器退出,容器状态 Exited;后台容器如果主进程结束,容器同样退出。
4.2 容器基础常用命令
1)容器创建启动
# 创建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
重要参数:
表格
| 参数 | 说明 |
|---|---|
‑d |
后台守护模式运行容器,返回容器 ID |
‑it |
交互式终端,分配伪终端,进入容器内部;‑i保持标准输入,‑t分配 tty 终端 |
‑‑name xxx |
给容器指定名字,不指定则随机生成名字 |
‑p 宿主机端口:容器端口 |
端口映射;‑p 容器端口随机分配宿主机端口 |
‑‑rm |
容器退出后自动删除容器,适合临时测试 |
‑‑restart |
容器重启策略 |
restart 重启策略
no:默认,容器退出不自动重启always:容器退出就自动重启;docker 服务重启容器也会启动on‑failure:只有异常退出(返回非 0 退出码)才重启unless‑stopped:除非手动 stop,否则一直重启;docker 重启时容器启动
示例:
#交互式进入centos容器
docker run -it --name test‑centos centos:7 /bin/bash
#后台运行httpd,80端口映射,退出自动删除
docker run -d -p 8080:80 --rm --name web httpd
2)容器查看
docker ps #查看正在运行的容器
docker ps -a #查看所有(运行+停止)容器
docker ps -q #只输出容器ID,适合脚本批量操作
docker inspect 容器名/ID #查看容器完整元数据(JSON格式,IP、挂载、端口、状态)
docker port 容器名 #查看容器端口映射
3)进入正在运行的容器
-
docker exec(推荐!不会重启容器,新开终端会话)docker exec -it 容器ID /bin/bash
exec 是在已有容器中额外启动一个新进程;退出
exit不会停止容器。
docker attach(不推荐) 直接挂接到容器主进程终端;exit会直接导致容器主进程退出,容器停止。
4)容器停止、重启、删除
docker stop 容器ID/名字 #优雅停止
docker kill 容器ID/名字 #强制杀死
docker start 容器ID/名字 #启动已存在的停止容器
docker restart 容器ID/名字 #重启
docker rm 容器ID/名字 #删除已经停止的容器
docker rm -f 容器ID/名字 #强制删除运行中容器
docker rm -f $(docker ps -aq) #批量删除全部容器
5)容器文件拷贝(宿主机 ↔ 容器)
#宿主机文件拷贝到容器内
docker cp 宿主机路径 容器ID:/容器内路径
#容器内文件拷贝到宿主机
docker cp 容器ID:/容器内路径 宿主机路径
不需要容器运行,停止状态的容器也支持 cp 拷贝。
6)基于运行容器制作镜像
docker commit [选项] 容器ID 新镜像名:tag
对应第 3 章知识点,不推荐生产使用,可用来调试。
4.3 容器生命周期坑点总结
- docker run 容器,主进程结束,容器就退出;后台容器也一样。例如 httpd 必须以前台模式运行,不能后台 daemon 模式。
‑it交互式容器,输入 exit 退出,如果是主进程会话,容器直接停止;exec 的 exit 不会停止容器。‑‑rm临时测试非常好用,容器停止自动清理,避免残留大量 Exited 容器。- inspect 可以拿到容器 IP 地址、挂载卷、环境变量等所有配置信息,排错高频命令。
第 5 章 容器网络
Docker 网络核心:Docker 通过网络驱动实现容器网络隔离与互通;Docker 内置 5 种网络模式。
docker network ls #查看docker内置网络
默认自带 3 个网络:bridge(docker0 网桥)、host、none
5.1 五大网络模式详解
1. bridge(默认网桥模式,--net bridge)
不指定‑‑net,容器默认使用 bridge 网络,底层网桥名字docker0。
- 原理:
- 创建容器时生成一对
veth‑pair虚拟网卡;一端留在容器的网络命名空间,另一端挂载到宿主机 docker0 网桥。 - docker0 网桥分配私有网段(默认
172.17.0.0/16),每个容器拿到该网段独立 IP。
- 创建容器时生成一对
- 容器访问外网 :宿主机 iptables
MASQUERADE源 NAT,容器报文做地址转换访问互联网。 - 外部访问容器 :必须使用
‑p端口映射;底层 iptables DNAT 目标地址转换,把宿主机端口流量转发到容器 IP: 端口。 - 同 docker0 网桥容器互通 :只能通过 IP 互相访问,不支持容器名字 DNS 解析!
缺点:不支持容器名域名解析,生产环境建议使用自定义 bridge 网络。
2. host 网络模式 --net host
容器直接复用宿主机的网络命名空间,没有网络隔离。
- 容器直接使用宿主机网卡 IP,不需要端口映射;容器监听端口直接占用宿主机端口。
- 优点:网络性能最好;
- 缺点:失去网络隔离,端口冲突风险大。适合监控 agent 等需要大量端口的场景。
3. none 模式 --net none
容器内部没有任何网卡设备,完全网络隔离。需要用户手动手工添加网卡、配置 IP。一般用于高度安全隔离场景。
4. container 共享网络命名空间 --net container:<容器ID>
新创建的容器复用另外一个已有容器的网络栈。
- 两个容器共享同一个localhost、IP 地址、端口;在 A 容器的 127.0.0.1 就可以直接访问 B 容器内部服务。
- 典型场景:日志采集容器、网络抓包容器。
注意:端口不能冲突,两个容器不能监听同一个端口。
5. 自定义 bridge 网络(生产推荐)
#创建自定义网桥
docker network create my_bridge
#容器加入自定义网络
docker run -d --net my_bridge --name c1 httpd
docker run -d --net my_bridge --name c2 httpd
✅核心优势:
-
自带 Docker 内部 DNS 解析 :同一个自定义网络的容器,可以直接使用容器名字当做域名互相访问,不需要记住 IP!
-
网络隔离:不同自定义网桥之间默认隔离,无法互通。
-
支持动态把运行中的容器接入 / 脱离网络:
docker network connect my_bridge c3 #把已有容器c3加入my_bridge网络
docker network disconnect my_bridge c3 #断开
旧版
‑‑link参数已经废弃,生产不要再使用,优先自定义 bridge 网络。
5.2 端口映射 -p 三种写法
#1 宿主机所有网卡,宿主机8080映射容器80
‑p 8080:80
#2 指定宿主机IP,只监听127.0.0.1的8080端口
‑p 127.0.0.1:8080:80
#3 只写容器端口,宿主机随机分配端口
‑p 80
底层依赖 iptables;如果清空 iptables 规则,端口映射会失效。
5.3 四大网络连通场景

- 容器 ↔ 容器
- 同自定义 bridge:直接容器名通信(DNS 生效);
- docker0 默认 bridge:只能 IP 通信;
- 不同网络:默认隔离,不通,需要 connect 加入同一个网络。
- 外部客户端 ↔ 容器 必须
‑p端口映射,iptables DNAT 转发流量。host 模式不需要映射。 - 容器 ↔ 外网互联网 宿主机开启 ip 转发,iptables MASQUERADE 源 NAT,容器访问外网。宿主机防火墙、ip 转发关闭会导致容器无法上网。
- 容器 ↔ 宿主机本身
- bridge 模式下,容器访问宿主机,可以访问网桥网关 IP(docker0 的 IP,一般 172.17.0.1);
- docker 提供参数
--add-host=host.docker.internal:host‑gateway在容器内添加 host.docker.internal 指向宿主机网关。
5.4 网络常用排错命令
docker network inspect my_bridge #查看网络详情,查看接入容器、网段
docker port 容器ID #查看端口映射
docker exec -it 容器 curl/ping 目标 #进入容器内部测试连通性
#宿主机查看iptables nat规则,排查端口转发
iptables -t nat -nvL
5.5 第三方网络插件
docker 原生网络能力有限,集群环境下使用第三方 CNI 网络插件:flannel、weave、calico,解决多主机之间容器跨机器通信。
5.6 网络常见故障
- 容器无法上网:检查宿主机
/etc/sysctl.conf开启net.ipv4.ip_forward=1内核 ip 转发;检查 firewalld/iptables。 - 容器之间 ping 不通:确认两个容器是否处于同一个网络。
- 容器可以 ping IP,不能 ping 容器名字:使用了默认 docker0 网桥,没有 DNS;切换自定义 bridge 网络。
- 外部访问不了容器:确认‑p 端口映射;检查防火墙,确认不是 127.0.0.1 绑定。