八、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 网桥)、hostnone

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 网络插件:flannelweavecalico,解决多主机之间容器跨机器通信。

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 绑定。
相关推荐
智恒百亿2 小时前
RTX 5090 八卡服务器 vs RTX PRO 6000 整机:AI 推理、微调与渲染选型部署指南
运维·服务器·rtx5090
蓝胖的四次元口袋3 小时前
Docker Compose多容器编排与Nginx集群实战
运维·nginx·docker compose
懂软件的胡子个哥4 小时前
微信 API 消息回调怎么设计,才能避免丢消息和重复处理
运维·微信·架构·wechatapi·个人微信号二次开发
吉甫作诵4 小时前
Redis 常用命令大全:11 大类命令速查手册
运维·数据库·redis·缓存·nosql
Acrellea6 小时前
告别粗放式能耗管理!安科瑞EIOT平台助力产业园区智慧低碳运营
运维·安全·能源
Databuff6 小时前
五款主流 SSH 免费工具介绍
运维·ssh·运维开发
菜鸟学编程o6 小时前
Linux常见指令
linux·运维·服务器
pt10437 小时前
AIOps机器学习——当警报阈值被调高之后
运维·人工智能·自动化
迪康coolmu7 小时前
企业文件外发管控落地实践 —— 基于迪康端点安全一体化管理系统
运维·网络·经验分享·安全