Docker: 容器互訪的三種方式

場景

三個容器

  • digger-app: 啓動 API 服務,依賴 redismysql
  • digger-redis: redis 服務
  • digger-mysql: mysql 服務

我們需要讓 digger-app 容器內運行的服務能夠訪問 digger-redisdigger-mysql 容器。

方法一:--link

--link 的格式爲 --link name:aliasname 爲需要連接到的容器的 namealias 是給這個連接取個別名。

首先啓動 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-redislink 別名爲 redis,那麼在 digger-api 代碼中,可以指定 redishostredis,以 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 命令也可以查看容器是否互聯成功:

clipboard.png

事實上,在 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 ComposeDocker 官方編排(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 啓動即可,容器會在後臺運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章