【自宅サーバ】Cronを実行するDocker Containerを作る(CentOS)
こんにちは、yamori(yamori-tech)です。
今まで自宅内の各種サーバをCentOSの仮想マシン上で運用していたのですが、管理面の簡単さからコンテナでの運用に変えていっています。
このたびは単純なcronを実行するContainerを作成し、移行しました。
環境情報
ベースイメージ: CentOS7
Dockerfileの作成
Dockerfileはかなり単純です、anacron入りのcronieなどをインストールするとうまく動作せずハマりますのでご注意ください。
スクリプトはmydnsへIP情報を送信するためのcurlを打つ単純なものです。
標準出力とエラー出力を/var/log/cron.logに出力しています。
Dockerfile
FROM centos:7 # nonanacronのcronをインストール RUN yum install cronie-noanacron -y # 実行したいcronファイルの配置 COPY mydns.cron /etc/cron.d # 標準出力をログの内容にする RUN ln -sf /proc/1/fd/1 /var/log/cron.log CMD crond -n
mydns.cron
*/5 * * * * root /usr/bin/curl -s -I -u mydnsxxxxxx:xxxxxxxxx https://www.mydns.jp/login.html >> /var/log/cron.log 2>&1
動作確認
イメージをBuildして起動することで動作確認します。
# DockerイメージのBuild $ docker image build -t yamori.com/mydns . # コンテナを動作させる。スクリプトが起動すると結果が出力されてきます。 $ docker run yamori.com/mydns HTTP/1.1 200 OK Server: nginx Date: Thu, 23 Sep 2021 12:17:05 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Powered-By: PHP/7.4.21 # うまく動作しない場合は、 -d で起動して $ docker run -d yamori.com/mydns c998593c4dd25574b975f3af2b63d8c13fd520ceab67bbb8ca5ee863a863d431 # psでIDの確認 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c998593c4dd2 yamori.com/mydns "/bin/sh -c 'crond -…" 2 seconds ago Up 1 second goofy_benz # bashでコンテナに入って $ docker exec -it c998593c4dd2 bash # 入った先でデバッグします [root@c998593c4dd2 /]#
Dockerサーバで稼働させる
うまく動作することがわかったら、Dockerサーバでコンテナを起動させます。
# --restart alwaysで起動する $ docker run -d --restart always yamori.com/mydns
ついでにAnsibleのPlaybookでDeployできるようにします。
- hosts: all become: yes tasks: - name: Build用ディレクトリ作成 file: path=/var/docker/mydns state=directory - name: cronファイルのコピー copy: src=mydns.cron dest=/var/docker/mydns/mydns.cron - name: Dockerfileのコピー copy: src=Dockerfile dest=/var/docker/mydns/Dockerfile - name: イメージのビルド docker_image: build: path: /var/docker/mydns name: yamori.com/mydns tag: latest force_source: yes force_tag: yes source: build - name: コンテナの作成 docker_container: name: mydns-container image: jimaoka.com/mydns:latest state: started recreate: yes restart: yes restart_policy: always - name: 不要イメージ/コンテナの削除 docker_prune: images: yes containers: yes
まとめ
cronを実行するサーバをコンテナでの稼働に移行しました。
単純に定期的にcronを実行するだけのものなので、こんな感じでコンテナにして動かしておくのはリソース効率的にもかなり良さそうです。