使用 docker-compose 链接容器
Linking container with docker-compose
我尝试 运行 一个带有 2 个容器的实例,1 个带有 mysql 的容器,另一个带有节点。
在docker-compose.yml文件中:
api:
build: ./server
ports:
- 8001:8001
links:
- mysql:mysql
mysql:
image: mysql
environment:
MYSQL_DATABASE: ghostDB
MYSQL_ROOT_PASSWORD: root
volumes:
- /data/mysql:/var/lib/mysql
服务器的 Dockerfile/:
FROM node:0.12
ENV PORT 8001
ENV MYSQL_DATABASE ghostDB
ENV MYSQL_USER root
ENV MYSQL_PASSWORD root
ENV MYSQL_HOST mysql
ENV MYSQL_PORT 3306
ENV API_DIR /usr/src/server-celerative
COPY . ${API_DIR}
WORKDIR ${API_DIR}
RUN npm install
RUN node index.js
index.js
var db = mysql.createConnection({
host: 'mysql',
port: '3306',
user: 'root',
password: 'root',
database: 'ghostDB'
});
但我得到了输出:
Error: getaddrinfo ENOTFOUND mysql
at errnoException (dns.js:44:10)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:94:26)
--------------------
我不明白为什么不行。
有人帮忙吗?
注意:我使用 boot2docker。
docker-compose v1无法保证mysql进程在启动节点容器前完全启动并初始化。因此,您的节点容器负责测试 mysql 是否可用,并负责测试 waiting/retrying 直到它可用。
您可以在您的应用程序中使用节点执行此操作(pooling-connections 可能是这种方式);或者提供一个 boostrap shell 脚本来测试 mysql 连接,一旦可用就会启动节点。
在 image: mysql
之后的 mysql 部分添加行 container_name: mysql
。
可以添加以下 Bash 代码以确保 3306 端口已打开:
while ! ( exec 2>/dev/null ; echo > /dev/tcp/mysql/3306 ) ; do sleep 1 ; done
我尝试 运行 一个带有 2 个容器的实例,1 个带有 mysql 的容器,另一个带有节点。
在docker-compose.yml文件中:
api:
build: ./server
ports:
- 8001:8001
links:
- mysql:mysql
mysql:
image: mysql
environment:
MYSQL_DATABASE: ghostDB
MYSQL_ROOT_PASSWORD: root
volumes:
- /data/mysql:/var/lib/mysql
服务器的 Dockerfile/:
FROM node:0.12
ENV PORT 8001
ENV MYSQL_DATABASE ghostDB
ENV MYSQL_USER root
ENV MYSQL_PASSWORD root
ENV MYSQL_HOST mysql
ENV MYSQL_PORT 3306
ENV API_DIR /usr/src/server-celerative
COPY . ${API_DIR}
WORKDIR ${API_DIR}
RUN npm install
RUN node index.js
index.js
var db = mysql.createConnection({
host: 'mysql',
port: '3306',
user: 'root',
password: 'root',
database: 'ghostDB'
});
但我得到了输出:
Error: getaddrinfo ENOTFOUND mysql
at errnoException (dns.js:44:10)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:94:26)
--------------------
我不明白为什么不行。
有人帮忙吗?
注意:我使用 boot2docker。
docker-compose v1无法保证mysql进程在启动节点容器前完全启动并初始化。因此,您的节点容器负责测试 mysql 是否可用,并负责测试 waiting/retrying 直到它可用。
您可以在您的应用程序中使用节点执行此操作(pooling-connections 可能是这种方式);或者提供一个 boostrap shell 脚本来测试 mysql 连接,一旦可用就会启动节点。
在 image: mysql
之后的 mysql 部分添加行 container_name: mysql
。
可以添加以下 Bash 代码以确保 3306 端口已打开:
while ! ( exec 2>/dev/null ; echo > /dev/tcp/mysql/3306 ) ; do sleep 1 ; done