八、Docker详解4-5

第 4 章 容器

4.1 容器生命周期

容器完整状态流转: 创建(create) → 启动(start) → 运行(up) → 暂停(pause) / 停止(stop) → 重启(restart) → 删除(rm)

  1. create:仅创建容器,不启动,生成容器配置,不运行进程
  2. start:启动已经创建好的容器
  3. run = create + start:最常用,直接创建并立刻启动容器
  4. pause/unpause:暂停容器内所有进程,不会销毁容器;恢复运行
  5. stop:优雅停止,给进程发送 SIGTERM 信号,等待超时后强制 kill;
  6. kill:直接强制杀死容器进程
  7. restart:重启容器(stop → start)
  8. 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)进入正在运行的容器
  1. docker exec(推荐!不会重启容器,新开终端会话)

    docker exec -it 容器ID /bin/bash

exec 是在已有容器中额外启动一个新进程;退出exit不会停止容器。

  1. 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 容器生命周期坑点总结

  1. docker run 容器,主进程结束,容器就退出;后台容器也一样。例如 httpd 必须以前台模式运行,不能后台 daemon 模式。
  2. ‑it交互式容器,输入 exit 退出,如果是主进程会话,容器直接停止;exec 的 exit 不会停止容器。
  3. ‑‑rm临时测试非常好用,容器停止自动清理,避免残留大量 Exited 容器。
  4. 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。

  1. 原理:
    • 创建容器时生成一对veth‑pair虚拟网卡;一端留在容器的网络命名空间,另一端挂载到宿主机 docker0 网桥。
    • docker0 网桥分配私有网段(默认172.17.0.0/16),每个容器拿到该网段独立 IP。
  2. 容器访问外网 :宿主机 iptables MASQUERADE源 NAT,容器报文做地址转换访问互联网。
  3. 外部访问容器 :必须使用‑p端口映射;底层 iptables DNAT 目标地址转换,把宿主机端口流量转发到容器 IP: 端口。
  4. 同 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

✅核心优势:

  1. 自带 Docker 内部 DNS 解析 :同一个自定义网络的容器,可以直接使用容器名字当做域名互相访问,不需要记住 IP!

  2. 网络隔离:不同自定义网桥之间默认隔离,无法互通。

  3. 支持动态把运行中的容器接入 / 脱离网络:

    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 四大网络连通场景

  1. 容器 ↔ 容器
    • 同自定义 bridge:直接容器名通信(DNS 生效);
    • docker0 默认 bridge:只能 IP 通信;
    • 不同网络:默认隔离,不通,需要 connect 加入同一个网络。
  2. 外部客户端 ↔ 容器 必须‑p端口映射,iptables DNAT 转发流量。host 模式不需要映射。
  3. 容器 ↔ 外网互联网 宿主机开启 ip 转发,iptables MASQUERADE 源 NAT,容器访问外网。宿主机防火墙、ip 转发关闭会导致容器无法上网。
  4. 容器 ↔ 宿主机本身
    • 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 网络常见故障

  1. 容器无法上网:检查宿主机/etc/sysctl.conf开启net.ipv4.ip_forward=1内核 ip 转发;检查 firewalld/iptables。
  2. 容器之间 ping 不通:确认两个容器是否处于同一个网络。
  3. 容器可以 ping IP,不能 ping 容器名字:使用了默认 docker0 网桥,没有 DNS;切换自定义 bridge 网络。
  4. 外部访问不了容器:确认‑p 端口映射;检查防火墙,确认不是 127.0.0.1 绑定。
相关推荐
阳光九叶草LXGZXJ3 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
黄大刀4 小时前
DataPulse一款开箱即用的SCADA(四)-历史记录
运维·scada·动环
归秋1426 小时前
2026 企业 AI 办公工具选型指南:从评估框架到产品适配
大数据·运维·人工智能
Android系统攻城狮7 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
硅基手札8 小时前
【Linux内核专栏 14】网络协议栈
linux·运维·网络协议
工作10年+,存储芯片行业10 小时前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie
快乐の番薯10 小时前
卷王问卷考试系统自动化功能测试
运维·功能测试·自动化
一号弯11 小时前
装完LINUX,请先新建日常用户
linux·运维·服务器
许彰午12 小时前
03-Linux环境准备依赖包内核参数与用户组
linux·运维·服务器·数据库
阳光九叶草LXGZXJ12 小时前
达梦数据库-报错-16-MERGE INTO提示:无效的列名[XX]
linux·运维·数据库·sql·学习