|
@@ -1,115 +0,0 @@
|
|
|
-# docker network
|
|
|
-
|
|
|
-## Docker 网络类型
|
|
|
-
|
|
|
-Docker安装时会自动在Docker Host上创建三个网络,bridge,host,none三个。我们可以在运行docker容器的时候使用`--network=`参数来指定网络。
|
|
|
-
|
|
|
-### none网络
|
|
|
-
|
|
|
-Docker的none网络就是不连接网络,使用none类型的容器只有lo网络,不能够外部设备互通。
|
|
|
-
|
|
|
-none类型网络的应用场景一般是个理性比较强的容器,无需与外界进行联系。
|
|
|
-
|
|
|
-`--network=none`
|
|
|
-
|
|
|
-### host网络
|
|
|
-
|
|
|
-Docke的host网络是与Docker Host共享网络配置,使用host类型的容器网络配置与host完全一样,包括Docker Host的hostname。
|
|
|
-
|
|
|
-host网络的优点是能够保障网络的性能,但是要注意端口冲突的问题。
|
|
|
-
|
|
|
-`--network=host`
|
|
|
-
|
|
|
-### bridge网络
|
|
|
-
|
|
|
-Docker 安装的时候会创建一个叫做"docker0"的桥街网络,在不指定容器的网络时默认加入docker0,
|
|
|
-
|
|
|
-### user-defined网络
|
|
|
-
|
|
|
-除了docker安装时创建的三个网络外,我们还可以自定义网络。
|
|
|
-
|
|
|
-在单主机定义网络一般为bridge类型网络。
|
|
|
-
|
|
|
-`docker network create --driver bridge 网络名`
|
|
|
-
|
|
|
-如果需要指定子网的话可以在创建时添加子网信息。
|
|
|
-
|
|
|
-`docker network create --driver bridge --subnet 192.168.100.0/24 --gateway 192.168.100.1 网络名`
|
|
|
-
|
|
|
-## Docker 网络配置
|
|
|
-
|
|
|
-### 指定容器网络
|
|
|
-
|
|
|
-配置Docker容器网络可以在启动容器的时候就指定网络,也可以在运行容器后添加网络到容器内。
|
|
|
-
|
|
|
-```shell
|
|
|
-# 启动容器时指定网络
|
|
|
-eziota@ubuntu:~$ docker run -it --network=bridge centos /bin/bash
|
|
|
-[root@a257edbe3aa2 /]# ip a
|
|
|
-1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
|
|
|
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|
|
|
- inet 127.0.0.1/8 scope host lo
|
|
|
- valid_lft forever preferred_lft forever
|
|
|
-19: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
|
|
|
- link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
|
|
|
- inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
|
|
|
- valid_lft forever preferred_lft forever
|
|
|
-```
|
|
|
-
|
|
|
-### 创建网络
|
|
|
-
|
|
|
-除了使用docker默认提供的网络外,我们还可以创建网络来使用。
|
|
|
-
|
|
|
-#### 创建bridge类型网络
|
|
|
-
|
|
|
-创建bridge网络使用下面的命令就可以
|
|
|
-
|
|
|
-`docker network create --driver bridge 网络名`
|
|
|
-
|
|
|
-在创建bridge网络同时我们还可以指定子网和网关
|
|
|
-
|
|
|
-`docker network create --driver bridge --subnet 子网 --gateway 网关 网络名`
|
|
|
-
|
|
|
-### 容器间通信
|
|
|
-
|
|
|
-Docker容器一般是互相隔离的,但是在实际使用中我们还是会进行一些通信的。
|
|
|
-
|
|
|
-容器之间的通信有三种实现方法,基于IP的通信、基于Docker DNS Server的通信 基于joined的通信。
|
|
|
-
|
|
|
-#### 基于IP的通信
|
|
|
-
|
|
|
-基于IP的通信很好理解,就是将容器规划到同一个子网中,分配IP,使用IP访问其他容器。
|
|
|
-
|
|
|
-每个容器都可以添加多个网络。
|
|
|
-
|
|
|
-![基于IP的通信](images/5.12_docker_network_ip.png)
|
|
|
-
|
|
|
-#### 基于Docker DNS Server的通信
|
|
|
-
|
|
|
-使用基于IP的通信方式虽然能满足通信的要求,但是不够灵活,需要启动容器后获取ip然后再进行网络配置,比较麻烦。
|
|
|
-
|
|
|
-也可使用DNS服务来解决。
|
|
|
-
|
|
|
-在启动容器时使用`--name=`来指定容器名,这样就可以实现Docker DNS进行通信。
|
|
|
-
|
|
|
-> 只能使用在用户创建的网络中。
|
|
|
->
|
|
|
-> 只能在同一个子网中
|
|
|
-
|
|
|
-#### 基于joined的通信
|
|
|
-
|
|
|
-上面两种通信方式都是基于子网和IP进行通信,但是在与一些场景中,我们还可以使用joined容器的方式来进行通信。
|
|
|
-
|
|
|
-`--network=contrainer:目标容器`
|
|
|
-
|
|
|
-使用joined容器的方式来进行通信,两个容器内的网络配置完全一样,可以使用lo来访问其他容器。
|
|
|
-
|
|
|
-### 容器与外部访问
|
|
|
-
|
|
|
-#### 容器访问外部
|
|
|
-
|
|
|
-默认容器是使用NAT的方式来访问外部网络,并且经过转换后的地址是Docker Host的地址。
|
|
|
-
|
|
|
-#### 外部访问容器
|
|
|
-
|
|
|
-外部网络访问容器需要使用端口映射的方式,将容器的端口映射到Docker Host地址的端口上,外部网络设备访问对应的端口来实现和docker容器的交流。
|