在Docker中优雅地配置个人运营网站的SSL

最近,在圈子里有个提案说要用来介绍我建立的WordPress项目,所以这是我制作过程中的备忘录。
首先,我会使用docker-compose来搭建WordPress。

version: '2'
services:
  db:
    image: mysql:5.7
    volumes:
      - /home/core/wordpress/data/db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - /home/core/wordpress/wp-content:/var/www/html/wp-content
    links:
      - db
    ports:
      - 80:80
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: wordpress

在一个好的文件夹里准备好,在文件夹内执行docker-compose up -d命令,好了,搞定了。太棒了!

但是,仅通过http无法访问…不想要使用https吗?想要使用。
最近,似乎无法通过https连接会对谷歌搜索结果产生影响,所以绝对要做这个配置。
因此,将在Docker上进行SSL支持。由于使用的操作系统是coreos,所以将创建SSL支持的容器。

起初我考虑要自己来创建镜像,但这不是我主要工作领域,平时我都是开发游戏的,所以决定使用在github或dockerhub上由专业人士创建的镜像。


「JrCs/docker-letsencrypt-nginx-proxy-companion」这个镜像的主要功能是监视Docker.sock,并使用主机名和电子邮件地址从Let’s Encrypt获取SSL证书。而且它还会自动进行更新操作。非常棒对吧。
虽然你可以通过适当地配置此镜像就能解决问题,但是当有其他容器增加时需要花费一些麻烦。所以我们需要再添加一个镜像来处理这个问题。

「jwilder/nginx-proxy」這個映像檔的功能可以簡單說明為監視Docker.sock並自動連接到指定參數的容器。其內部主要是使用Nginx,可以作為前端服務,方便對其他後端容器進行基本身分驗證等功能的應用。此外,它還可以自動處理SSL重定向(?)。

然后,我们将添加这两个选项并进行SSL的支持。

version: '2'
services:
  db:
    image: mysql:5.7
    volumes:
      - /home/core/wordpress/data/db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - /home/core/wordpress/wp-content:/var/www/html/wp-content
    links:
      - db
    expose:
      - 80
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: wordpress
      VIRTUAL_HOST: www.hoge.jp
      LETSENCRYPT_HOST: www.hoge.jp
      LETSENCRYPT_EMAIL: hoge@mail.com
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - 80:80
      - 443:443
    volumes:
      - /home/core/wordpress/certs:/etc/nginx/certs:ro
      - /home/core/wordpress/htpasswd:/etc/nginx/htpasswd
      - /etc/nginx/vhost.d
      - /usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro

  letsencrypt-nginx-proxy-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    volumes:
      - /home/core/wordpress/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    volumes_from:
      - nginx-proxy

networks:
  default:
    external:
      name: ssl-proxy

启动后稍等片刻即可完成SSL支持。生成认证证书需要一点时间。

虚拟主机:www.hoge.jp
LETSENCRYPT主机:www.hoge.jp
LETSENCRYPT邮箱:hoge@mail.com
上述参数是关键,这些参数能够自动配置连接,以找到先前介绍的镜像容器,让它们良好地连接起来。
另外,需要注意的是,如果Docker的网络不相同,将找不到容器,请确保正确设置。完全忘记这一点,会在无尽的犹豫中度过周末。

即使对web开发不够了解,Docker的优点是可以轻松地创建相对安全性较高的应用。只需要更新和拉取即可。维护也很轻松。