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
进行站点统计