Docker化 adonis.js + mysql
Dockerize adonis.js + mysql
我正在尝试 docker 化现有的 adonis.js 应用程序和 MySQL 通过 docker-compose。
这是我的 Dockerfile
FROM node:12.18.2-alpine3.9
ENV HOME=/app
RUN mkdir /app
COPY package.json $HOME
WORKDIR $HOME
RUN npm i -g @adonisjs/cli && npm install
CMD ["npm", "start"]
这是我的 docker-compose.yml 文件
version: '3'
services:
adonis-mysql:
image: mysql:5.7
ports:
- '3307:3306'
volumes:
- $PWD/data:/var/lib/mysql
environment:
MYSQL_USER: ${DB_USER}
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ALLOW_EMPTY_PASSWORD: ${DB_ALLOW_EMPTY_PASSWORD}
networks:
- api-network
adonis-api:
container_name: "${APP_NAME}-api"
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/app
- /app/node_modules
ports:
- "3333:3333"
depends_on:
- adonis-mysql
networks:
- api-network
networks:
api-network:
当 运行 docker-compose up
一切顺利并且 adonis-api 容器说该应用程序是 运行 但我无法访问它,我总是得到:
This site can’t be reached
127.0.0.1 refused to connect.
或
This site can’t be reached
The connection was reset.
我尝试了不同的 docker-compose 设置和不同的 docker 文件,几乎总是一切正常,但我就是无法访问服务器。
也尝试了不同的IP和端口,但仍然没有。
容器日志:
testProject-api |
testProject-api | > adonis-fullstack-app@4.1.0 start /app
testProject-api | > node server.js
testProject-api |
adonis-mysql_1 | 2020-07-09T09:56:35.960082Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
testProject-api | info: serving app on http://127.0.0.1:80
docker ps
dan@dan-Nitro-AN515-54:~/Documents/Tests/testProject$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45f3dd21ef93 testproject_adonis-api "docker-entrypoint.s…" 20 seconds ago Up 19 seconds 0.0.0.0:3333->3333/tcp testProject-api
7b40bc7c75c3 mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 20 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp testproject_adonis-mysql_1
在此设置中有两点突出。
首先,容器启动时打印:
info: serving app on http://127.0.0.1:80
这通常表示配置问题将使进程无法访问。在 Docker 中,每个容器都有自己的 localhost
接口,因此“监听 127.0.0.1”的进程只能从容器私有的本地主机接口访问,而不能从其他容器或主机访问(不管你有什么 ports:
选项)。您通常需要将进程设置为“绑定”或“侦听”特殊的 0.0.0.0 全接口地址。
在 Adonis 中它看起来像 this is controlled by the $HOST
environment variable; the Adonis templates set this to 127.0.0.1. Adonis documents itself as using the dotenv
library, and that in turn gives precedence to environment variables over the .env
file,所以设置一个环境变量应该就足够了 HOST=0.0.0.0
。
(上一段的None 在 Adonis 文档中讨论!)
该错误消息的第二件事是 ports:
中的第二个数字需要与容器进程正在使用的端口号相匹配。 Adonis 模板似乎都将其默认为端口 3333,但启动消息显示端口 80,因此您需要将 ports:
更改为右侧的端口 80。您可以在左侧选择任何端口。
添加一些常规清理,您可以将 docker-compose.yml
服务块替换为:
adonis-api:
build: . # context directory only; use default Dockerfile
environment:
- HOST=0.0.0.0 # listen on all interfaces
ports:
- "3333:80" # matches actual listener message
depends_on:
- adonis-mysql
# Use "default" network (also delete other networks: blocks in the file)
# Use Compose default container name
# Use code from the Docker image; don't overwrite with volumes
# (and don't tell Docker to use arbitrarily old node_modules)
我正在尝试 docker 化现有的 adonis.js 应用程序和 MySQL 通过 docker-compose。
这是我的 Dockerfile
FROM node:12.18.2-alpine3.9
ENV HOME=/app
RUN mkdir /app
COPY package.json $HOME
WORKDIR $HOME
RUN npm i -g @adonisjs/cli && npm install
CMD ["npm", "start"]
这是我的 docker-compose.yml 文件
version: '3'
services:
adonis-mysql:
image: mysql:5.7
ports:
- '3307:3306'
volumes:
- $PWD/data:/var/lib/mysql
environment:
MYSQL_USER: ${DB_USER}
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ALLOW_EMPTY_PASSWORD: ${DB_ALLOW_EMPTY_PASSWORD}
networks:
- api-network
adonis-api:
container_name: "${APP_NAME}-api"
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/app
- /app/node_modules
ports:
- "3333:3333"
depends_on:
- adonis-mysql
networks:
- api-network
networks:
api-network:
当 运行 docker-compose up
一切顺利并且 adonis-api 容器说该应用程序是 运行 但我无法访问它,我总是得到:
This site can’t be reached
127.0.0.1 refused to connect.
或
This site can’t be reached
The connection was reset.
我尝试了不同的 docker-compose 设置和不同的 docker 文件,几乎总是一切正常,但我就是无法访问服务器。 也尝试了不同的IP和端口,但仍然没有。
容器日志:
testProject-api |
testProject-api | > adonis-fullstack-app@4.1.0 start /app
testProject-api | > node server.js
testProject-api |
adonis-mysql_1 | 2020-07-09T09:56:35.960082Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
testProject-api | info: serving app on http://127.0.0.1:80
docker ps
dan@dan-Nitro-AN515-54:~/Documents/Tests/testProject$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45f3dd21ef93 testproject_adonis-api "docker-entrypoint.s…" 20 seconds ago Up 19 seconds 0.0.0.0:3333->3333/tcp testProject-api
7b40bc7c75c3 mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 20 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp testproject_adonis-mysql_1
在此设置中有两点突出。
首先,容器启动时打印:
info: serving app on http://127.0.0.1:80
这通常表示配置问题将使进程无法访问。在 Docker 中,每个容器都有自己的 localhost
接口,因此“监听 127.0.0.1”的进程只能从容器私有的本地主机接口访问,而不能从其他容器或主机访问(不管你有什么 ports:
选项)。您通常需要将进程设置为“绑定”或“侦听”特殊的 0.0.0.0 全接口地址。
在 Adonis 中它看起来像 this is controlled by the $HOST
environment variable; the Adonis templates set this to 127.0.0.1. Adonis documents itself as using the dotenv
library, and that in turn gives precedence to environment variables over the .env
file,所以设置一个环境变量应该就足够了 HOST=0.0.0.0
。
(上一段的None 在 Adonis 文档中讨论!)
该错误消息的第二件事是 ports:
中的第二个数字需要与容器进程正在使用的端口号相匹配。 Adonis 模板似乎都将其默认为端口 3333,但启动消息显示端口 80,因此您需要将 ports:
更改为右侧的端口 80。您可以在左侧选择任何端口。
添加一些常规清理,您可以将 docker-compose.yml
服务块替换为:
adonis-api:
build: . # context directory only; use default Dockerfile
environment:
- HOST=0.0.0.0 # listen on all interfaces
ports:
- "3333:80" # matches actual listener message
depends_on:
- adonis-mysql
# Use "default" network (also delete other networks: blocks in the file)
# Use Compose default container name
# Use code from the Docker image; don't overwrite with volumes
# (and don't tell Docker to use arbitrarily old node_modules)