三年优惠的服务器要到期了,趁着现在服务器有活动采购了一台,一年九十九,但是服务器之间竟然不支持镜像直接更新,所以趁着迁移的机会更新下部署方式。
当初只是为了不污染环境和安全原因,将基础服务放到了 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 写写简单的应用还真挺好用的,不用再重复写接口,可以直接去访问数据库或者请求三方接口拿数据。
另外还有 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 up -d
// 构建完成后后台运行
docker-compose up -build -d
// 构建完成某个服务后后台运行
docker-compose up --build -d service
而如果直接用 Docker 的话,可能就需要 build,stop,rm,run 才能完成 docker-compose 一个命令就能做到的事情。