本文首发于个人博客 Cyy’s Blog
转载请注明出处 https://cyyjs.top/blog/5f5b05522caafc000f277bfe

# 安装node镜像并配置

查看node官方镜像

docker pull node

# Dockerfile文件编写

迁移的项目是用Node.js搭建的API接口服务,该服务使用Thinkjs框架搭建,这里需要在项目根目录下编写Dockerfile文件,来打包镜像,文件内容如下
项目根目录下/Dockerfile

FROM node

WORKDIR /app
COPY package.json /app/package.json
RUN npm i --production
COPY app /app/app
COPY src /app/src
COPY view /app/view
COPY production.js /app/production.js
ENV DOCKER=true
EXPOSE 8360
CMD [ "node", "/app/production.js" ]

项目中其实还依赖了一些其他的环境变量,可以在DockerfileENV中添加,如果变量较多,也可以提供一个环境变量文件。

# 环境变量

项目中有用到一些mongo数据库的配置,我这里使用环境变量文件的方式。
文件名为./prod.env

# mongo
MONGO_HOST=mongo
MONGO_PORT=1234
MONGO_USER=user
MONGO_PASSWORD=password

# 编写api.yml文件

然后编写docker-composeyml文件:

version: '3.1'
services:
  api:
    build:
      context: /workspace/app/api
      dockerfile: /workspace/app/api/Dockerfile
    container_name: api
    restart: unless-stopped
    env_file:
      - ./prod.env
    ports:
      - 8003:8360

# 运行

先执行build, 每次修改项目或者Dockerfile文件,都应该先执行build

docker-compose -f api.yml build

然后执行以下命令启动

docker-compose -f api.yml up -d

# 问题

# 容器间如何通信

上面mongo中配置的地址为mongo,并不是一个具体的地址,这是因为mongoapi服务启动后,使用的是同一个网络,默认为compose_default。可通过docker network ls查看所有网络,也可以通过docker network inspect compose_default来查看这个网络都绑定了那些容器服务。

如果是同一个网络环境下,就可以直接通过名称来访问了。名称为yml文件中声明的services中的key,当然也可以指定其他别名,详情可查看文档

启动后,我们也可以将之前的nginx中配置的代理地址改为对应的名称,如:

location / {
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://api:8360;
}

注意 服务端口要使用容器内项目启动的端口,而不是对外暴露的端口