记一次服务器中使用docker部署egg项目

  • 下载docker
  • 下载mysql
  • 运行mysql配置密码
  • 进入mysql
  • 下载redis
  • 运行redis 同时设置密码
  • 下载nginx
  • 上传服务器文件
  • 部署
  • 启动nginx
  • 前端:修改 egg 配置文件
  • 后端:根目录 新增 Dockerfile 用于构建镜像
  • Dockerfile的配置
  • 生成镜像文件
  • 运行镜像
  • 常见问题
  • mysql版本
  • 注意服务器端口是否开通
  • Dockerfile 名字不能错,否则会找不到


下载docker

下载docker的时候,参考了阿里云的配置方案,附上一个链接:
链接: link.

1.安装系统工具

yum install yum-utils device-mapper-persistent-data lvm2

2.添加软件源信息

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.安装docker

yum install docker-ce docker-ce-cli containerd.io

4.查看docker

docker -v

5.启动docker

systemctl start docker

下载mysql

推荐使用国内的镜像市场
搜索 mysql 选择对应的版本库

docker egg docker egg.js_nginx


复制链接

下载:

docker pull daocloud.io/library/mysql:5.7.5

我这里选择5.7.7

下载完成后使用:

docker images

可以查看到刚刚安装完成的镜像

docker egg docker egg.js_node_02

运行mysql配置密码

docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 cf8a22028fe7

注意后面的 id 对应的是 IMAGE ID

查看mysql是否已经被启动

docker ps

会展示所有在运行的镜像,会看到mysql已经在运行了

docker egg docker egg.js_mysql_03

进入mysql

docker exec -it f44218738998 sh

f44218738998 对应的是 CONTAINER ID

docker egg docker egg.js_docker egg_04

下载redis

docker pull daocloud.io/library/redis:6.0.5

运行redis 同时设置密码

docker run -d -p 6379:6379 --name redis 235592615444 --requirepass 123456

下载nginx

docker pull daocloud.io/library/nginx:1.12.0

本地新建nginx文件,做基础的配置

conf.d/default.conf

server {
  #监听端口
  listen 80;
  #监听地址
  server_name 你的服务器地址;

  #静态资源
  location / {
    #根目录
    root /usr/share/nginx/html;
    # 设置默认页
    index index.html;
  }

  #接口转发
  location ~ /api/ {
    proxy_pass 你的服务器地址:端口号;
  }
}

将前端打完的包放到 html 目录下即可

上传服务器文件

我这里使用的 winscp 连接到自己的服务器,直接上传即可

上传nginx文件和server文件

docker egg docker egg.js_docker_05

部署

启动nginx

docker run --name nginx -d -p 80:80 -v /root/nginx/log:/var/log/nginx -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/conf.d:/etc/nginx/conf.d -v /root/nginx/html:/usr/share/nginx/html c246cd3dd41d

注意最后那个id 是 IMAGEID
这时候在浏览器访问你的服务器地址,可以看到前端的页面已经显示了

再次 docker ps 就可以查看到 redis mysql nginx 都已经是启动状态了

docker egg docker egg.js_node_06

前端:修改 egg 配置文件

手动增加一个prod命令脚本,添加环境变量,这时候他会默认走 config/config.prod.js 的配置文件(拷贝config.default.js,把mysql redis 链接地址都改为服务器的)

"prod": "egg-scripts start -env=prod --title=egg-server-lession",

后端:根目录 新增 Dockerfile 用于构建镜像

这个文件可以调用命令 docker通过读取Dockerfile中的指令自动生成映像

Dockerfile的配置

如果你用的yarn可以参考:

# 使用node镜像
FROM daocloud.io/library/node:12.18
# 在容器中新建目录文件夹 egg
RUN mkdir -p /egg
# 将 /egg 设置为默认工作目录
WORKDIR /egg
# 将 package.json 复制默认工作目录
COPY package.json /egg/package.json
# 安装依赖
RUN yarn config set register https://registry.npm.taobao.org
RUN yarn --production
# 再copy代码至容器
COPY ./ /egg
#7001端口
EXPOSE 7001
#等容器启动之后执行脚本
CMD yarn prod

如果是npm可以参考:

# 使用node镜像
FROM daocloud.io/library/node:14.6
# 在容器中新建一个目录 egg
RUN mkdir -p /egg
# 将 /egg 设置为默认的工作目录
WORKDIR /egg
# 将package.json 复制到默认工作目录
COPY package.json /egg/package.json
# 安装依赖
# RUN npm config set register https://registry.npm.taobao.org
# RUN npm install --production
RUN npm i --production --registry=https://registry.npm.taobao.org
# 再copye代码到容器 . 拷贝所有的文件 到 /egg
COPY . /egg
# 暴露7001端口
EXPOSE 7001
#等待 node 容器启动之后,再执行start命令
# CMD 是等容器启动完毕之后再执行 RUN是立即执行
CMD npm run prod

生成镜像文件

docker build -t react-hooks_egg:v1.0 ./server

再次查看镜像 docker images

docker egg docker egg.js_node_07


会看到这个镜像

运行镜像

docker run -d -p 7001:7001 --name server f74f8ae3f248

–name 后面跟着的是 container 名字 可以自定义

查看是否已经在运行了

docker ps

查看egg运行的日志

docker logs -f 3314c1b9649c

查看是否启动成功

常见问题

mysql版本

开始用的mysql 8.0.1 项目一直启动失败,好像是因为mysql8不支持直接node服务连接,需要去做权限的配置 就不做拓展了(ps:试过,也没跑起来)

注意服务器端口是否开通

Dockerfile 名字不能错,否则会找不到