PandHedge

Docker基础

2025-09-13
PandHedge

Docker基础

软件、依赖、配置环境

Docker 生成和管理容器的工具

配置加速镜像 daemon.js

docker ps

-a

docker run [options] image [command] [arg…]

-a stdin

-d

-p -p:

–name=”nginx-lb”

–volume,-v

docker stop

docker rm docker rmi


镜像:模板, 不能直接访问与修改

容器:


镜像的创建和

docker pull

docker push

docker save 镜像id > xxx.tar docker load < xxx.tar

dockerfile

FROM NAINTAINER RUN ADD WORKDIR VOLUME EXPOSE RUN

容器保存成镜像

docker commit id name

docker image ls

docker rmi name


**docker exec -it <容器名或ID> <命令>**


一、能否为已建立的容器指定固定 IP?

可以,但需要通过 “自定义网络” 实现,默认的bridge网络无法直接修改已有容器的 IP。具体步骤如下:

1. 先创建一个自定义 Docker 网络(指定子网,方便固定 IP)

# 创建自定义网络(例如命名为mysql-net,子网为172.20.0.0/16)
docker network create --driver bridge --subnet=172.20.0.0/16  --gateway=172.20.0.1

2. 将已有的 MySQL 容器连接到自定义网络,并指定固定 IP

假设你的 MySQL 容器名为mysql-old,需要为其分配固定 IP(如172.20.0.10):

# 将现有容器连接到自定义网络,并指定固定IP
docker network connect --ip 172.20.0.10 mysql-net mysql-old

3. (可选)断开容器与默认 bridge 网络的连接(避免 IP 冲突)

如果不需要容器在默认网络中,可断开连接:

# 查看容器当前连接的网络
docker network inspect bridge | grep -A 5 "Containers"  # 找到容器ID

# 断开与默认bridge网络的连接(替换为你的容器ID)
docker network disconnect bridge <容器ID>

1. 核心功能

创建一个名为 mysql-net 的 Docker 自定义网络,用于隔离容器间的通信(例如连接 MySQL 容器和应用程序容器)。


2. 参数解析

参数 说明
docker network create Docker 网络创建命令
--driver bridge 指定网络驱动类型为 桥接模式(默认类型)
--subnet=172.20.0.0/16 定义网络 IP 地址范围
--gateway=172.20.0.1 指定子网的默认网关
mysql-net 自定义网络名称

3. 关键配置详解

(1) 子网划分 --subnet=172.20.0.0/16

  • IP 范围172.20.0.0 - 172.20.255.255
  • CIDR 表示/16 表示前 16 位为网络号
  • 可用 IP 数量65,534 个(2^16 - 2,减去网络地址和广播地址)
  • 作用:确保容器在该子网内分配唯一 IP

(2) 网关设置 --gateway=172.20.0.1

  • 网关地址:172.20.0.1
  • 功能:
    • 容器访问外部网络(如互联网)的出口
    • 宿主机与容器通信的入口
  • 地址要求:必须在子网范围内(这里是 172.20.x.x

一、常用的私有 IP 地址段(推荐)

根据 RFC 1918 标准,以下三个地址段专为私有网络设计,不会被公网路由,适合 Docker 网络使用:

  1. 10.0.0.0/8
    • 范围:10.0.0.010.255.255.255
    • 特点:最大的私有网段,可容纳约 1600 万台主机,适合需要大量 IP 的场景。
    • 示例:10.1.0.0/24(子网掩码 255.255.255.0,包含 10.1.0.1-10.1.0.254)。
  2. 172.16.0.0/12
    • 范围:172.16.0.0172.31.255.255
    • 特点:中等规模网段,Docker 默认的 bridge 网络(如 172.17.0.0/16)就属于这个范围,兼容性好。
    • 示例:172.20.0.0/16(包含 172.20.0.1-172.20.255.254)。
  3. 192.168.0.0/16
    • 范围:192.168.0.0192.168.255.255
    • 特点:小型网段,家庭 / 办公网络常用,适合 IP 数量较少的场景。
    • 示例:192.168.100.0/24(包含 192.168.100.1-192.168.100.254)。

二、定义网络时的注意事项

  1. 避免与宿主机 / 其他网络冲突
    • 确保自定义网络的 IP 段 不与宿主机的 IP 段重叠(例如宿主机用了 192.168.1.0/24,则自定义网络避免用 192.168.1.x)。
    • 避免与已有的 Docker 网络(如默认 bridge172.17.0.0/16)重复,可通过 docker network inspect bridge 查看已有网段。
  2. 子网掩码与 IP 数量
    • /24 子网掩码(如 172.20.0.0/24):最多提供 254 个可用 IP(适合中小型网络)。
    • /16 子网掩码(如 172.20.0.0/16):最多提供 65534 个可用 IP(适合大型网络)。
    • 示例:创建一个包含 254 个 IP 的网络:

1. 列出所有 Docker 网络(包括自定义网络)

docker network ls

二、如何将已配置的 MySQL 转移到新容器(推荐方案)

如果更倾向于 “新建容器并保留数据和配置”(避免修改旧容器的复杂性),可按以下步骤迁移:

1. 备份旧 MySQL 容器的数据和配置

MySQL 的核心是数据文件配置文件,需先备份:

方法 1:通过数据卷备份(推荐,若旧容器使用了-v挂载)
# 查看旧容器的挂载信息(找到数据卷或宿主机挂载路径)
docker inspect mysql-old | grep "Mounts" -A 20

假设旧容器的数据挂载到了宿主机/opt/mysql-data,直接复制该目录备份:

cp -r /opt/mysql-data /opt/mysql-data-backup  # 备份数据
方法 2:直接备份容器内的数据文件(若未挂载数据卷)
# 进入旧容器,找到MySQL数据目录(通常为/var/lib/mysql)
docker exec -it mysql-old bash
echo $MYSQL_DATA_DIR  # 或查看配置文件my.cnf中的datadir

# 在宿主机执行,将容器内数据复制到本地
docker cp mysql-old:/var/lib/mysql /opt/mysql-data-backup  # 替换为实际数据目录
方法 3:用mysqldump导出数据(适用于需要迁移特定数据库的场景)
# 导出所有数据库(包括权限配置)
docker exec mysql-old mysqldump -u root -p --all-databases > /opt/mysql-all.sql
# 输入旧容器的root密码,生成备份文件/opt/mysql-all.sql

2. 创建新的 MySQL 容器(指定固定 IP 和备份数据)

# 用备份的数据创建新容器,并加入自定义网络指定固定IP
docker run -d \
  --name mysql-new \
  --net mysql-net \  # 加入之前创建的自定义网络
  --ip 172.20.0.10 \  # 固定IP(与旧容器计划的IP一致,方便其他服务无缝迁移)
  -v /opt/mysql-data-backup:/var/lib/mysql \  # 挂载备份的数据目录
  -e MYSQL_ROOT_PASSWORD=你的密码 \  # 保持与旧容器相同的密码
  -p 3306:3306 \
  mysql:你的版本  # 与旧容器相同的MySQL版本

3. 验证新容器的配置和数据

# 进入新容器,登录MySQL验证
docker exec -it mysql-new mysql -u root -p

# 检查数据库是否完整(例如查看禅道数据库zentao)
show databases;
use zentao;
show tables;  # 若有表,说明数据迁移成功

调试容器

一、针对已创建的容器:修改重启策略 + 强制保持运行

  1. 修改容器的重启策略为 “不自动重启” 避免容器报错退出后被 Docker 自动重启(默认可能为 on-failurealways):

    # 停止容器(替换为你的容器名/ID)
    docker stop zentao-new
       
    # 修改重启策略为 no(报错后不自动重启)
    docker update --restart=no zentao-new
       
    # 重新启动容器(加 -i 保持交互,防止进程退出后容器关闭)
    docker start -i zentao-new
    
    • -i 参数会保持容器的标准输入打开,即使主进程(如 Apache)报错退出,容器也不会立即关闭。
  2. 若容器已退出,强制进入容器查看状态 如果容器已经因报错停止,可通过 docker exec 无法进入,需先以 “调试模式” 启动:

    # 先查看容器是否处于停止状态
    docker ps -a | findstr zentao-new
       
    # 以“覆盖命令”的方式启动容器(用 bash 进程替代原进程,保持容器运行)
    docker run -it --rm ^
      --name zentao-debug ^
      --net mysql-net ^
      -v D:\Program_Files\ZenTao\data:/data ^
      禅道镜像名称 ^
      bash  # 用 bash 进程启动,替代原启动命令
    

上一篇 C#

下一篇 Excel基础

Comments

Content