Docker 容器通信方式

桥接网络

Docker 通过 Namespace 的机制实现了容器的隔离,其中就包括 Network Namespace。因为每个容器都有独立的 Network Namespace,所以不能直接通过端口访问其他容器的服务。但可以创建一个 Network Namespace,然后设置到多个 Docker 容器,这样这些容器就在一个 Namespace 下了,如此就可以直接访问对应端口了。这种就是桥接网络

通过 docker network 来创建:

1
docker network create common-network

docker run 时通过 --network 指定桥接网络为刚才创建的那个。除了主容器外,其他和主容器通信的容器都不用暴露端口了

1
docker run -d --network common-network -v D:/Docker/redis:/data --name redis-container redis

容器中的业务代码里的**host**填写需要通信的容器的容器名即可

1
2
3
4
5
6
7
8
9
// ...
TypeOrmModule.forRoot({
type: 'mysql',
host: 'mysql-container',
port: 3306,
username: 'root',
password: '123456',
// ..

docker-compose 中 配置通过 _<font style="color:rgb(37, 41, 51);">networkds</font>_,或者不配置 _<font style="color:rgb(37, 41, 51);">networkds</font>_docker-compose 会生成一个默认的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
version: "3.8"
services:
nest-app:
build:
context: ./
dockerfile: ./Dockerfile
depends_on:
- mysql-container
- redis-container
ports:
- "3000:3000"
# 可不配置
networks:
- common-network
mysql-container:
image: mysql
volumes:
- /Users/guang/mysql-data:/var/lib/mysql
# 可不配置
networks:
- common-network
redis-container:
image: redis
volumes:
- /Users/guang/aaa:/data
networks:
- common-network
# 可不配置
networks:
common-network:
driver: bridge

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!