在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的优点是可以轻松地创建相对安全性较高的应用。只需要更新和拉取即可。维护也很轻松。