迁移Docker(三):Node.js API服务迁移
本文首发于个人博客 Cyy’s Blog
转载请注明出处 https://cyyjs.top/blog/5f5b05522caafc000f277bfe
# 安装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" ]
项目中其实还依赖了一些其他的环境变量,可以在Dockerfile
的ENV
中添加,如果变量较多,也可以提供一个环境变量文件。
# 环境变量
项目中有用到一些mongo
数据库的配置,我这里使用环境变量文件的方式。
文件名为./prod.env
# mongo
MONGO_HOST=mongo
MONGO_PORT=1234
MONGO_USER=user
MONGO_PASSWORD=password
# 编写api.yml文件
然后编写docker-compose
的yml
文件:
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
,并不是一个具体的地址,这是因为mongo
和api
服务启动后,使用的是同一个网络,默认为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;
}
注意 服务端口要使用容器内项目启动的端口,而不是对外暴露的端口
