运行 Ubuntu 18.04 中的 Dockerhub 镜像,带有 MongoDB 镜像和 Nginx
Running a Dockerhub Image in Ubuntu 18.04 with MongoDB image and Nginx
所以我有一个带有 Github 操作管道的 Nodejs 应用程序到私有 Dockerhub 存储库,一旦使用下面的 Dockerfile
向 main
分支推送,它就会创建一个图像应用目录
FROM node:12.21.0-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 4000
CMD [ "node", "konet.js" ]
我已经将镜像拉入我的 Ubuntu 18.04 服务器 运行ning Nginx 并且还从官方 Dockerhub Mongo 镜像中拉取了 mongo
镜像。
我可以 运行 mongo
图像和我的私人 docker 图像 (docker-username/docker-image
) 独立并添加 --net
标志,我是能够从应用程序容器连接到 mongodb。
我的挑战:
- 是否可以创建一个 Nginx 代理来路由到应用程序容器端口 4000?
- 什么是 运行 可以处理这些过程的
docker-composer.yml
文件而不是 运行 单独处理图像的正确方法?
下面是我在服务器上的docker-compose.yml
:
version: "3.8"
services:
nodeserver:
build:
context: ./app
ports:
- "4000:4000"
nginx:
restart: always
build:
context: ./nginx
ports:
- "80:80"
mongo:
image: "mongo:latest"
container_name: my_mongo
ports:
- 27017:27017
volumes:
- mongodb:/data/db
- mongodb_config:/data/configdb
但我不断收到此错误:
build path /home/devUser/app either does not exist, is not accessible, or is not a valid URL.
构建错误表明您没有 app
目录旁边的撰写文件。由于您已经有一个构建图像的 ci 过程,我建议使用 specifying image: docker-username/docker-image
构建的图像作为 compose 文件中节点服务器服务的图像。您将需要使用可以访问您服务器上的私人图像的帐户登录(只需 运行 docker login
并输入您的凭据)。
这是您的合成文件在图像 specified 而不是构建时的样子:
version: "3.8"
services:
nodeserver:
image: docker-username/docker-image
ports:
- "4000:4000"
nginx:
restart: always
build:
context: ./nginx
ports:
- "80:80"
mongo:
image: "mongo:latest"
container_name: my_mongo
ports:
- 27017:27017
volumes:
- mongodb:/data/db
- mongodb_config:/data/configdb
现在,回答您的其他问题:
您绝对可以使用 nginx 将请求代理到您的应用程序。为此,您需要一个类似于此的 nginx 配置:
server {
listen 80;
location / {
proxy_pass http://nodeserver:4000;
}
}
这会将对 nginx 容器发出的所有请求转发到端口 4000
上的 nodeserver
服务。
然后您需要将配置安装到您的 nginx 容器中,像这样而不是构建它:
version: "3.8"
services:
nodeserver:
image: docker-username/docker-image
ports:
- "4000:4000"
nginx:
image: nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
mongo:
image: "mongo:latest"
container_name: my_mongo
ports:
- 27017:27017
volumes:
- mongodb:/data/db
- mongodb_config:/data/configdb
默认情况下,docker 组合文件中的所有服务都可以通过名称在网络上自动相互查看,就好像它们是“经典”专用网络中的独立机器一样。
因此,您不需要从不需要从外部世界访问的容器中公开任何端口,这些容器都是除 nginx 容器之外的容器。我强烈建议您遵循此建议,除非您知道自己在做什么。 Especially 一旦某些扫描器偶然发现互联网上打开的 mongo 服务器,暴露 mongo 数据库之类的东西会很快变得非常危险。清理后的 docker-compose.yml
看起来像这样:
version: "3.8"
services:
nodeserver:
image: docker-username/docker-image
nginx:
image: nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
mongo:
image: "mongo:latest"
volumes:
- mongodb:/data/db
- mongodb_config:/data/configdb
我建议您研究一下 Traefik,这使得这非常容易,并且可以做更多的事情,例如自动 tls、多个域、访问限制等。
所以我有一个带有 Github 操作管道的 Nodejs 应用程序到私有 Dockerhub 存储库,一旦使用下面的 Dockerfile
向 main
分支推送,它就会创建一个图像应用目录
FROM node:12.21.0-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 4000
CMD [ "node", "konet.js" ]
我已经将镜像拉入我的 Ubuntu 18.04 服务器 运行ning Nginx 并且还从官方 Dockerhub Mongo 镜像中拉取了 mongo
镜像。
我可以 运行 mongo
图像和我的私人 docker 图像 (docker-username/docker-image
) 独立并添加 --net
标志,我是能够从应用程序容器连接到 mongodb。
我的挑战:
- 是否可以创建一个 Nginx 代理来路由到应用程序容器端口 4000?
- 什么是 运行 可以处理这些过程的
docker-composer.yml
文件而不是 运行 单独处理图像的正确方法?
下面是我在服务器上的docker-compose.yml
:
version: "3.8"
services:
nodeserver:
build:
context: ./app
ports:
- "4000:4000"
nginx:
restart: always
build:
context: ./nginx
ports:
- "80:80"
mongo:
image: "mongo:latest"
container_name: my_mongo
ports:
- 27017:27017
volumes:
- mongodb:/data/db
- mongodb_config:/data/configdb
但我不断收到此错误:
build path /home/devUser/app either does not exist, is not accessible, or is not a valid URL.
构建错误表明您没有 app
目录旁边的撰写文件。由于您已经有一个构建图像的 ci 过程,我建议使用 specifying image: docker-username/docker-image
构建的图像作为 compose 文件中节点服务器服务的图像。您将需要使用可以访问您服务器上的私人图像的帐户登录(只需 运行 docker login
并输入您的凭据)。
这是您的合成文件在图像 specified 而不是构建时的样子:
version: "3.8"
services:
nodeserver:
image: docker-username/docker-image
ports:
- "4000:4000"
nginx:
restart: always
build:
context: ./nginx
ports:
- "80:80"
mongo:
image: "mongo:latest"
container_name: my_mongo
ports:
- 27017:27017
volumes:
- mongodb:/data/db
- mongodb_config:/data/configdb
现在,回答您的其他问题:
您绝对可以使用 nginx 将请求代理到您的应用程序。为此,您需要一个类似于此的 nginx 配置:
server {
listen 80;
location / {
proxy_pass http://nodeserver:4000;
}
}
这会将对 nginx 容器发出的所有请求转发到端口 4000
上的 nodeserver
服务。
然后您需要将配置安装到您的 nginx 容器中,像这样而不是构建它:
version: "3.8"
services:
nodeserver:
image: docker-username/docker-image
ports:
- "4000:4000"
nginx:
image: nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
mongo:
image: "mongo:latest"
container_name: my_mongo
ports:
- 27017:27017
volumes:
- mongodb:/data/db
- mongodb_config:/data/configdb
默认情况下,docker 组合文件中的所有服务都可以通过名称在网络上自动相互查看,就好像它们是“经典”专用网络中的独立机器一样。
因此,您不需要从不需要从外部世界访问的容器中公开任何端口,这些容器都是除 nginx 容器之外的容器。我强烈建议您遵循此建议,除非您知道自己在做什么。 Especially 一旦某些扫描器偶然发现互联网上打开的 mongo 服务器,暴露 mongo 数据库之类的东西会很快变得非常危险。清理后的 docker-compose.yml
看起来像这样:
version: "3.8"
services:
nodeserver:
image: docker-username/docker-image
nginx:
image: nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
mongo:
image: "mongo:latest"
volumes:
- mongodb:/data/db
- mongodb_config:/data/configdb
我建议您研究一下 Traefik,这使得这非常容易,并且可以做更多的事情,例如自动 tls、多个域、访问限制等。