Docker 学习记录
记录下本次部署时用到的 docker 相关内容
针对的是 Linux 服务器的部署
文中出现的 ip 均指的是服务器的外网 ip
建议服务器选择系统时直接选择带 Docker 的系统镜像,省去很多蛮烦
我开发用的是 windows 电脑,mac 或 linux 用户 可以看下怎么找对应替代方案
Docker 命令
shell
docker compose down --volumes --rmi all
部署 Nuxt3 项目
-
项目的代码准备好了
-
本地项目下执行
shellpnpm build
-
本地生成了 .output 文件夹
-
把 .output 文件夹上传到服务器
-
准备好 Dockerfile 文件
dockerfileFROM 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 文件夹同级
去构建镜像,在该级目录下执行以下命令,这里的 frontend 镜像的名称,可以自定义
shelldocker build --no-cache -t frontend .
-
创建并运行容器
shelldocker 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 镜像
shelldocker pull mongodb/mongodb-community-server:latest
-
运行 MongoDB
--auth
在MongoDB容器中启用身份验证-v /usr/local/mongodb/data:/data/db
-v /usr/local/mongodb/log:/data/log
将主机的目录或文件挂载到容器shelldocker 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 容器
shelldocker exec -it mongodb /bin/sh
-
使用 mongosh 启动服务,以27017作为端口号
shellmongosh --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
文件shellmkdir -p ~/data/docker_data/nginxproxymanager # 创建一个 npm 的文件夹 cd ~/data/docker_data/nginxproxymanager # 进入该文件夹 vim docker-compose.yml
-
docker-compose.yml
文件内容如下shellversion: '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 目录,用于存放证书,如果不存在的话,会自动创建
-
启动
shelldocker-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 数据库
-
拉取镜像
shelldocker 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
进行站点统计