主题
Docker网络和存储详解
课程介绍
Docker网络和存储是Docker的核心功能,网络用于容器之间的通信,存储用于容器数据的持久化。本课程将详细讲解Docker网络的类型、配置方法,以及Docker存储的类型、使用方法等内容,帮助你掌握Docker网络和存储的核心知识。
1. Docker网络概述
1.1 什么是Docker网络
Docker网络是Docker容器之间通信的桥梁。
Docker网络的定义: Docker网络是Docker容器之间通信的桥梁,它允许容器之间相互通信,也允许容器与外部网络通信。
Docker网络的作用:
| 作用 | 说明 |
|---|---|
| 容器间通信 | 容器之间相互通信 |
| 容器与外部通信 | 容器与外部网络通信 |
| 网络隔离 | 提供网络隔离 |
| 网络安全 | 提供网络安全 |
1.2 Docker网络类型
Docker支持多种网络类型。
Docker网络类型:
| 类型 | 说明 |
|---|---|
| bridge | 默认网络类型,容器连接到默认的bridge网络 |
| host | 容器使用主机的网络栈 |
| none | 容器没有网络接口 |
| overlay | 用于Swarm集群的网络类型 |
| macvlan | 为容器分配MAC地址 |
| ipvlan | 为容器分配IPv4或IPv6地址 |
| custom | 自定义网络 |
2. Docker网络管理
2.1 查看网络
查看Docker网络。
命令:
bash
# 查看所有网络
docker network ls
# 查看网络详情
docker network inspect bridge
# 查看网络(格式化输出)
docker network ls --format "{{.Name}} {{.Driver}}"2.2 创建网络
创建Docker网络。
命令:
bash
# 创建bridge网络
docker network create mybridge
# 创建bridge网络(指定子网)
docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 mybridge
# 创建overlay网络
docker network create --driver overlay myoverlay
# 创建macvlan网络
docker network create --driver macvlan --subnet 192.168.1.0/24 --gateway 192.168.1.1 -o parent=eth0 mymacvlan2.3 连接容器
将容器连接到网络。
命令:
bash
# 运行容器时连接网络
docker run -d --name mycontainer --network mybridge ubuntu:20.04
# 将运行中的容器连接到网络
docker network connect mybridge mycontainer
# 将容器从网络断开
docker network disconnect mybridge mycontainer2.4 删除网络
删除Docker网络。
命令:
bash
# 删除网络
docker network rm mybridge
# 删除所有未使用的网络
docker network prune
# 删除所有网络
docker network prune -f3. Docker网络模式详解
3.1 bridge模式
bridge模式是Docker的默认网络模式。
bridge模式的特点:
| 特点 | 说明 |
|---|---|
| 默认模式 | Docker的默认网络模式 |
| 网络隔离 | 容器与主机网络隔离 |
| 端口映射 | 支持端口映射 |
| 容器间通信 | 同一网络的容器可以相互通信 |
bridge模式示例:
bash
# 运行容器(bridge模式)
docker run -d --name mycontainer -p 80:80 nginx
# 查看容器网络
docker inspect mycontainer | grep -A 20 "Networks"3.2 host模式
host模式让容器使用主机的网络栈。
host模式的特点:
| 特点 | 说明 |
|---|---|
| 网络共享 | 容器与主机共享网络栈 |
| 性能好 | 网络性能好 |
| 无隔离 | 容器与主机网络无隔离 |
| 端口冲突 | 可能存在端口冲突 |
host模式示例:
bash
# 运行容器(host模式)
docker run -d --name mycontainer --network host nginx
# 查看容器网络
docker inspect mycontainer | grep -A 20 "Networks"3.3 none模式
none模式让容器没有网络接口。
none模式的特点:
| 特点 | 说明 |
|---|---|
| 无网络 | 容器没有网络接口 |
| 完全隔离 | 网络完全隔离 |
| 无外部通信 | 容器无法与外部通信 |
| 特殊场景 | 适用于特殊场景 |
none模式示例:
bash
# 运行容器(none模式)
docker run -d --name mycontainer --network none ubuntu:20.04
# 查看容器网络
docker inspect mycontainer | grep -A 20 "Networks"3.4 overlay模式
overlay模式用于Swarm集群。
overlay模式的特点:
| 特点 | 说明 |
|---|---|
| 集群通信 | 用于Swarm集群的容器通信 |
| 跨主机 | 支持跨主机通信 |
| 网络隔离 | 提供网络隔离 |
| 服务发现 | 支持服务发现 |
overlay模式示例:
bash
# 初始化Swarm集群
docker swarm init
# 创建overlay网络
docker network create --driver overlay myoverlay
# 运行服务(overlay模式)
docker service create --name myservice --network myoverlay nginx4. Docker存储概述
4.1 什么是Docker存储
Docker存储是Docker容器数据持久化的方式。
Docker存储的定义: Docker存储是Docker容器数据持久化的方式,它允许容器数据在容器重启后依然存在。
Docker存储的作用:
| 作用 | 说明 |
|---|---|
| 数据持久化 | 容器数据持久化 |
| 数据共享 | 容器之间共享数据 |
| 数据备份 | 容器数据备份 |
| 数据迁移 | 容器数据迁移 |
4.2 Docker存储类型
Docker支持多种存储类型。
Docker存储类型:
| 类型 | 说明 |
|---|---|
| volume | Docker管理的卷 |
| bind mount | 绑定挂载到主机目录 |
| tmpfs | 临时文件系统 |
| named pipe | 命名管道 |
5. Docker存储管理
5.1 查看卷
查看Docker卷。
命令:
bash
# 查看所有卷
docker volume ls
# 查看卷详情
docker volume inspect myvolume
# 查看卷(格式化输出)
docker volume ls --format "{{.Name}} {{.Driver}}"5.2 创建卷
创建Docker卷。
命令:
bash
# 创建卷
docker volume create myvolume
# 创建卷(指定驱动)
docker volume create --driver local myvolume
# 创建卷(指定选项)
docker volume create --driver local --opt type=tmpfs --opt device=tmpfs myvolume5.3 使用卷
在容器中使用Docker卷。
命令:
bash
# 运行容器并挂载卷
docker run -d --name mycontainer -v myvolume:/data ubuntu:20.04
# 运行容器并挂载多个卷
docker run -d --name mycontainer -v myvolume1:/data1 -v myvolume2:/data2 ubuntu:20.04
# 运行容器并挂载主机目录
docker run -d --name mycontainer -v /host/path:/container/path ubuntu:20.04
# 运行容器并挂载tmpfs
docker run -d --name mycontainer --tmpfs /tmp ubuntu:20.045.4 删除卷
删除Docker卷。
命令:
bash
# 删除卷
docker volume rm myvolume
# 删除所有未使用的卷
docker volume prune
# 删除所有卷
docker volume prune -f6. Docker存储驱动
6.1 什么是存储驱动
存储驱动是Docker用于管理容器文件系统的组件。
存储驱动的作用:
| 作用 | 说明 |
|---|---|
| 文件系统管理 | 管理容器文件系统 |
| 镜像分层 | 实现镜像分层存储 |
| 容器隔离 | 提供容器文件系统隔离 |
| 性能优化 | 优化文件系统性能 |
6.2 存储驱动类型
Docker支持多种存储驱动。
存储驱动类型:
| 驱动 | 说明 |
|---|---|
| overlay2 | 默认存储驱动,推荐使用 |
| aufs | 旧版存储驱动,适用于Ubuntu |
| devicemapper | 设备映射驱动,适用于CentOS |
| btrfs | Btrfs文件系统驱动 |
| zfs | ZFS文件系统驱动 |
6.3 配置存储驱动
配置Docker的存储驱动。
配置方法:
bash
# 查看当前存储驱动
docker info | grep "Storage Driver"
# 配置存储驱动
sudo vim /etc/docker/daemon.json配置示例:
json
{
"storage-driver": "overlay2"
}7. 实战案例
案例1:容器间通信
场景:创建两个容器,实现它们之间的通信。
步骤:
bash
# 1. 创建自定义网络
docker network create mynetwork
# 2. 运行第一个容器
docker run -d --name container1 --network mynetwork ubuntu:20.04 sleep infinity
# 3. 运行第二个容器
docker run -d --name container2 --network mynetwork ubuntu:20.04 sleep infinity
# 4. 测试容器间通信
docker exec -it container1 ping container2
# 5. 查看容器IP
docker inspect container1 | grep -A 10 "IPAddress"
docker inspect container2 | grep -A 10 "IPAddress"
# 6. 删除容器和网络
docker rm -f container1 container2
docker network rm mynetwork案例2:容器数据持久化
场景:使用Docker卷实现容器数据持久化。
步骤:
bash
# 1. 创建Docker卷
docker volume create datavolume
# 2. 运行容器并挂载卷
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=root -v datavolume:/var/lib/mysql mysql:8.0
# 3. 进入容器
docker exec -it mysql mysql -u root -p
# 4. 在容器中创建数据库
CREATE DATABASE test;
USE test;
CREATE TABLE users (id INT, name VARCHAR(255));
INSERT INTO users VALUES (1, 'test');
SELECT * FROM users;
EXIT;
# 5. 停止并删除容器
docker stop mysql
docker rm mysql
# 6. 重新运行容器并挂载相同的卷
docker run -d --name mysql2 -e MYSQL_ROOT_PASSWORD=root -v datavolume:/var/lib/mysql mysql:8.0
# 7. 进入新容器
docker exec -it mysql2 mysql -u root -p
# 8. 验证数据是否存在
USE test;
SELECT * FROM users;
EXIT;
# 9. 停止并删除容器
docker stop mysql2
docker rm mysql2
# 10. 删除卷
docker volume rm datavolume案例3:多容器应用网络配置
场景:配置多容器应用的网络。
步骤:
bash
# 1. 创建自定义网络
docker network create appnetwork
# 2. 运行MySQL容器
docker run -d --name mysql --network appnetwork -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=app mysql:8.0
# 3. 运行Redis容器
docker run -d --name redis --network appnetwork redis
# 4. 运行Web应用容器
docker run -d --name web --network appnetwork -p 8080:80 --link mysql:mysql --link redis:redis nginx
# 5. 查看容器网络
docker network inspect appnetwork
# 6. 测试容器间通信
docker exec -it web ping mysql
docker exec -it web ping redis
# 7. 停止并删除容器
docker stop mysql redis web
docker rm mysql redis web
# 8. 删除网络
docker network rm appnetwork8. 常见问题
问题1:容器间无法通信
问题:Docker容器之间无法通信。
解决方法:
bash
# 检查容器是否在同一网络
docker network inspect bridge | grep -A 10 "Containers"
# 检查网络配置
docker inspect container-name | grep -A 20 "Networks"
# 检查防火墙设置
sudo iptables -L
# 重新创建网络
docker network create mynetwork
docker run -d --name container1 --network mynetwork ubuntu:20.04
docker run -d --name container2 --network mynetwork ubuntu:20.04问题2:容器无法访问外部网络
问题:Docker容器无法访问外部网络。
解决方法:
bash
# 检查容器网络
docker inspect container-name | grep -A 20 "Networks"
# 检查DNS配置
docker exec -it container-name cat /etc/resolv.conf
# 检查网络连接
docker exec -it container-name ping google.com
# 检查Docker网络配置
sudo vim /etc/docker/daemon.json问题3:数据丢失
问题:Docker容器数据丢失。
解决方法:
bash
# 使用Docker卷
docker run -d --name container-name -v volume-name:/data image-name
# 使用绑定挂载
docker run -d --name container-name -v /host/path:/container/path image-name
# 备份容器数据
docker cp container-name:/path/to/data /host/path
# 检查卷状态
docker volume inspect volume-name问题4:存储驱动错误
问题:Docker存储驱动错误。
解决方法:
bash
# 查看当前存储驱动
docker info | grep "Storage Driver"
# 检查存储驱动配置
sudo cat /etc/docker/daemon.json
# 检查文件系统
df -T
# 重新配置存储驱动
sudo vim /etc/docker/daemon.json课程总结
这节课我们学习了Docker网络和存储详解。
核心内容:
- Docker网络概述(什么是Docker网络、Docker网络类型)
- Docker网络管理(查看网络、创建网络、连接容器、删除网络)
- Docker网络模式详解(bridge模式、host模式、none模式、overlay模式)
- Docker存储概述(什么是Docker存储、Docker存储类型)
- Docker存储管理(查看卷、创建卷、使用卷、删除卷)
- Docker存储驱动(什么是存储驱动、存储驱动类型、配置存储驱动)
- 实战案例(容器间通信、容器数据持久化、多容器应用网络配置)
- 常见问题
重要命令:
docker network ls:查看Docker网络docker network create:创建Docker网络docker network connect:连接容器到网络docker network rm:删除Docker网络docker volume ls:查看Docker卷docker volume create:创建Docker卷docker volume rm:删除Docker卷docker run -v:挂载卷到容器docker run --network:指定容器网络
Docker网络和存储是Docker的核心功能,掌握这些知识后,我们将在后续课程中学习Docker Compose使用、Docker容器化部署实战等内容。
课后练习
练习1(基础)
创建一个自定义网络,并在网络中运行两个容器,测试它们之间的通信。
练习2(进阶)
使用Docker卷实现MySQL容器的数据持久化。
练习3(拓展)
配置一个多容器应用的网络,包括MySQL、Redis和Web应用。