やろうと思ったきっかけ
新しい案件でKubernetesを使うことになりました。
Dockerもほぼ使ったことがないので、これを機にDocker-Composeを使ってみようと思いました。
開発環境
PC:Windows10
仮想基盤:VirtualBox
OS:CentOS7
WEB:Nginx 1.25.2(latest)
コンテナ:Docker 24.0.6
:Docker-Compose 2.6.1
APP:Redmine 4.0.5
DB:MySQL 5.7
注意事項
- VirtualBox周りやOS周りの設定は今回の内容から外れるので省略します。
- イントラ環境等の企業内で検証を行う場合はプロキシ設定も確認すること。
- 検証目的のため、rootユーザでやっています。
- 証明書は自己署名証明書で行なっています。
- Nginxはリバースプロキシを行うために起動します。
やってみる
必要なパッケージを入れる
# yum -y install wget net-tools bind-utils yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum -y install docker-ce docker-ce-cli container.io docker-buildx-plugin docker-compose-plugin docker-compose
証明書を発行
作業ディレクトリを作成
# mkdir ~/docker-compose
# cd ~/docker-compose
秘密鍵の生成
# openssl genrsa -out privkey.key 2048
CSRの発行
# openssl req -new -key privkey.key -out server.csr
証明書の発行
# openssl x509 -days 3650 -req -signkey privkey.key < server.csr > fullchain.crt
Dockerを起動
# systemctl start docker
# systemctl enable docker
# systemctl status docker
Docker-Composeを入れる
# curl -SL https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# docker-compose --version
Docker-Compose YAMLファイルを作成
YAMLファイルを作成
※今回はサービスごとに分けておりませんが、
version: "3"
services:
proxy:
image: nginx:latest
ports:
- "80:80"
- "443:443"
container_name: proxy
volumes:
- ./ssl.conf:/etc/nginx/conf.d/ssl.conf
- ./fullchain.crt:/etc/nginx/conf.d/fullchain.crt:ro
- ./privkey.key:/etc/nginx/conf.d/privkey.key:ro
redmime:
container_name: redmine
image: redmine:4.0.5-passenger
restart: always
ports:
- 8080:3000
environment:
TZ: Asia/Tokyo
REDMINE_DB_MYSQL: mysql
REDMINE_DB_DATABASE: redmine_mytheme
REDMINE_DB_USERNAME: redmine_mytheme
REDMINE_DB_PASSWORD: redmine_mytheme
REDMINE_DB_ENCODING: utf8mb4
VIRTUAL_HOST: redmine.example.com
depends_on:
- mysql
volumes:
- ./src/assets:/usr/src/redmine/public/themes/mytheme
- ./src/plugins:/usr/src/redmine/plugins
- ./src/themes:/usr/src/redmine/public/themes
mysql:
container_name: mysql
image: mysql:5.7
restart: always
environment:
TZ: Asia/Tokyo
MYSQL_ROOT_PASSWORD: <MySQLのルートユーザのパスワード>
MYSQL_DATABASE: redmine_mytheme
MYSQL_USER: redmine_mytheme
MYSQL_PASSWORD: redmine_mytheme
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --general-log=true --general-log-file=/var/log/mysql/general.log
volumes:
- type: bind
source: ./volume/data
target: /dmp_data
リバースプロキシ用のNginxファイルを作成
server {
root /dev/null;
server_name redmine;
charset UTF-8;
access_log /var/log/nginx/redmine.local.access.log;
error_log /var/log/nginx/redmine.local.error.log;
# Set up SSL only connections:
listen *:443 ssl;
ssl_certificate /etc/nginx/conf.d/fullchain.crt;
ssl_certificate_key /etc/nginx/conf.d/privkey.key;
ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:!aNULL:!EXPORT:!DES:!MD5:!PSK:!RC4';
ssl_protocols TLSv1.2;
ssl_prefer_server_siphers on;
ssl_session_cache builtin:1000 shared:SSL10m;
ssl_session_timeout 5m;
client_max_body_size 0;
chunked_transfer_encoding on;
location / {
proxy_pass http://redmine:3000
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_read_timeout 900;
proxy_redirect default;
}
}
server {
listen 80;
server_name redmine;
server_tokens off
return 301 https://$http_host:$request_uri;
}
Docker-Composeを起動
# docker-compose up -d
コンテナ起動確認
# docker ps -a
ホストファイル設定
# vi /etc/hosts
※以下を追加する
<仮想マシンのIPアドレス> <バーチャルホスト名>
ブラウザ確認
https://<バーチャルホスト名>
番外編
docker-compose.yamlを変更した場合の反映コマンド
# docker-compose up -d --build
# docker-compose up -d
検証終わって掃除する場合のコマンド
コンテナを一掃する
# docker-compose down --rmi all --volumes --remove-orphans
#もしくはこちら
# docker rm -f `docker ps -a -q`
プロキシ環境で行う場合
systemdユニットファイルを追加
# mkdir -p /etc/systemd/system/docker.service.d
# touch /etc/systemd/system/docker.service.d/override.conf
# vi /etc/systemd/system/docker.service.d/override.conf
※こちらを追加
[Service]
Environment=HTTP_PROXY=<プロキシサーバのURLもしくはIPアドレス>:<ポート番号>
Environment=HTTPS_PROXY=<プロキシサーバのURLもしくはIPアドレス>:<ポート番号>
# systemctl daemon-reload
# systemctl restart docker
※念の為通信状態を確認し、できなければプロファイル上にプロキシ設定を確認などを行うこと
# docker run hello-world