简单做系列:Docker部署egg.js到云服务器

看了好多 Docker 部署的文章,除了列举相同的主要步骤,具体到底怎么部署的,愣是没搞明白.也许到了这个部署 node 的阶段的前端都已经是大神了,不需要讲那么清楚,那我就只好自己摸索记录一下.

也不需要讲什么具体概念,直接就冲方法,先把成就感拿到,回头你再反复咀嚼,看看别人文章里的概念细节,品位品位.

如果讲的不对的地方有大佬指正,将不胜感激.

0. 前提

本项目是 egg.js+mongoDB 的 youtubeclone 的后端项目.

修改项目

在 egg 项目的 package.json 文件中,在 start 启动项中,–daemon 是后台启动。如果使用 docker 容器,需要去除 –daemon .

大体流程

1. 买服务器

首先,你得有个服务器.没有自己想办法白嫖,什么阿里腾讯的学生机,什么 AWS 的一年免费小水管.
买了服务器,肯定要装系统,建议就是 Linux 的,什么 CentOS,Debian 之类的.

2. 安装 Docker

文章目的就是冲它,肯定要先装它.

1
2
3
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
// 或者
curl -sSL https://get.daocloud.io/docker | sh

测试安装是否成功

1
docker -v
1
2
3
4
// 启动docker
sudo systemctl start docker
// 设置开机自启动
sudo systemctl enable docker

3. 安装 Docker-compose

1
2
3
4
// 国内
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.12.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
// 国外
curl -L "https://github.com/docker/compose/releases/download/2.12.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

添加可执行权限

1
chmod +x /usr/local/bin/docker-compose

查看版本

1
docker-compose --version

4. 创建 Dockerfile

通过 Dockfile 创建镜像.之后使用.

自动生成

安装 vscode 插件,搜索 docker.安装后 F1,输入 docker add.按照提示一步一步生成 Dockerfile.

手动写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 使用node镜像
FROM node:14.21.0-alpine
# 在容器中新建目录文件夹 egg
RUN mkdir -p /egg
# 将 /egg 设置为默认工作目录
WORKDIR /egg
# 环境变量
ENV NODE_ENV=production
# 修改时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 将 package.json 复制默认工作目录
COPY package.json /egg/package.json
# 安装依赖
RUN npm config set register https://registry.npm.taobao.org
# 只安装dependencies的包
RUN npm --production
# 再copy代码至容器
COPY ./ /egg
# 7001端口
EXPOSE 7001
#等容器启动之后执行脚本
CMD npm start

新建dockerignore

排除一些不需要打包的文件.

5. 上传代码

不管是上传到 github,gitlab,还是 gitee.因为需要在服务器上下载.
当然如果想手动上传压缩也行,不过后期要配置自动化 CI/CD 的,那样比较麻烦.

6.下载代码到服务器

安装 git

记得安装 git,
不知道服务端怎么安装点这里
或者搜符合自己服务器版本的.

1
git clone https://github.com/xx-coding/youtube-clone-backend

7. 构建镜像

1
2
cd youtube-clone-backend
docker build -t youtube-clone-backend .

查看镜像

1
2
# 查看所有镜像
docker images

8. 创建容器

1
docker run -itd --name youtube-clone-container -p 7001:7001 youtube-clone-backend

测试是否连通

1
curl localhost:7001

注意服务器的安全组中端口开放.

查看容器

1
2
# 查看所有容器
docker ps -a

此时,还不能启动这个容器,因为我的需要连接数据库.

9. 部署 mongoDB

1
2
3
4
# 拉取镜像
docker pull mongo
# 创建mongo容器
docker run -p 27017:27017 -v ~/docker/mongo:/data/db --name docker_mongodb -d mongo
  • -v: 将宿主机~/docker/mongo 目录挂载到容器中的 /data/db 中,此目录为 MongoDB 数据存储位置.
  • -d:设置容器以守护进程方式运行
  • -p:宿主机 27017 端口映射到容器 27017 端口

创建用户

不创建好像连接后访问不了.

1
2
3
4
5
6
7
8
9
10
11
# 进入mongoDb容器
docker exec -it docker_mongodb mongosh

# 进入mongoDb
> use admin

# 创建用户名为admin, 密码为admin, 角色为root的用户;
> db.createUser({user:"admin",pwd:"admin",roles:[{role:"root",db:"admin"}]});

# 出现创建成功提示就对了,退出管理员
# > exit;

用管理员账户创建普通用户管理你的数据库.

1
2
3
4
5
6
7
# 用刚创建的管理用户登录
# mongo --port 27017 -u admin -p admin --authenticationDatabase admin
# 再创建一个普通用户
> use youtube-clone

# 普通用户账户: staff, 密码: staff, 有读写权限;
> db.createUser({user:"staff",pwd:"staff",roles:[{role:"readWrite",db:"youtube-clone"}]});

10. 将数据库容器与后端容器关联

修改后端项目中 MongoDB 的配置

1
2
3
// config.default.js
// 注意xxxxx是你的服务器IP名称,如果不想暴露可以写成环境变量
url: 'mongodb://staff:staff@xxxxxxx:27017/youtube-clone?authSource=staff',

创建自定义网络

1
docker network create youtube-net

将容器连接进网络

1
2
# 服务端容器连接网络
docker network connect youtube-net youtube-clone-container
1
2
# MongoDB连接网络
docker network connect youtube-net docker_mongodb

两个都连接到自定义网络就可以通信了.
至此.就应该可以通过 ip+端口号进行后端的接口访问了.

查看问题

1
2
# 查看执行日志
docker logs -f containerID

更简单的方法 docker-compose

其实就是把上面的指令写到文件中执行