随笔

迁移服务器至 Docker 部署

三年优惠的服务器要到期了,趁着现在服务器有活动采购了一台,一年九十九,但是服务器之间竟然不支持镜像直接更新,所以趁着迁移的机会更新下部署方式。

当初只是为了不污染环境和安全原因,将基础服务放到了 docker 中运行,平稳运行了两年多还挺好,之前应用并没有放进去,这次趁着迁移将应用都放进去了。

以前部署的基础服务比如数据库,Redis,在主机中直接通过端口访问即可,现在应用放进去需要创建一个网络桥接一下。

docker network create app-net

如果容器已经创建,可以使用 connect 连接网络

docker network connect app-net redis

如果未创建,可以在 run 时直接指定

docker run -d -p 3000:3000 --name camera --network app-net --restart=always camera:dev 

同一个网络下的应用就可以将容器名当成网络主机访问,比如127.0.0.1:6603 -> redis:6603

上周一直惦念着想买相机,爬了些数据做了个聚合相机信息的网站 Camera,用的 Next.js + Server Component 开发的,直接用的 Docker 部署,Server Component 写写简单的应用还真挺好用的,不用再重复写接口,可以直接去访问数据库或者请求三方接口拿数据。

cameralist.png

cameradetail.png

另外还有 Docker Compose 也试用了下,在 Simple Blog 项目中使用的,Docker Compose 更适用于一个独立的应用,我的服务器就承载了许多东西暂时还没梳理好,就没有使用 Docker Compose 来管理。

Simple Blog 中的 docker compose 配置文件如图,共有三个服务,数据库,后端,前端,算是一个比较正常的小型应用架构(或许也可以再加一层 nginx,把后端和前端的出口统一,这样直接映射到主机的 80 端口)。

version: '3.8'
services:
  db:
    image: mysql:8.0
    restart: always
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/config:/etc/mysql/conf.d
      - ./mysql/init:/docker-entrypoint-initdb.d

  backend:
    build: ./server
    restart: always
    depends_on:
      - db
    ports:
      - 8080:8080
    environment:
      - dbUrl=root:123456@tcp(db)/blog?charset=utf8
    volumes:
      - ./server/config.yml:/app/config.yml

  frontend:
    build: ./admin
    ports:
      - 8081:80

Docker Compose 的好处在于服务编排非常容易,之前需要每个单独执行 run 命令,配置也都在命令里,这里可以写到配置文件,一键管理所有服务。

docker-compose.png

// 直接启动后台运行
docker-compose up -d
// 构建完成后后台运行
docker-compose up -build -d
// 构建完成某个服务后后台运行
docker-compose up --build -d service

而如果直接用 Docker 的话,可能就需要 build,stop,rm,run 才能完成 docker-compose 一个命令就能做到的事情。

本文链接:https://note.lilonghe.net/post/migrate-server-to-docker.html

-- EOF --