docker网络,认识docker0,--link使用

本文介绍了Docker的默认网络docker0,它作为容器间的桥梁,允许容器间通信。通过--link参数,可以实现容器间的名称解析,但这种方式已逐渐被淘汰。文章还探讨了容器通过主机名无法直接互访的问题,并预告了自定义网络的解决方案。

docker网络,认识docker0,–link使用

前言

这里有博主对docker的基础总结:https://blog.youkuaiyun.com/hello_list/article/details/124221409

这篇文章没有说到docker网络,今天就是续上,看到没有,我说的会跟上的吧

在这里插入图片描述

在这里插入图片描述

认识docker0

我们安装完docker有没有发现,我们使用ip addr 命令后,是这样的,我们发现增加了一个docker0的内网地址:172.17.0.1

学过计算机网络的同学听到这里肯定就很容易理解,而且很简单了,但是没有学过计算机网络的同学,可以不用观看此文章,这只是作者的笔记,也不会讲的通俗易懂;

在这里插入图片描述

docker相当于Linux上的虚拟机容器,它也会像vmware一样创建自己的网卡,同时搭建自己的容器内网,而docker0就是网卡,通俗理解相当于路由器;

我们每启动一个容器,就会通过docker0来分配一个容器ip,通过主机—》docker0—-》容器,这样我们都是可以解析找到地址网络,也就是都可以ping的通的;

而容器之间,本身再docker0的子网下,在一个网段也都是可以ping的通的;

随便搜一张图片来理解:

在这里插入图片描述

这里也做下测试吧

我们启动两个tomcat9.0服务:

docker run -it -d -P --name tomcat01 tomcat:9.0
docker run -it -d -P --name tomcat02 tomcat:9.0

我这里已经启动了两个容器:

在这里插入图片描述

我们查看下他们各自的网络:

我们发现进入到容器内,没有ip addr 命令,这里是因为centos是压缩版的,其实我们应该先用dockerFile构建一个自己的镜像,但是不要担心,这里我们可以补救,这里不推荐大家这么使用,太慢了,等一会儿咱们构建个自己的镜像:

在这里插入图片描述

进入容器,先通过apt-get update更新软件包,然后我们apt-get install net-tools,就可以了,这是使用ifconfig命令,还可以使用,这是安装IP addr命令,都一样

apt update && apt install -y iproute2   # 因为安装这个不好安装,所以没有用这个

在这里插入图片描述

这里看下网络,tomcat01分配了172.17.0.2地址:

在这里插入图片描述

我们再看下tomcat02:

在这里插入图片描述

我们ping一下,发现不管是主机到容器,容器到容器都是可以ping通的

主机ping容器:

在这里插入图片描述

容器ping主机,我们需要安装一个ping命令

apt-get install inetutils-ping

在这里插入图片描述

容器ping容器,也是可以的:

在这里插入图片描述

但是我们通过名称呢,发现是不可以的;

在这里插入图片描述

思考:但是这样就产生了一个问题,我们只能通过启动容器docker分配的网络地址来使用,容器和容器之间,并不能通过固定的名称来互相访问,这样是不行的!

这里我们首先可以通过–link

比如我们在开启一个tomcat03,但是命令是这样的:

docker run -it -d -P --name tomcat03 --link tomcat02 tomcat:9.0

我们进入容器tomcat3,试着通过名字去ping tomcat02,测试可以ping通:

在这里插入图片描述

那用tomcat02 ping tomcat03呢,还是不可以的:

在这里插入图片描述

那它这个原理呢,其实很简单,我们查看下容器中/etc/hosts目录,其实就是把ip地址和名字做了下绑定:

在这里插入图片描述

所以我们可以ping到02其实还是找到了它的IP地址,但是这种方式我们不怎么使用,因为后面还有更好的方式,就是我们可以自定义网络,下一篇自定义网络;

我们还可以通过docker network inspect 容器id查看网络信息

小结

下一篇我们看下docker如何自定义网络,谢谢支持,bye~

你提出的问题非常典型:**在尝试将 Docker 数据目录从默认的 `/var/lib/docker` 迁移到外部分区(如 `/run/media/mmcblk0p8/docker`)后,重启 Docker 服务时发现新路径下的内容“消失了”**。 我们来逐步分析你的操作流程,并指出关键问题所在。 --- ### ✅ 你的操作步骤回顾: ```bash 1. sudo systemctl stop docker 2. sudo rsync -aXSH --info=progress2 /var/lib/docker/ /run/media/mmcblk0p8/docker/ 3. sudo mv /var/lib/docker /var/lib/docker.bak 4. sudo ln -s /run/media/mmcblk0p8/docker /var/lib/docker 5. sudo mount --bind /run/media/mmcblk0p8/docker /var/lib/docker 6. sudo systemctl restart docker ``` 看起来逻辑清晰,但第 **4 和 5 步存在冲突**,是导致“数据消失”的根本原因! --- ## ❌ 核心问题:软链接 + bind mount 的冲突 你同时做了两件事: - 第 4 步:创建了符号链接(soft link) ```bash sudo ln -s /run/media/mmcblk0p8/docker /var/lib/docker ``` - 第 5 步:使用 `mount --bind` 做了绑定挂载 ```bash sudo mount --bind /run/media/mmcblk0p8/docker /var/lib/docker ``` > ⚠️ **一旦执行了 bind mount,它会覆盖任何已存在的文件或符号链接!** 更严重的是: - 如果 `/var/lib/docker` 已经是一个符号链接,**某些系统上的 `mount --bind` 不支持直接挂载到符号链接上**。 - 即使能挂载成功,行为也是未定义的、不可靠的。 - 最坏情况是:挂载失败或挂载点为空 → Docker 启动时认为这是一个“空目录”,于是**自动初始化一个新的空 `/var/lib/docker` 结构**,而原来的 `/run/media/mmcblk0p8/docker` 中的数据看似“消失”了 —— 实际上只是没被正确挂载进去。 --- ## ✅ 正确做法:只选其一 你应该选择以下两种方式之一,**不要混用软链接和 bind mount**。 --- ### ✅ 推荐方案一:使用 `mount --bind`(推荐用于永久迁移) #### 修改 `/etc/fstab` 实现开机自动挂载: 1. 确保目标路径存在: ```bash sudo mkdir -p /run/media/mmcblk0p8/docker ``` 2. 同步数据(你在第2步已经做了): ```bash sudo rsync -aXSH --info=progress2 /var/lib/docker/ /run/media/mmcblk0p8/docker/ ``` 3. 备份原目录并创建空目录用于挂载: ```bash sudo mv /var/lib/docker /var/lib/docker.bak sudo mkdir /var/lib/docker ``` 4. 添加绑定挂载到 `/etc/fstab`,实现开机自动挂载: ```bash echo '/run/media/mmcblk0p8/docker /var/lib/docker none bind 0 0' | sudo tee -a /etc/fstab ``` 5. 手动测试挂载: ```bash sudo mount /var/lib/docker ``` 6. 启动 Docker: ```bash sudo systemctl start docker ``` 7. 验证是否生效: ```bash docker info | grep "Docker Root Dir" ls /run/media/mmcblk0p8/docker/ # 查看数据是否存在 ``` ✅ 这样做后,`/var/lib/docker` 是一个挂载点,指向外部存储,Docker 能正常读取原有数据。 --- ### ✅ 推荐方案二:修改 `daemon.json`(最干净、官方推荐) 这是 **Docker 官方推荐的方式**,无需涉及挂载或软链。 1. 停止 Docker: ```bash sudo systemctl stop docker ``` 2. 移动数据(同前): ```bash sudo rsync -aXSH /var/lib/docker/ /run/media/mmcblk0p8/docker/ ``` 3. 备份并清空原目录: ```bash sudo mv /var/lib/docker /var/lib/docker.bak sudo mkdir /var/lib/docker # 可留空,仅作占位 ``` 4. 编辑配置文件: ```bash sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<EOF { "data-root": "/run/media/mmcblk0p8/docker" } EOF ``` 5. 启动 Docker: ```bash sudo systemctl daemon-reload sudo systemctl start docker ``` 6. 验证: ```bash docker info | grep "Docker Root Dir" ``` > 输出应为: > ``` > Docker Root Dir: /run/media/mmcblk0p8/docker > ``` 📌 这种方式完全由 Docker 自己管理路径,避免了文件系统层面的复杂性,**是最安全、可移植性最强的方法**。 --- ## ❓为什么你觉得“/run/media/mmcblk0p8 下的东西消失了”? 可能的原因包括: | 原因 | 解释 | |------|------| | **挂载未生效或出错** | `mount --bind` 没有成功执行,或者路径权限不对,导致 `/var/lib/docker` 实际仍是空目录 | | **Docker 初始化了新目录** | 当 Docker 发现根目录为空时,会自动生成新的结构(如 `containers/`, `image/` 等),你以为旧数据没了,其实是根本没挂进来 | | **/run/media/mmcblk0p8 分区未挂载** | 如果这个路径本身依赖于某个设备(如U盘、SD卡),且未提前挂载,那么 rsync 其实写到了内存临时文件系统中(比如 tmpfs),重启后丢失 | | **符号链接被忽略** | systemd 或 Docker 启动过程中不解析软链接,导致访问失败 | --- ## 🔧 补救措施 如果你现在发现数据“不见了”,先别慌,检查: ```bash # 查看原始迁移位置是否有数据 ls /run/media/mmcblk0p8/docker/ # 查看是否还有备份 ls /var/lib/docker.bak/ # 查看当前挂载状态 mount | grep docker ``` 如果 `/run/media/mmcblk0p8/docker/` 下仍有数据,说明只是挂载失败。重新按上述推荐方式设置即可。 --- ## ✅ 总结建议 | 方法 | 是否推荐 | 说明 | |------|----------|------| | `mount --bind` + `/etc/fstab` | ✅ 推荐 | 系统级控制,适合固定路径 | | `data-root` in `daemon.json` | ✅✅ 强烈推荐 | 官方支持,简洁安全 | | 软链接(symlink) | ⚠️ 不推荐用于生产 | 某些场景下工作,但易出错 | | 软链接 + bind mount 混用 | ❌ 绝对禁止 | 导致行为混乱 | ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值