docker-composeを使ってサーバ環境を構築した際に、ホストOSを再起動時に自動でクライアント(子機?)も起動してほしい。k8sだのを使うべきとの意見もあるが、とりあえずDocker-compoesのみで戦ってみる。 systemctlコマンドを利用して、自動起動の登録をしました。
環境
- ホストOS: Ubuntu 16.04 LTS
- ゲストOS: いろいろ。
実装
※以降の作業は基本的にroot環境(sudo -s 実行後)で作業しています。
dockerの自動起動
dockerのプラットホーム(ゲストOSを動かすためのホストOS上のソフト?)をホストOSの起動時に自動で起動するための設定です。
systemctl enable docker
docker-compose(ゲストOS)の自動起動
systemctlにサービスとして起動したいものを登録していきます。
新規に/etc/systemd/system/web.serviceというファイルを作成 (webの部分は登録したいサービス名に置き換え)
[Unit]
Description=web
Requires=docker.service
[Service]
Environment=COMPOSE_FILE=/Path_to_docker-compose/docker-compose.yml
ExecStart=/usr/local/bin/docker-compose -p takunoko_server -f ${COMPOSE_FILE} up
ExecStop=/opt/bin/docker-compose -f ${COMPOSE_FILE} down
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
これでsystemctlコマンドから起動や停止ができるようになりました
# 起動
systemctl start web
# 停止
systemctl stop web
さらに、サービスとしてOSが起動したタイミングで自動実行するためには以下のコマンドを実行します。
systemctl enable web
注意点
- docker-compoes.yml内で
restart:always
を指定していると事故った時に少々面倒。systemctlで実行して起動がミスった際に残り続ける。- Restart=alwaysはsystemctl側で設定するため、docker-compose内では指定しないほうが吉(だと思う。。)。
- 完璧に完成したら
restart:always
にして良いと思います。
- /etc/systemd/system/(設定ファイル) を更新したら再読み込み
systectl daemon-reload