- Docker基础
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> <命令>**命令>容器名或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 网络使用:
- 10.0.0.0/8
- 范围:
10.0.0.0到10.255.255.255 - 特点:最大的私有网段,可容纳约 1600 万台主机,适合需要大量 IP 的场景。
- 示例:
10.1.0.0/24(子网掩码 255.255.255.0,包含 10.1.0.1-10.1.0.254)。
- 范围:
- 172.16.0.0/12
- 范围:
172.16.0.0到172.31.255.255 - 特点:中等规模网段,Docker 默认的
bridge网络(如172.17.0.0/16)就属于这个范围,兼容性好。 - 示例:
172.20.0.0/16(包含 172.20.0.1-172.20.255.254)。
- 范围:
- 192.168.0.0/16
- 范围:
192.168.0.0到192.168.255.255 - 特点:小型网段,家庭 / 办公网络常用,适合 IP 数量较少的场景。
- 示例:
192.168.100.0/24(包含 192.168.100.1-192.168.100.254)。
- 范围:
二、定义网络时的注意事项
- 避免与宿主机 / 其他网络冲突
- 确保自定义网络的 IP 段 不与宿主机的 IP 段重叠(例如宿主机用了
192.168.1.0/24,则自定义网络避免用192.168.1.x)。 - 避免与已有的 Docker 网络(如默认
bridge的172.17.0.0/16)重复,可通过docker network inspect bridge查看已有网段。
- 确保自定义网络的 IP 段 不与宿主机的 IP 段重叠(例如宿主机用了
- 子网掩码与 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; # 若有表,说明数据迁移成功
调试容器
一、针对已创建的容器:修改重启策略 + 强制保持运行
-
修改容器的重启策略为 “不自动重启” 避免容器报错退出后被 Docker 自动重启(默认可能为
on-failure或always):# 停止容器(替换为你的容器名/ID) docker stop zentao-new # 修改重启策略为 no(报错后不自动重启) docker update --restart=no zentao-new # 重新启动容器(加 -i 保持交互,防止进程退出后容器关闭) docker start -i zentao-new-i参数会保持容器的标准输入打开,即使主进程(如 Apache)报错退出,容器也不会立即关闭。
-
若容器已退出,强制进入容器查看状态 如果容器已经因报错停止,可通过
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 进程启动,替代原启动命令