Docker 学习记录

记录下本次部署时用到的 docker 相关内容

针对的是 Linux 服务器的部署

文中出现的 ip 均指的是服务器的外网 ip

建议服务器选择系统时直接选择带 Docker 的系统镜像,省去很多蛮烦

我开发用的是 windows 电脑,mac 或 linux 用户 可以看下怎么找对应替代方案

Docker 命令

shell 复制代码
docker compose down --volumes --rmi all

部署 Nuxt3 项目

先进行项目的打包,在项目根目录下运行

shell 复制代码
pnpm build

运行完成后本地生成了 .output 文件夹,把 .output 文件夹上传到服务器。

准备好 Dockerfile 文件

dockerfile 复制代码
FROM node:20.12.0-alpine as builder

WORKDIR /app

ENV NODE_OPTIONS="--max-old-space-size=1024"
COPY . .

RUN yarn config set registry https://registry.npmmirror.com/
RUN yarn && yarn build

FROM node:20.12.0-alpine

ENV APP_ROOT=/data/code
ENV TIME_ZONE=Asia/Shanghai
ENV PORT=2333

RUN echo "${TIME_ZONE}" > /etc/timezone \
 && ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime \
 && mkdir -p ${APP_ROOT}/.output

COPY --from=builder /app/.output ${APP_ROOT}/.output
COPY ./deploy/start.sh  ${APP_ROOT}

WORKDIR ${APP_ROOT}/

RUN chmod a+x start.sh

EXPOSE 2333
ENTRYPOINT ["node", ".output/server/index.mjs"]

将 Dockerfile 文件上传到服务器和 .output 文件夹同级
在该级目录下执行以下命令,进行镜像的构建

shell 复制代码
docker build --no-cache -t frontend .

创建并运行容器

shell 复制代码
docker run --restart=always --name frontend -d -p 2333:2333 frontend 

docker run: 这是用于在 Docker 中运行容器的命令。
--name frontend: --name 选项用于指定容器的名称。
-d: -d选项用于在后台模式下运行容器,即将容器作为守护进程运行。
-p 2333:2333: -p 选项用于将容器的端口映射到宿主机的端口。这里将容器的端口2333映射到宿主机的端口2333。
frontend: 这是要运行的镜像的名称,可以自定义。

安装 MongoDB

拉取 MongoDB Docker 镜像

shell 复制代码
docker pull mongodb/mongodb-community-server:latest

运行 MongoDB

--auth 在MongoDB容器中启用身份验证

-v /usr/local/mongodb/data:/data/db -v /usr/local/mongodb/log:/data/log 将主机的目录或文件挂载到容器

shell 复制代码
docker run --restart=always --name mongodb -p 27017:27017 -d mongodb/mongodb-community-server:latest --auth

-v /usr/local/mongodb/data:/data/db -v /usr/local/mongodb/log:/data/log

进入 MongoDB 容器

shell 复制代码
docker exec -it mongodb /bin/sh

使用 mongosh 启动服务,以27017作为端口号

shell 复制代码
mongosh --port 27017

用 MongoDB Compass 验证部署是否成功,打开 MongoDB Compass 选择新建链接,输入

这里选择自己的方式就行

复制代码
mongodb://ip:27017

成功链接上,说明部署成功。

安装 Nginx Proxy Manager

顾名思义,Nginx Proxy Manager 就是一个 Nginx 的代理管理器,它最大的特点是简单方便。

即使是没有 Nginx 基础的小伙伴,也能轻松地用它来完成反向代理的操作,而且因为自带面板,操作极其简单,非常适合配合 docker 搭建的应用使用。

Nginx Proxy Manager 后台还可以一键申请 SSL 证书,并且会自动续期,方便省心。

创建一个文件夹来存放 NPM 的 docker-compose.yml 文件

shell 复制代码
mkdir -p ~/data/docker_data/nginxproxymanager# 创建一个 npm 的文件夹

cd ~/data/docker_data/nginxproxymanager # 进入该文件夹

vim docker-compose.yml

docker-compose.yml 文件内容如下

shell 复制代码
version: '3.8'
services:
  app:
 image: 'jc21/nginx-proxy-manager:latest'
 restart: unless-stopped
 ports:
- '80:80'  # 不建议修改端口
- '81:81'  # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
- '443:443'# 不建议修改端口
- '3000:3000' # 不建议修改端口
 volumes:
- ./data:/data# 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 data 目录,用于存放数据,如果不存在的话,会自动创建
- ./letsencrypt:/etc/letsencrypt  # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 letsencrypt 目录,用于存放证书,如果不存在的话,会自动创建

启动

shell 复制代码
docker-compose up -d 

验证效果,浏览器输入 ip:81 查看是否部署成功 ,默认登录的用户名:admin@example.com 密码:changeme

详细可以参考这篇文章 Nginx Proxy Manager 部署

安装 Portainer

拉取镜像

复制代码
docker pull portainer/portainer

创建并运行容器

复制代码
docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer/portainer

验证效果,浏览器输入 ip:9000 查看是否部署成功

安装 Redis

拉取镜像,有特殊版本需求可以指定版本,我这里直接拉最新的

复制代码
$ docker pull redis:latest

因为我的开发环境并不是 Linux,又需要外部挂载 Redis 的配置文件,所以去下载 Linux Redis 到本地,解压后修改 redis.conf 再放到服务器的指定目录下

创建并运行容器

复制代码
docker run -p 6379:6379 --restart=always --name redis -v /data/redis/redis.conf:/etc/redis/redis.conf  -v /data/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

-p 6379:6379:把容器内的6379端口映射到宿主机的6379端口

-v /data/redis/redis.conf:/etc/redis/redis.conf:把宿主机配置好的redis.conf放到容器内的这个位置中

-v /data/redis/data:/data:把redis持久化的数据在宿主机内显示,做数据备份

redis-server /etc/redis/redis.conf:这个是关键配置,让redis不是无配置启动,而是按照这个redis.conf的配置启动

–appendonly yes:redis启动后数据持久化

查看一下日志是否运行成功

复制代码
docker logs redis

会有启动的日志输出看到最后有这个Ready to accept connections tcp说明启动成功了

安装 PostgreSQL 数据库

拉取镜像

shell 复制代码
docker pull postgres
docker pull postgres:alpine // 体积更小的Alpine

创建数据卷

复制代码
docker volume create postgre-data

创建并运行容器

复制代码
docker run -id --name=postgresql --restart=always -v postgre-data:/var/lib/postgresql/data -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e LANG=C.UTF-8 postgres

-p 5432:5432:把容器内的5432端口映射到宿主机的5432端口

-v postgre-data:/var/lib/postgresql/data:数据持久化

POSTGRES_PASSWORD=123456:PostgreSQL的超级用户的密码为123456 ,默认的用户名为 postgres,可以用 POSTGRES_USER 来指定

LANG: 设定语言环境为 C.UTF-8 以支持中文

安装 Umami

进行站点统计