跳转到内容

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 mymacvlan

2.3 连接容器

将容器连接到网络。

命令

bash
# 运行容器时连接网络
docker run -d --name mycontainer --network mybridge ubuntu:20.04

# 将运行中的容器连接到网络
docker network connect mybridge mycontainer

# 将容器从网络断开
docker network disconnect mybridge mycontainer

2.4 删除网络

删除Docker网络。

命令

bash
# 删除网络
docker network rm mybridge

# 删除所有未使用的网络
docker network prune

# 删除所有网络
docker network prune -f

3. 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 nginx

4. Docker存储概述

4.1 什么是Docker存储

Docker存储是Docker容器数据持久化的方式。

Docker存储的定义: Docker存储是Docker容器数据持久化的方式,它允许容器数据在容器重启后依然存在。

Docker存储的作用

作用说明
数据持久化容器数据持久化
数据共享容器之间共享数据
数据备份容器数据备份
数据迁移容器数据迁移

4.2 Docker存储类型

Docker支持多种存储类型。

Docker存储类型

类型说明
volumeDocker管理的卷
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 myvolume

5.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.04

5.4 删除卷

删除Docker卷。

命令

bash
# 删除卷
docker volume rm myvolume

# 删除所有未使用的卷
docker volume prune

# 删除所有卷
docker volume prune -f

6. Docker存储驱动

6.1 什么是存储驱动

存储驱动是Docker用于管理容器文件系统的组件。

存储驱动的作用

作用说明
文件系统管理管理容器文件系统
镜像分层实现镜像分层存储
容器隔离提供容器文件系统隔离
性能优化优化文件系统性能

6.2 存储驱动类型

Docker支持多种存储驱动。

存储驱动类型

驱动说明
overlay2默认存储驱动,推荐使用
aufs旧版存储驱动,适用于Ubuntu
devicemapper设备映射驱动,适用于CentOS
btrfsBtrfs文件系统驱动
zfsZFS文件系统驱动

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 appnetwork

8. 常见问题

问题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应用。

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径