從「虛擬機」轉戰到容器環境時,最容易產生的疑問是容器之間該如何溝通,其實就跟「虛擬機」的環境一樣,透過 IP 或者 URL 的 DNS 解析,指到對應的「虛擬機」即可溝通。
Docker Container 也是一樣,每次產生一個容器或者重新生成容器都會對應到一個浮動 IP,當Container 移除後 IP 會立即釋放,因此不建議透過 IP 溝通,而是應該採用容器名稱(可以想像成 URL 的 DNS 解析),來達到彼此溝通,以下會示範該如何讓容器之間彼此互相溝通。
version: '3.1'
services:
redis6379:
image: redis:alpine
container_name: Test_6379
restart: always
ports:
- 6379:6379
redis-admin:
image: erikdubbelboer/phpredisadmin
container_name: redisAdminer
restart: always
ports:
- 8080:80
volumes:
- ./config.inc.php:/src/app/includes/config.inc.php
執行完 docker-compose up -d
後在開啟 RedisAdmin 就可以看見 RedisAdmin 已經與 Test_6379
完成連線。
version: '3.1'
services:
db:
image: mysql:5.6
container_name: db
# DB型別為utf8mb4 ...
command: ['--character-set-server=utf8', '--collation-server=utf8_unicode_ci', --default-authentication-plugin=mysql_native_password]
restart: always
ports:
- 3306:3306
environment:
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: qwe1234
MYSQL_DATABASE: GoAdmin
adminer:
image: adminer
container_name: adminer
restart: always
ports:
- 8888:8080
補充解釋一下,由於兩個 Container 服務本身是撰寫在同一支 docker-compose.yml
,所以當容器被建立起來時,網段服務是相同的,如同下方圖片:
但是總是會碰到 container 撰寫於不相同的 docker-compose.yml
,這時候就必須透過指定網路的方式,達到網段一致,才可以讓容器間可以溝通,明天的內容將會示範不同yml檔,也可以讓容器彼此都能溝通範例。