docker-composeでささっと開発環境を作るところまではスムーズにできるけど、
複数人でステージング環境が入ったりすると、systemdで動かせるようにしたい要望もちらほらではじめる。
いや、Kubernetesじゃん?って思う?
いやいやいやいや!!
ケース・バイ・ケース(笑)!!docker-composeでも一応やっとこ!笑
貧弱インフラマンには、ステージングからKubernetesは無理です(T_T)
概要
systemclt start docker-compose-app 的に動かせるようにする
手順は下記の流れです。
とりあえず、rootで実行してください。
- 作ったdocker-compose.ymlを/opt/srvに配置する
- myapp.serviceファイルを作成する
- /etc/systemd/system/に配置する
- systemctl で登録する
作ったdocker-compose.ymlを/opt/srvに配置する
例として、とりあえず、RailsのWebアプリと、SidekiqのWorkerアプリを作ります。
前ちらっと記事にしたやつを修正します。
Rails5 + Sidekiq + Redis + Postgresql + Nginx をdocker-composeで構築
Railsをweb、Sidekiqをworkerというサービスにして下記のファイルを作りました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
version: "3" services: web: build: . command: bundle exec rails s -b 0.0.0.0 volumes: - ./:/app:z ports: - "3000:3000" network_mode: bridge worker: build: . command: bundle exec sidekiq -C config/sidekiq.yml volumes: - ./:/app:z network_mode: bridge |
こやつを、/opt/srv配下に配置します。
ちなみにvolumesを使用しているので、Railsアプリのファイル群も
/opt/srvに配置してね、ファイルとか含めたimageの場合、volumeは使用しなくていいです。
ファイル構成はtreeでみるとこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# tree -L 1 . ├── Dockerfile ├── Gemfile ├── Gemfile.lock ├── README.md ├── Rakefile ├── VERSION ├── app ├── bin ├── config ├── config.ru ├── db ├── docker-compose.yml ├── lib ├── log ├── public ├── storage ├── test └── tmp |
myapp.serviceファイルを作成する
開発時とかは、docker-compose up -d で終わりではありますが
systemdで管理するため、serviceファイルをつくります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[Unit] Description=MyApp [Service] User=root ExecStart=/usr/bin/docker-compose -p myapp -f /opt/srv/docker-compose.yml up ExecStop=/usr/bin/docker-compose -p myapp -f /opt/srv/docker-compose.yml down ExecReload=/usr/bin/docker-compose -p myapp -f /opt/srv/docker-compose.yml restart Restart=always Type=simple [Install] WantedBy=multi-user.target |
こんな感じで大丈夫。
-p myappのところをそろえるようにね。
docker-compose build のときにも同様のパラメータを付与するようにね。
/etc/systemd/system/に配置する
つくったサービスファイルは/etc/systemd/system/に配置してね。
systemctl で登録する
最後は、systmctlでデーモンの登録をします。
1 |
# systemctl daemon-reload |
これでおっけーー!
status確認もできるでー!
1 |
# systemctl status myapp |
起動もできる
1 |
# systemctl start myapp |
あとはcompose buildを忘れないようね。
1 |
# docker-compose -p myapp build |
じゃあね〜〜〜〜。