【发布时间】:2019-02-23 12:18:59
【问题描述】:
我有一个示例应用程序,我正在使用 nodejs 和 reactjs,所以我的项目文件夹由客户端和服务器文件夹组成。客户端文件夹是使用 create-react-app 创建的。
我为每个文件夹创建了两个 Dockerfile,并且我在项目的根目录上使用了 docker-compose.yml。
一切正常。现在我只想托管这个应用程序。我正在尝试使用詹金斯。
因为我对 devops 方面知之甚少。我有一些疑问
1) 如果我为客户端使用两个 docker 文件并做出反应,并且它由 docker-compose.yml 启动,它会在两个不同的容器中运行还是在单个容器中运行?从我读过的内容来看,我认为这将需要两个容器,即使用 docker-compose.yml 文件。对此有点困惑?
2) 同样,当我执行 sudo docker-compose up 时,它运行良好,但显示“使用 npm run build 创建生产构建”,基于 env 我该如何更改这个。我是否需要为每个环境创建不同的 docker-compose.yml 文件。如何根据环境使用相同的文件但不同的 npm start 或 npm run build ?
3) 我可以使用 docker-compose.yml 文件在 jenkins 中构建管道还是我需要在项目的根目录中使用 Dockerfile。我见过大多数项目都有一个 Dockerfile。是我无法使用 docker-compose.yml 来托管应用程序吗?
4) 为什么我在 docker-compose.yml 文件的 Command 属性中使用 NODE_COMMAND 作为服务器是因为当我在本地运行应用程序时,我需要自动重新加载,所以如果我在终端中输入 NODE_COMMAND = nodemon 它将需要而不是运行节点 index.js,但在生产中,如果我不提及任何 NODE_COMMAND,它将只需要节点 index.js。
5) 我是否需要每个客户端和服务器的 Dockerfile 中的 CMD,因为当我运行 docker-compose up 时,它将接受 docker-compose.yml 的命令。所以我认为优先级将来自 docker-compose.yml 文件。是吗?
6) docker-compose.yml 文件中需要卷的用途是什么?
7) 在 env 文件中,我使用 API_HOST 和 APP_SERVER_PORT 它是如何在内部与 package.json 一起工作的?它是在做代理的事情吗?当我们需要点击 nodejs 时,我们通常会给出“proxy”:“http://localhost:4000”,但这里将采用http://server:4000。这东西是怎么运作的?
8) 当我们创建一个容器时,我们有 3000、3001 之类的端口......所以容器端口和我们的应用程序端口如何匹配,通过使用 docker-compose.yml 文件中的导出环境和端口将占用在乎吗?
请看下面的文件夹结构
movielisting
client
Dockerfile
package.json
package.lock.json
... other create-react-app folders like src..
server
Dockerfile
index.js
docker-compose.yml
.env
Dockerfile -- 客户端
FROM node:10.15.1-alpine
#Create app directory and use it as the working directory
RUN mkdir -p /srv/app/client
WORKDIR /srv/app/client
COPY package.json /srv/app/client
COPY package-lock.json /srv/app/client
RUN npm install
COPY . /srv/app/client
CMD ["npm", "start"]
Dockerfile -- 服务器
FROM node:10.15.1-alpine
#Create app directory
RUN mkdir -p /srv/app/server
WORKDIR /srv/app/server
COPY package.json /srv/app/server
COPY package-lock.json /srv/app/server
RUN npm install
COPY . /srv/app/server
CMD ["node", "index.js"]
docker-compose.yml -- 项目根目录
version: "3"
services:
#########################
# Setup node container
#########################
server:
build: ./server
expose:
- ${APP_SERVER_PORT}
environment:
API_HOST: ${API_HOST}
APP_SERVER_PORT: ${APP_SERVER_PORT}
ports:
- ${APP_SERVER_PORT}:${APP_SERVER_PORT}
volumes:
- ./server:/srv/app/server
command: ${NODE_COMMAND:-node} index.js
##########################
# Setup client container
##########################
client:
build: ./client
environment:
- REACT_APP_PORT=${REACT_APP_PORT}
expose:
- ${REACT_APP_PORT}
ports:
- ${REACT_APP_PORT}:${REACT_APP_PORT}
volumes:
- ./client/src:/srv/app/client/src
- ./client/public:/srv/app/client/public
links:
- server
command: npm run start
.env
API_HOST="http://localhost:4000"
APP_SERVER_PORT=4000
REACT_APP_PORT=3000
package.json -- 客户端
"proxy": "http://server:4000"
我可以重构什么,
任何帮助表示赞赏。
【问题讨论】:
-
如果将其拆分为几个较小的问题,这将更容易回答。有些问题(如#5 和#6)你应该可以通过docs.docker.com 上的信息来回答。
-
肯定会拆分那个,但我可以知道其他问题的解决方案
标签: docker jenkins docker-compose