Docker node(koa) nginx mysql 线上环境部署

时间:2022-02-23 01:59:14

在上一篇 Docker node(koa) nginx mysql 开发环境搭建,我们进行了本地开发环境搭建

现在我们就来开始线上环境部署

如果本地环境搭建没有什么问题,那么线上部署的配置也就很简单了

我所使用的环境,Linux Mint,命令有不同可以适当更改

目录结构

- compose   新建,线上环境配置
- data      
- conf      
- node_modules
- static        
- docker-compose.yml
- docker-compose-prod.yml   新建,线上环境配置
- package.json
- server.js
- yarn.lock

线上服务配置

我们现在需要3个服务:

  • Node
  • Nginx
  • Mysql

在根目录下compose文件夹内,创建对应的Dockerfile配置文件,mysql是使用的镜像文件,就不用创建Dockerfile

compose/node/Dockerfile
compose/nginx/Dockerfile

1.Node服务配置

compose/node/Dockerfile

FROM node:12-alpine     # 使用的基础镜像文件
WORKDIR /code           # 工作目录的路径
COPY ./package.json ./server.js /code/  # 拷贝文件到/code
COPY ./static /code/static              # 拷贝文件到/code/static
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories     && apk update && apk add yarn     && yarn config set registry https://registry.npm.taobao.org/     && yarn             # 这一窜命令,设置镜像源到国内(加速),更新,安装yarn,yarn设置国内镜像源,yarn安装node依赖
CMD ["npm", "start"]    # 容器启动时运行
  • FROM指定基础镜像文件
  • WORKDIR工作目录的路径
  • COPY拷贝本地文件到容器内
  • RUN在 docker build 时运行命令
  • CMD在 docker run 时运行命令

关于Dockerfile更详细的介绍可以查看 这里

2.Nginx服务配置

compose/nginx/Dockerfile

这个配置文件很简单,我们只需要把本地的nginx conf文件拷贝到容器里,删除默认配置

FROM nginx:1.17
RUN rm /etc/nginx/conf.d/default.conf
COPY ./conf/default.conf /etc/nginx/conf.d/default.conf 

nginx conf域名设置

线上部署是需要一个域名的,我们现在假设一个域名测试:

conf/default.conf

server {
    listen       80;
    server_name  localhost yoursite.com;    # 这里添加你们的域名
    ...
}

我们在本地修改/etc/hosts,就可以测试了

127.0.1.1       yoursite.com

3.compose

和本地环境配置一样,要管理多个服务,我们需要compose文件来管理

在之前我们已经说明了,mysql是直接使用镜像,没有额外的修改,就不需要Dockerfile了

docker-compose-prod.yml根目录新建配置文件

version: "3"

volumes:
        static:         # 数据卷名称
        db:             # 数据卷名称

services:
        web:
                build:                                          # 构建镜像
                        context: ./                             # 上下文环境
                        dockerfile: ./compose/node/Dockerfile   # Dockerfile路径
                ports:
                        - "3000:3000"
                volumes:
                        - static:/code/static       # 使用前面声明的static挂在容器/code/static
                restart: always                     # 总是重启
        nginx:
                build:
                        context: ./
                        dockerfile: ./compose/nginx/Dockerfile
                ports:
                        - "80:80"
                volumes:
                        - static:/code/static
                restart: always
        mysql:
                image: mysql:5.6        # 直接使用镜像构建
                env_file: .env          # 环境变量env,我们写入到了配置文件里,避免密码泄漏
                volumes:    
                        - db:/var/lib/mysql
                ports:
                        - "3306:3306"
                restart: always

和之前的配置基本一样,不过有一些小的改动

volumes数据卷,我们设置了2个数据卷,static和db,下面就可以直接使用,它会自动创建并挂在到系统制定的目录/var/lib/docker/volumes/xxxx_static

  • build我们之前是使用的image镜像构建,同样build也可以,因为我们在Dockerfile里面已经声明了镜像了
    • context指定上下文运行环境到根目录,我们build时需要一个上下文环境
    • dockerfile指定当前服务的Dockerfile配置

restart总是重启

测试服务

配置已经写好,我们来测试服务是否正常

sudo docker-compose -f docker-compose-prod.yml build
sudo docker-compose -f docker-compose-prod.yml up

服务运行起来,如果你能通过yoursite.com访问的话,说明配置成功

正式上线

我们只需要把源代码copy到服务器上然后运行上面两条命令即可

至于如何上传到服务器,FTP,GIT等...都可以

总结

在服务器已经安装好docker的情况下,和我们本地跑服务没有任何区别,各种顺滑,无障碍

从此以后就不再纠结线上线下环境不一致的问题了

珍爱生命,LOVE & PEACE

附录

服务器上安装Docker

服务器上也需要安装Docker,docker-compose,具体安装步骤有详细的官方文档:

Dockerfile

github