Docker 学习记录

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

针对的是 Linux 服务器的部署

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

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

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

Docker 命令

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

部署 Nuxt3 项目

  1. 项目的代码准备好了

  2. 本地项目下执行

    shell 复制代码
    pnpm build
  3. 本地生成了 .output 文件夹

  4. 把 .output 文件夹上传到服务器

  5. 准备好 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"]
  6. Dockerfile 文件上传到服务器和 .output 文件夹同级

    去构建镜像,在该级目录下执行以下命令,这里的 frontend 镜像的名称,可以自定义

    shell 复制代码
    docker build --no-cache -t frontend .
  7. 创建并运行容器

    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

  1. 拉取 MongoDB Docker 镜像

    shell 复制代码
    docker pull mongodb/mongodb-community-server:latest
  2. 运行 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
  3. 进入 MongoDB 容器

    shell 复制代码
    docker exec -it mongodb /bin/sh
  4. 使用 mongosh 启动服务,以27017作为端口号

    shell 复制代码
    mongosh --port 27017
  5. 用 MongoDB Compass 验证部署是否成功,打开 MongoDB Compass 选择新建链接,输入

    这里选择自己的方式就行

    复制代码
    mongodb://ip:27017

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

安装 Nginx Proxy Manager

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

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

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

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

    shell 复制代码
    mkdir -p ~/data/docker_data/nginxproxymanager   # 创建一个 npm 的文件夹
    
    cd ~/data/docker_data/nginxproxymanager    # 进入该文件夹
    
    vim docker-compose.yml
  2. 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 目录,用于存放证书,如果不存在的话,会自动创建
  3. 启动

    shell 复制代码
    docker-compose up -d 
  4. 验证效果,浏览器输入 ip:81 查看是否部署成功 ,默认登录的用户名:admin@example.com 密码:changeme

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

安装 Portainer

  1. 拉取镜像

    复制代码
    docker pull portainer/portainer
  2. 创建并运行容器

    复制代码
    docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer/portainer
  3. 验证效果,浏览器输入 ip:9000 查看是否部署成功

安装 Redis

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

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

  3. 创建并运行容器

    复制代码
    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启动后数据持久化

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

    复制代码
    docker logs redis
  5. 会有启动的日志输出看到最后有这个Ready to accept connections tcp说明启动成功了

安装 PostgreSQL 数据库

  1. 拉取镜像

    shell 复制代码
    docker pull postgres
    docker pull postgres:alpine // 体积更小的Alpine
  2. 创建数据卷

    复制代码
    docker volume create postgre-data
  3. 创建并运行容器

    复制代码
    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

进行站点统计