天天看点

DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

文章目录

  • 1. Docker 基础网络介绍
    • 1.1 外部访问容器
      • 1.1.1 映射所有端口地址
      • 1.1.2 映射到指定地址的指定端口
      • 1.1.3 映射到指定地址的任意端口
      • 1.1.4 查看映射端口配置
    • 1.2 容器互联
      • 1.2.1 新建网络
      • 1.2.2 连接容器
      • 1.2.3 配置 DNS
  • 2. 高级网络配置
    • 2.1 快速配置指南
    • 2.2 容器访问控制
      • 2.2.1 容器访问外部网络
      • 2.2.2 容器之间访问
      • 2.2.3 访问所有端口
      • 2.2.4 访问指定端口
    • 2.3 映射容器端口到宿主主机的实现
      • 2.3.1 容器访问外部实现
      • 2.3.2 外部访问容器实现
      • 2.3.3 访问所有端口
      • 2.3.4 访问指定端口
    • 2.4 自定义网桥
      • 2.4.1 容器访问外部实现
      • 2.4.2 外部访问容器实现
      • 2.4.3 访问所有端口
      • 2.4.4 访问指定端口
    • 2.5 工具和示例
      • 2.4.1 容器访问外部实现
      • 2.4.2 外部访问容器实现
      • 2.4.3 访问所有端口
      • 2.4.4 访问指定端口
    • 2.6 编辑网络配置文件
    • 2.7 实例:创建一个点到点连接

Docker

允许通过外部访问容器或容器互联的方式来提供网络服务。

1. Docker 基础网络介绍

1.1 外部访问容器

当使用

-P

标记时,

Docker

随机映射

一个端口到内部容器开放的网络端口。

使用

docker container ls

可以看到,本地主机的

49154

被映射到了容器的

80

端口。此时访问本机的

49154

端口(本机访问

http://localhost:49154

)即可访问容器内

nginx

默认页面。

DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置
DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

访问之后,可以通过

docker logs continerID

查看访问日志:

DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

-p

则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有:

  • ip:hostPort:containerPort

  • ip::containerPort

  • hostPort:containerPort

示例如下:

DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

访问:

http://localhost:4172

DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

查看日志:

DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

1.1.1 映射所有端口地址

使用

hostPort:containerPort

格式本地的

80

端口映射到容器的

80

端口,可以执行:

docker run -d -p 80:80 nginx:alpine
           

此时默认会绑定本地所有接口上的所有地址。访问:

http://localhost

即可看到

nginx

页面。

1.1.2 映射到指定地址的指定端口

可以使用

ip:hostPort:containerPort

格式指定映射使用一个特定地址,比如

localhost

地址

127.0.0.1

docker run -d -p 127.0.0.1:80:80 nginx:alpine
           

1.1.3 映射到指定地址的任意端口

使用

ip::containerPort

绑定

localhost

的任意端口到容器的

80

端口,本地主机会

自动分配

一个端口。

docker run -d -p 127.0.0.1::80 nginx:alpine
           
DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

还可以使用

udp

标记来指定

udp

端口

docker run -d -p 127.0.0.1:80:80/udp nginx:alpine
           
DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

1.1.4 查看映射端口配置

使用

docker port containerID portID

来查看当前映射的端口配置,也可以查看到绑定的地址

docker port 1aae 80
127.0.0.1:12500
           
DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

注意:

  • 容器有自己的内部网络和

    ip

    地址(使用

    docker inspect

    查看,

    Docker

    还可以有一个可变的网络配置。)
  • -p

    标记可以多次使用来绑定多个端口

例如

$ docker run -d \
    -p 80:80 \
    -p 443:443 \
    nginx:alpine
           
DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

1.2 容器互联

如果你之前有

Docker

使用经验,你可能已经习惯了使用

--link

参数来进行容器互联。

然而,随着

Docker

网络的完善,这种方式已不是最优策略,强烈建议大家将容器加入自定义的

Docker

网络来连接多个容器,而不是使用

--link

参数。

1.2.1 新建网络

首先,我们来新建一个

Docker

网络:

docker network create -d bridge dnet
           

-d

参数用来指定

Docker

网络类型,有

bridge

overlay

两种,其中

overlay

网络类型用于 Swarm mode,这里我们先忽略此概念。

1.2.2 连接容器

运行一个容器并连接到新建的

dnet

网络:

docker run -it --rm --name busybox1 --network dnet busybox sh
           

打开新的终端,再运行一个容器并加入到

dnet

网络:

docker run -it --rm --name busybox2 --network dnet busybox sh
           

再打开一个新的终端查看容器信息:

DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

下面通过

ping

来证明

busybox1

容器和

busybox2

容器建立了互联关系。

busybox1

容器输入以下命令:

/ # ping busybox2
           

截图如下:

DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

ping

来测试连接

busybox2

容器,它会解析成

172.18.0.3

同理,在

busybox2

容器执行

ping busybox1

容器,也可以成功连接。

DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

这就证明,

busybox1

容器和

busybox2

容器建立了互联关系。可以看到,这种

Docker

网络构建的方式非常简单。

ps:

如果你有多个容器之间需要互相连接,推荐使用

Docker Compose

1.2.3 配置 DNS

如何自定义配置容器的主机名和

DNS

呢?秘诀就是

Docker

利用虚拟文件来挂载容器的 3 个相关配置文件。

在 容器 中使用

mount

命令可以看到挂载信息:

未找到相应文件和路径,此处暂时略过

2. 高级网络配置

Docker

启动时,会自动在主机上创建一个

docker0

虚拟网桥,实际上是

Linux

的一个

bridge

,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。

同时,

Docker

随机分配一个本地未占用的私有网段(在 RFC1918中定义)中的一个地址给

docker0

接口。比如典型的

172.17.42.1

,掩码为

255.255.0.0

。此后启动的容器内的网口也会自动分配一个同一网段(

172.17.0.0/16

)的地址。

当创建一个

Docker

容器的时候,同时会创建了一对

veth pair

接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即

eth0

;另一端在本地并被挂载到

docker0

网桥,名称以

veth

开头(例如

vethAQI2QT

)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。

Docker

就创建了在主机和所有容器之间一个虚拟共享网络。

DatawhaleTL24 | Docker Task04:网络1. Docker 基础网络介绍2. 高级网络配置

2.1 快速配置指南

Docker

网络相关命令列表:

部分命令选项只有在

Docker

服务启动的时候才能配置,而且不能马上生效。

  • -b BRIDGE 或 --bridge=BRIDGE 指定容器挂载的网桥
  • –bip=CIDR 定制 docker0 的掩码
  • -H SOCKET… 或 --host=SOCKET… Docker 服务端接收命令的通道
  • –icc=true|false 是否支持容器之间进行通信
  • –ip-forward=true|false 请看下文容器之间的通信
  • –iptables=true|false 是否允许 Docker 添加 iptables 规则
  • –mtu=BYTES 容器网络中的 MTU

2.2 容器访问控制

容器的访问控制,主要通过

Linux

上的

iptables

防火墙来进行管理和实现。

iptables

Linux

上默认的防火墙软件,在大部分发行版中都自带。

2.2.1 容器访问外部网络

容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。

sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
           

如果为 0,说明没有开启转发,则需要手动打开。

如果在启动

Docker

服务的时候设定

--ip-forward=true

,

Docker

就会自动设定系统的

ip_forward

参数为 1

2.2.2 容器之间访问

容器之间相互访问,需要两方面的支持。

  • 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到

    docker0

    网桥上。
  • 本地系统的防火墙软件

    -- iptables

    是否允许通过

2.2.3 访问所有端口

当启动

Docker

服务(即

dockerd

)的时候,默认会添加一条转发策略到本地主机

iptables

FORWARD

链上。策略为通过(

ACCEPT

)还是禁止(

DROP

)取决于配置

--icc=true

(缺省值)还是

--icc=false

。当然,如果手动指定

--iptables=false

则不会添加

iptables

规则。

可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在

/etc/docker/daemon.json ( WSL2 : ~/.docker/.daemon.json)

文件中配置

{"icc": false}

来禁止它。

2.2.4 访问指定端口

通过

-icc=false

关闭网络访问后,还可以通过

--link=CONTAINER_NAME:ALIAS

选项来访问容器的开放端口。

例如,在启动

Docker

服务时,可以同时使用

icc=false --iptables=true

参数来关闭允许相互的网络访问,并让

Docker

可以修改系统中的

iptables

规则。

此时,系统中的

iptables

规则可能是类似

下边省略的太多了,进行不下去了

2.3 映射容器端口到宿主主机的实现

2.3.1 容器访问外部实现

2.3.2 外部访问容器实现

2.3.3 访问所有端口

2.3.4 访问指定端口

2.4 自定义网桥

2.4.1 容器访问外部实现

2.4.2 外部访问容器实现

2.4.3 访问所有端口

2.4.4 访问指定端口

2.5 工具和示例

2.4.1 容器访问外部实现

2.4.2 外部访问容器实现

2.4.3 访问所有端口

2.4.4 访问指定端口

2.6 编辑网络配置文件

2.7 实例:创建一个点到点连接