ネットワーク側での準備
使いたいドメイン名がちゃんと名前解決できるように設定しておきます。
ホスト側の準備
以下のポートを解放しておきます。nc
コマンド等で外から通信できることを確認しておいてください。(phpmyadminとFTPは管理上必要でない場合、攻撃を受ける機会を増やすので使わない方がいいです!)
# HTTPとHTTPS TCP:80 TCP:443 # phpmyadminのため TCP:9020 # FTPのため TCP:21 TCP:30000
dockerの準備
ファイル類の準備
ディレクトリ構造は以下。
docker-wordpress/ ├── db-data/ ├── docker-compose.yml ├── ftp/ └── wordpress/
docker-compose.yml
は以下のようにします。
外部に公開されるFTPのパスワードなどは適当に良い感じにしてください。
あと一通りの準備作業が終わり不要になったらFTPやphpMyAdminは無効にしたほうがいいです。攻撃されます。
version: "3.2"
services:
# WordPressの記事などを管理するDB
mysql:
# 5にしといた方が面倒がないが8でも良い
image: mysql:5
environment:
- MYSQL_ROOT_USER=root
- MYSQL_ROOT_PASSWORD=rootpass
- MYSQL_DATABASE=wpdb1
- MYSQL_USER=wp_user1
- MYSQL_PASSWORD=user1pass
volumes:
- ./db-data:/var/lib/mysql
- ./db-data:/docker-entrypoint-initdb.d
expose:
- 3306
# WordPressをホストするHTTPサーバ
wordpress:
image: wordpress:latest
expose:
- 80
depends_on:
- mysql
links:
- mysql
environment:
- WORDPRESS_DB_HOST=mysql:3306
- WORDPRESS_DB_NAME=wpdb1
- WORDPRESS_DB_USER=wp_user1
- WORDPRESS_DB_PASSWORD=user1pass
volumes:
- ./wordpress:/var/www/html
# phpmyadmin、WordPressで使用するDBの管理に用いる
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=mysql
- PMA_USER=root
- PMA_PASSWORD=rootpass
depends_on:
- mysql
links:
- mysql
ports:
- 9020:80
volumes:
- /sessions
# pluginとかアップロード用のFTPサーバ(https://github.com/stilliard/docker-pure-ftpd/wiki/Docker-stack-with-Wordpress-&-FTP)
# パーミッションが適切に設定されていれば、WordPress管理画面からできるのであまり必要ない
ftp:
# optionally replace username/repo:tag with your name and image details
image: stilliard/pure-ftpd:latest
deploy:
replicas: 1
restart_policy:
condition: on-failure
environment:
PUBLICHOST: 127.0.0.1 #(**MUST REPLACE!** ホストのIPアドレスにする)
FTP_USER_NAME: "user1"
FTP_USER_PASS: "ftpuser1pass"
FTP_USER_HOME: "/var/www/html"
FTP_USER_UID: 33
FTP_USER_GID: 33
volumes:
- ./wordpress:/var/www/html
- ./ftp:/etc/ssl/private
ports:
- target: 21
published: 21
protocol: tcp
mode: host
# Bind each passive ports to the host
- target: 30000
published: 30000
protocol: tcp
mode: host
# HTTPとHTTPSサーバ
# Lets's encryptのドメイン認証(DV)を取得、自動更新もしてくれる!
# HTTP(80番ポート)にきたリクエストもHTTPSに301リダイレクトしてくれる
https-portal:
image: steveltn/https-portal:latest
ports:
- '80:80'
- '443:443'
depends_on:
- wordpress
links:
- wordpress
restart: always
environment:
# wordpressイメージから作成したコンテナはTCP80番で待ち受けるので矢印の右側はhttpにする。(WordPress内の設定画面ではちゃんとアドレスはhttps://...にする)
DOMAINS: 'yourdomain.com -> http://wordpress' #(**MUST REPLACE!** 矢印の左側を自分のドメインにする)
STAGE: 'production'
FORCE_RENEW: 'true'
https-portalを上の設定で何回もup/downさせてると、Let’s Encryptのレートリミットに達してしまう可能性があるので気をつけてください。
そこら辺は SteveLTN/https-portal に書いてあります。最初はSTAGEは staging にして試すべきですし、FORCE_RENEWはfalseにして、無駄に繰り返さないで済むようにデータをvolumeに保存するといいようです。
(今回は面倒だったのでサイトの公開最優先で無理矢理やるように書きました。)
サーバの起動
コンテナ起動
sudo docker-compose up
1分か2分くらいでhttps-portal
の準備ができ、下のようになります。これで通信できるようになりました!
なお、マルチドメインの場合でも、https-portal
によって複数のドメイン名をホストできます。こんがらかって嫌な場合は、HAProxyを使っていい感じにします。
以上です。
コメント