場景
三個容器
-
digger-app
: 啓動 API 服務,依賴redis
和mysql
-
digger-redis
:redis
服務 -
digger-mysql
:mysql
服務
我們需要讓 digger-app
容器內運行的服務能夠訪問 digger-redis
和 digger-mysql
容器。
方法一:--link
--link
的格式爲 --link name:alias
,name
爲需要連接到的容器的 name
,alias
是給這個連接取個別名。
首先啓動 redis
服務和 mysql
服務:
# redis
docker run --name digger-redis -d redis:5.0.3-alpine
# mysql
docker run --name digger-mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.25
如果不指定 name
,docker 會隨機生成一個 name,使用 docker ps 可以查看到運行容器的 name。
在啓動 digger-app
時,指定 --link
參數:
docker run --name digger-api --link digger-redis:redis --link digger-mysql:mysql -d -p 3000:3000 your-image
這樣在 digger-api
中就能通過 連接名
訪問到對應的服務了,如與 digger-redis
的 link
別名爲 redis
,那麼在 digger-api
代碼中,可以指定 redis
的 host
爲 redis
,以 node.js
舉例:
// redis.js
const redis = require('redis');
const client = redis.createClient({
host: 'redis',
port: 6379
});
// mysql.js
const mysql = require('mysql');
const connection = mysql.createConnection({
host : 'mysql',
user : 'root',
password : 'root',
database : 'my_db'
});
connection.connect();
使用 docker exec
命令進入容器,使用 ping
命令也可以查看容器是否互聯成功:
事實上,在 digger-api
容器內,如果查看 hosts
文件,可以發現 docker 已經將另外兩個容器配置在了 hosts
中:
/app # cat /etc/hosts
127.0.0.1 localhost
...
172.17.0.6 redis 7a6409598773 cache-redis
172.17.0.5 mysql f08bf0e0bf18 digger-mysql
172.17.0.7 6eb8dab1e6db
方法二:--network
隨着 Docker 網絡的完善,更建議將容器加入自定義的 Docker 網絡來連接多個容器,而不是使用 --link
參數。
使用 --network
命令可以指定容器運行的網絡,通過將多個容器指定到同一個網絡可以讓容器間相互訪問。
創建網絡
docker network create -d bridge my-net
指定網絡
# redis
docker run --name digger-redis -d --network my-net redis:5.0.3-alpine
# mysql
docker run --name digger-mysql -e MYSQL_ROOT_PASSWORD=root -d --network my-net mysql:5.7.25
# api
docker run --name digger-api --network my-net -d -p 3000:3000 your-image
不過需要注意這時候就沒有連接的別名了,在容器裏面,host
直接使用對方容器的 name
訪問即可。
方法三:docker compose
Docker Compose
是 Docker
官方編排(Orchestration)項目之一,負責快速的部署分佈式應用。
新建 docker-compose.yml
文件,編寫如下
version: "3"
services:
digger-api:
image: "express:v1"
ports:
- "3000:3000"
digger-mysql:
image: "mysql:5.7.25"
environment:
- MYSQL_ROOT_PASSWORD=root
digger-redis:
image: "redis:5.0.3-alpine"
docker compose
的官方文檔查看 這裏。
然後使用 docker-compose up -d
啓動即可,容器會在後臺運行。