docker-compose网络配置

背景

使用docker-compose来配置服务,需要了解下其network配置。

默认情况下,Compose会为我们的应用创建一个网络,服务的每个容器都会加入该网络中。这样,容器就可被该网络中的其他容器访问,不仅如此,该容器还能以服务名称作为hostname被其他容器访问。

默认情况下,应用程序的网络名称基于Compose的工程名称,而项目名称基于docker-compose.yml所在目录的名称。如需修改工程名称,可使用–project-name标识或COMPOSE_PORJECT_NAME环境变量。

使用缺省配置

假设我们在一个temp1的文件夹下创建如下docker file文件docker-compose.yml,内容如下

1
2
3
4
5
6
7
version: '3'
services:
website:
image: tomcat:8
container_name: tomcat8
ports:
- "8080:8080"

里面内容是启动一个tomcat的容器,版本是8,执行如下命令拉取镜像以及拉起容器

1
docker-compose up -d

输入类似如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
temp1  docker-compose up -d
Creating network "temp1_default" with the default driver
Pulling website (tomcat:8)...
8: Pulling from library/tomcat
a4d8138d0f6b: Pull complete
dbdc36973392: Pull complete
f59d6d019dd5: Pull complete
aaef3e026258: Pull complete
5e86b04a4500: Pull complete
1a6643a2873a: Pull complete
eabf1bdcaba7: Pull complete
706f1ef2eda1: Pull complete
56d050fce664: Pull complete
437f4f862457: Pull complete
Creating tomcat8 ... done

通过浏览器查看8080页面,可以看到tomcat已经跑起来(真的很方便~~)

表示容器已经创建好了,这时我们通过命令docker network ls来查看docker已有的网络配置,将会发现多了一个名为temp1_default的网络

1
2
3
4
5
6
7
8
☁  temp1  docker network ls
NETWORK ID NAME DRIVER SCOPE
254baacd2600 bigdata_default bridge local
55a6841ecaec bridge bridge local
8261119fbc6e hadoop_net bridge local
13055d2cf862 host host local
f249671a0adf none null local
10dad05ab546 temp1_default bridge local

使用docker inspect temp1_default或者docker inspect tomcat1将会发现他们是在同一个网段下,同时进去tomcat容器里,会发现可以通过服务名website以及容器名tomcat8来访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@6e88dcec4afb:/usr/local/tomcat# ping website
PING website (172.19.0.2) 56(84) bytes of data.
64 bytes from 6e88dcec4afb (172.19.0.2): icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 6e88dcec4afb (172.19.0.2): icmp_seq=2 ttl=64 time=0.090 ms
64 bytes from 6e88dcec4afb (172.19.0.2): icmp_seq=3 ttl=64 time=0.118 ms
^C64 bytes from 6e88dcec4afb (172.19.0.2): icmp_seq=4 ttl=64 time=0.080 ms
^C
--- website ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3097ms
rtt min/avg/max/mdev = 0.032/0.080/0.118/0.031 ms
root@6e88dcec4afb:/usr/local/tomcat# ping tomcat8
PING tomcat8 (172.19.0.2) 56(84) bytes of data.
64 bytes from 6e88dcec4afb (172.19.0.2): icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from 6e88dcec4afb (172.19.0.2): icmp_seq=2 ttl=64 time=0.070 ms
^C

制定项目名

制定启动项目名来网络隔离项目

1
docker-compose -p temp2 up -d

打印如下

1
2
Creating network "temp2_default" with the default driver
Creating tomcat8 ... done

这样就创建了temp2_default的网络

通过文件来制定

显式使用已有的网络

修改dockerfile如下

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3'
services:
website:
image: tomcat:8
container_name: tomcat8
ports:
- "8080:8080"
networks:
- web_network
networks:
web_network: # 需要显示调用
external:
name: temp2_default

这里需要显示调用网络名web_network

使用缺省的网络名

修改dockerfile如下

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3'
services:
website:
image: tomcat:8
container_name: tomcat8
ports:
- "8080:8080"
networks:
- web_network
networks:
web_network: # 需要显示调用
external:
name: temp2_default

指定多网卡

修改dockerfile如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'
services:
website:
image: tomcat:8
container_name: tomcat8
ports:
- "8080:8080"
networks:
- website
- bigdata
networks:
website: # 不用指明
external:
name: temp2_default
bigdata:
external:
name: bigdata_default

可以通过docker inspect tomcat8来观察到对应的两个ip,可以访问两个网络

原创技术分享,您的支持将鼓励我继续创作