全面图解 Docker 架构设计:掌握 Docker 全链路思维 / 实战 / 优化 (小白到大师篇 [3])
![全面图解Docker架构设计:掌握Docker全链路思维/实战/优化(小白到大师篇[3])](https://static001.geekbang.org/infoq/a4/a424faedc7c91ebb94c5a9a11b0b4b72.webp)

Docker 是一个革命性的开放平台,用于开发、交付和运行应用程序。通过使用 Docker,开发者可以打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何支持 Docker 的环境中,在不同环境中实现一致的运行。无论是在虚拟机、物理服务器、数据中心还是云平台,Docker 都能确保应用的快速、可靠地部署和运行。
Docker 提供的不仅仅是容器,它还构建了一个庞大的生态系统,包括 Docker Hub、Docker Compose、Docker Swarm 等工具,这些工具涵盖了从开发到生产、从单一容器到容器编排的全方位需求。Docker 还支持多种编程语言、框架和中间件,使其成为现代应用开发和部署的首选工具。
肖哥弹架构 跟大家“弹弹” 高并发锁, 关注公号回复 'mvcc' 获得手写数据库事务代码
欢迎 点赞,关注,评论。
关注公号 Solomon 肖哥弹架构获取更多精彩内容
历史热点文章
本节内容

8、Docker 网络配置
8.1 网络类型
Docker 网络配置是 Docker 容器化技术的重要组成部分,它允许容器与外部世界进行通信。Docker 提供了多种网络驱动来满足不同的网络需求

图解释:
Docker Daemon: Docker 守护进程,负责管理 Docker 容器和网络。
Containers: Docker 容器,运行用户的应用。
Networks: Docker 网络,管理容器的网络连接。
网络类型:
Bridge (Docker0) : Docker 默认的网络类型,创建一个虚拟网桥,使得容器之间以及容器与外部网络之间可以通信。
Overlay: 用于 Docker Swarm 模式的跨主机通信,使得不同物理主机上的容器可以互相发现和通信。
Host: 将容器的网络堆栈直接与宿主机相连,容器将使用宿主机的网络。
Macvlan: 使得容器拥有独立的 MAC 地址,可以像物理设备一样在网络中表现。
网络详细:
虚拟网桥 (Docker0) : Docker 安装后自动创建的虚拟网桥,容器通过这个网桥与外部通信。
隔离: 每个容器都有自己独立的网络接口和 IP 地址,实现网络隔离。
跨主机通信: Overlay 网络允许 Swarm 模式下的不同主机上的容器进行通信。
直接使用宿主机网络: 使用 Host 网络的容器将直接使用宿主机的网络接口和 IP 地址。
虚拟接口: Macvlan 网络为容器创建虚拟接口,使其看起来像物理网络设备。
分配子网: Macvlan 网络为容器分配独立的子网。
8.2 网络详解
1. 默认网络

bridge: Docker 默认的网络驱动,创建一个虚拟的以太网桥,每个容器都会连接到这个虚拟网络并分配一个 IP 地址。
docker0: Docker 安装后自动创建的虚拟网桥,容器会连接到这个网桥并从网桥分配 IP 地址。
容器数据流转

2. 网络命名空间
network namespace: Linux 网络命名空间,它提供了网络环境的隔离,每个容器都有自己的网络命名空间。
3. 容器网络接口
eth0: 容器内部的网络接口,通常会连接到虚拟网桥。
veth: 一对虚拟网络接口,用于容器与宿主机之间的通信。
4. 自定义网络
user-defined networks: 用户可以创建自定义网络,这些网络可以是 bridge、overlay 或 host 类型。
5. 网络配置命令
docker network create: 创建一个新的 Docker 网络。
docker network ls: 列出现有的 Docker 网络。
docker network connect: 将容器连接到一个网络。
docker network disconnect: 将容器从网络断开。
docker network inspect: 查看网络的详细信息。
8.3 网络创建方式
1. Bridge 网络
Bridge 网络是 Docker 默认的网络类型,适合大多数容器化应用。
创建 Bridge 网络:
my-bridge-network
是您要创建的网络名称。此命令创建了一个新的 Bridge 网络。
应用到容器:
运行一个 Nginx 容器,并将其连接到
my-bridge-network
网络。
2. Overlay 网络
Overlay 网络用于多宿主机之间的容器通信,常见于 Docker Swarm 模式。
创建 Overlay 网络 (在 Docker Swarm 模式下):
首先初始化 Docker Swarm 模式。
my-overlay-network
是您要创建的网络名称。Overlay 网络允许不同物理主机上的容器进行通信。
应用到容器 (在 Docker Swarm 模式下):
创建一个包含 3 个副本的 Nginx 服务,并将其连接到
my-overlay-network
网络。
3. Host 网络
Host 网络将容器的网络堆栈直接连接到宿主机,使得容器共享宿主机的网络命名空间。
应用到容器 (不需要创建,使用时指定):
运行一个 Nginx 容器,并将其网络堆栈直接绑定到宿主机。
4. Macvlan 网络
Macvlan 网络允许容器拥有独立的 MAC 地址,看起来就像物理主机一样。
创建 Macvlan 网络:
--driver macvlan
指定网络驱动为 Macvlan。--subnet
指定子网。--gateway
指定网关。my-macvlan-network
是您要创建的网络名称。
应用到容器:
运行一个 Nginx 容器,并将其连接到
my-macvlan-network
网络。
使用场景:
Bridge: 适用于大多数单主机容器通信。
Overlay: 适用于多主机容器通信,如 Docker Swarm。
Host: 适用于需要访问宿主机网络接口的容器。
Macvlan: 适用于需要独立网络接口的容器,如网络服务或测试。
9、DockerFile
Dockerfile 是一个文本文件,它包含了用于构建 Docker 镜像的一系列指令和参数。以下是 Dockerfile 的常见结构和组成部分:
完整案例
解释
基础镜像: 使用
ubuntu:20.04
作为基础镜像。维护者信息: 使用
LABEL
替代已废弃的MAINTAINER
。环境变量: 设置环境变量
MY_ENV_VAR
和更新PATH
。更新和安装软件: 使用
RUN
安装软件包。工作目录: 设置工作目录为
/app
。复制文件: 使用
COPY
和ADD
将文件添加到镜像中。挂载点: 定义一个挂载点。
暴露端口: 声明容器运行时监听的端口。
默认命令: 设置容器启动时执行的默认命令。
构建阶段: 使用
builder
阶段编译应用。生产阶段: 使用
production
阶段运行应用。健康检查: 定义容器的健康检查命令。
用户: 指定运行命令的用户。
构建缓存: 使用
ARG
定义构建时的变量。停止信号: 配置停止容器的信号。
SHELL: 指定用于执行指令的 shell。
命令详细说明
基础镜像指令 (
FROM
)
FROM
指令指定了基础镜像,这是构建新镜像的基础。
维护者指令 (
MAINTAINER
) (可选,已废弃,建议使用 LABEL)
LABEL
用于添加元数据,替代了以前的MAINTAINER
指令。
环境变量指令 (
ENV
)
ENV
用于设置环境变量。
工作目录指令 (
WORKDIR
)
WORKDIR
设置容器内的当前工作目录。
复制指令 (
COPY
和ADD
)
COPY
从构建上下文复制新文件或目录到容器的文件系统。ADD
与COPY
类似,但处理归档文件时有额外的功能。
运行指令 (
RUN
)
RUN
指令用于执行命令,并将其结果(如安装的软件)作为新的镜像层保存。
暴露指令 (
EXPOSE
)
EXPOSE
指令通知 Docker 守护进程容器运行时监听的端口。
启动命令指令 (
CMD
)
CMD
指令指定了容器启动时执行的默认命令。
健康检查指令 (
HEALTHCHECK
)
HEALTHCHECK
指令用于指定如何检查容器健康状况。
构建缓存指令 (
ARG
)
ARG
指令用于定义构建过程中的变量。
多阶段构建 (
FROM
在 Dockerfile 中多次使用)
使用多阶段构建可以减小最终镜像的大小,将构建产物从构建阶段复制到生产环境镜像。
10、DockerFile 实战案例
第一个案例是 Spring Boot 应用,第二个案例是一个使用 Spring Boot 和 MyBatis 的多模块项目。
10.1 案例 1:Spring Boot 应用
项目结构
假设我们的 Spring Boot 应用结构如下:
HelloController.java
是 Spring Boot 控制器。Application.java
是 Spring Boot 应用的主程序。application.properties
包含应用配置。pom.xml
是 Maven 构建配置文件。
Dockerfile
构建和运行 Docker 镜像
构建镜像:
运行容器:
10.2 案例 2:Spring Boot 和 MyBatis 多模块项目
项目结构
多模块 Spring Boot 和 MyBatis 应用结构如下:
CommonService.java
是一个通用服务。ApiController.java
是 Spring Boot 控制器。BusinessService.java
是业务逻辑服务。UserMapper.xml
是 MyBatis 映射文件。pom.xml
是 Maven 构建配置文件。
Dockerfile
构建和运行 Docker 镜像
构建镜像:
运行容器:
版权声明: 本文为 InfoQ 作者【肖哥弹架构】的原创文章。
原文链接:【http://xie.infoq.cn/article/fdc2b15f306c9d28e9397ea34】。文章转载请联系作者。
评论