本文主要分享个人服务器的应用部署方案现状,容器化+代理网关+可视化管理。
我购买的是腾讯云服务器(2 核 4GB 3Mbps)
域名也是在腾讯云备案过的,提前准备域名解析
安装 Docker
curl -sSL https://get.daocloud.io/docker | sh
安装 Docker Compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
设置镜像加速和开机自启
mkdir /etc/docker
echo '{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}' > /etc/docker/daemon.json
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
创建 Traefik 目录,并在该目录下进行系列操作
cd ~
mkdir traefik
cd traefik/
创建 Traefik 的启动配置
vi traefik.yml
# 定义监听端口:web(80) 和 websecure(443)
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
# 配置发现提供者,这里为 docker
providers:
docker: {}
# 开启 Traefik 面板访问 (8080端口)
api:
dashboard: true
insecure: true
# 创建名称为 open-https 的 tls 配置(会使用 Let's Encrypt 自动生成 https 证书)
certificatesResolvers:
open-https:
acme:
email: "youremail@qq.com"
storage: "acme.json"
httpChallenge:
entryPoint: web
创建名称为 traefik 的 Docker 网络环境,后续 Traefik 和需要代理的应用容器都需要部署在该网络环境下才可以被访问到
docker network create traefik
创建 docker-compose 配置
vi docker-compose.yml
version: '3'
services:
traefik:
image: traefik:v2.4
# 需要将本地的 /var/run/docker.sock 挂载到 Traefik 容器内,才可以使用到 docker 配置发现
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- $PWD/traefik.yml:/etc/traefik/traefik.yml
restart: always
# 把 Traefik 容器监听的 80 和 443 端口映射到宿主机(以后宿主机只要暴露 80 和 443 就可以了,所有流量通过 Traefik 代理)
ports:
- "80:80"
- "443:443"
# 使用自定义的 traefik 网络
networks:
- traefik
# 标签配置,Traefik 的配置发现是通过标签抓取的
labels:
# 开启 redirectscheme 中间件,中间件名称为 redirect-https ,该中间件可以重定向 http 到 https ,达到强制 https 的目的
- "traefik.http.middlewares.redirect-https.redirectscheme.scheme=https"
# 配置一个名称为 traefik-service 的服务,容器内端口为 8080
- "traefik.http.services.traefik-service.loadbalancer.server.port=8080"
# 配置一个名称为 https-traefik 的路由,代理服务为 traefik-service
# 监听域名为 traefik.togettoyou.com ,端口为 websecure (443) 的流量请求
# 开启 tls ,使用 open-https ,自动签发证书
- "traefik.http.routers.https-traefik.service=traefik-service"
- "traefik.http.routers.https-traefik.rule=Host(`traefik.togettoyou.com`)"
- "traefik.http.routers.https-traefik.entrypoints=websecure"
- "traefik.http.routers.https-traefik.tls=true"
- "traefik.http.routers.https-traefik.tls.certresolver=open-https"
# 配置一个名称为 http-traefik 的路由,代理服务为 traefik-service
# 监听域名为 traefik.togettoyou.com ,端口为 web (80) 的流量请求
# 使用 redirect-https 中间件,将 http 请求重定向到 https,即重定向到了上面配置的 https-traefik 路由
- "traefik.http.routers.http-traefik.service=traefik-service"
- "traefik.http.routers.http-traefik.rule=Host(`traefik.togettoyou.com`)"
- "traefik.http.routers.http-traefik.entrypoints=web"
- "traefik.http.routers.http-traefik.middlewares=redirect-https"
networks:
traefik:
external: true
启动 Traefik
docker-compose up -d
访问 http://traefik.togettoyou.com 时会发现被 302 重定向到了 https://traefik.togettoyou.com ,并且自动配置了证书
查看面板也可以发现和我们预期的一致
Portainer 是一个 Docker 的可视化图形工具。
同理,我们创建 Portainer 目录,并在该目录进行系列操作
cd ~
mkdir portainer
cd portainer/
创建 docker-compose 配置
vi docker-compose.yml
version: '3'
services:
portainer:
image: portainer/portainer-ce
# 挂载 /var/run/docker.sock ,并持久化 portainer 数据
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- $PWD/data:/data
restart: always
# 使用自定义的 traefik 网络
networks:
- traefik
labels:
# 配置一个名称为 portainer-service 的服务,容器内端口为 9000
- "traefik.http.services.portainer-service.loadbalancer.server.port=9000"
# 配置一个名称为 https-portainer 的路由,代理服务为 portainer-service
# 监听域名为 docker.togettoyou.com ,端口为 websecure (443) 的流量请求
# 开启 tls ,使用 open-https ,自动签发证书
- "traefik.http.routers.https-portainer.service=portainer-service"
- "traefik.http.routers.https-portainer.rule=Host(`docker.togettoyou.com`)"
- "traefik.http.routers.https-portainer.entrypoints=websecure"
- "traefik.http.routers.https-portainer.tls=true"
- "traefik.http.routers.https-portainer.tls.certresolver=open-https"
# 配置一个名称为 http-portainer 的路由,代理服务为 portainer-service
# 监听域名为 docker.togettoyou.com ,端口为 web (80) 的流量请求
# 使用 redirect-https 中间件,将 http 请求重定向到 https,即重定向到了上面配置的 https-portainer 路由
- "traefik.http.routers.http-portainer.service=portainer-service"
- "traefik.http.routers.http-portainer.rule=Host(`docker.togettoyou.com`)"
- "traefik.http.routers.http-portainer.entrypoints=web"
- "traefik.http.routers.http-portainer.middlewares=redirect-https"
networks:
traefik:
external: true
启动 Portainer
docker-compose up -d
查看面板
访问 docker.togettoyou.com
利用 Docker + Traefik + Portainer ,极大方便了我们个人服务器应用部署。Traefik 监听着 80 和 443 端口,因此服务器只需要暴露出这两个端口,其他的流量请求都交由 Traefik 来代理,基于 Traefik 的配置发现机制,在部署我们的容器应用时只要在 Label 加上 Traefik 的规则即可;对于容器应用的启动停止、日志查看等使用 Portainer 绰绰有余,几乎不需要登陆到服务器上操作查看。