【Docker/Kubernetes実践コンテナ開発入門】 ハンズオンレポート①
お久しぶりです。
年が明けてから残業続きでゆっくりブログを書く暇もなかったのですが、
そろそろ書くことが溜まってきてしまったのでアウトプットしたいと思います。
3日坊主はよくない…
- - -
今日は、12月ごろからCKAの勉強の為に始めた
↓こちらの本のハンズオンを実践中、個人的に詰まった箇所と原因について
書いていきたいと思います。
全然関係ないですがDockerのくじらくんってかわいいですよね。
詰まったところ①
最初に詰まったのは2.5の「Docker Composeでマルチコンテナを実行する」
というハンズオン。
内容的には、Jenkinsのイメージを使ってmaster,slaveのコンテナを
docker-compose.yamlで立て、JenkinsのGUIを使用して
masterからslaveにSSHログインできるように設定するというもの。
こちらは、
「プラグインが正常にインストールされず、slaveへのSSH設定ができない」
と言う問題と、
「なんとかプラグインを導入し、SSH接続の設定はできたものの
接続が行われない」
という二つの問題が起きました。
一つ目の問題は一応一人で解決できましたが、二つ目で心が折れたため
同僚に頼って問題を解決してもらいました。
こちらの問題については、以下の記事にまとめられています。
自分で問題解決できるような何度エラーが起きても折れない強い心と知識が欲しいですね。。
詰まったところ②
次に詰まったところは、3.1の「アプリケーションとコンテナの粒度」という
ハンズオン。
こちらの内容は、cronとjobを同時実行するコンテナを立てるというもの。
具体的には、以下のようなファイルを使用してハンズオンを実践しました。
- ディレクトリ構成
cronjob --- task.sh |- cron-example |- Dockerfile
- ジョブ(task.sh)
#!/bin/sh echo "[`date`] Hello!" >> /var/log/cron.log
- cron定義ファイル (cron-example)
* * * * * root sh /usr/local/bin/task.sh
- Dockerfile
FROM ubuntu:16.04 RUN apt update RUN apt install -y cron COPY task.sh /usr/local/bin/ COPY cron-example /etc/cron.d/ RUN chmod 0644 /etc/cron.d/cron-example CMD ["cron","-f"]
手順としては、まずこれらのファイルを作成。
その後、docker buildでイメージ作成、docker run でコンテナ実行という流れです。
以下、イメージ作成、コンテナ実行時のログです。
(コンテナのIDが所々違っていますが、何回も試行錯誤したログから拾っているためです。)
cronjob 17:11:36 hoge $ docker image build -t example/cronjob:latest . Sending build context to Docker daemon 4.096kB Step 1/7 : FROM ubuntu:16.04 ---> c6a43cd4801e Step 2/7 : RUN apt update ---> Running in c8d83cffbdb3 ~~ Step 3/7 : RUN apt install -y cron ---> Running in 0292a56710dc ~~ Step 4/7 : COPY task.sh /usr/local/bin/ ---> ad8839bc9806 Step 5/7 : COPY cron-example /etc/cron.d/ ---> 7223f2859b6c Step 6/7 : RUN chmod 0644 /etc/cron.d/cron-example ---> Running in a5dc6b120564 Removing intermediate container a5dc6b120564 ---> d9c90a65cbc2 Step 7/7 : CMD ["cron","-f"] ---> Running in a57809aa4090 Removing intermediate container a57809aa4090 ---> 9d17d7e6de4a Successfully built 9d17d7e6de4a Successfully tagged example/cronjob:latest cronjob 17:15:20 hoge $ docker container run -d --rm --name cronjob example/cronjob:latest ceea3d51fbe7062c268a37ffb8cface9dac045ba7c0d2ea76e6ef6ccad78ec84 cronjob 17:17:39 hoge $ cronjob 17:17:39 hoge $ cronjob 17:17:39 hoge $ docker container exec -it cronjob cat /var/log/cron.log cronjob 17:18:24 hoge $ docker container exec -it cronjob cat /var/log/cron.log cat: /var/log/cron.log: No such file or directory cronjob 17:19:10 hoge $ docker container exec -it cronjob cat /var/log/cron.log cat: /var/log/cron.log: No such file or directory cronjob 17:19:43 hoge $
おろ…??
1分経っても2分経ってもログが出されない。
cronjob 15:13:23 hoge $ docker container exec -it cronjob bash root@ab35381b94e8:/# ls -l /var/log total 236 -rw-r--r-- 1 root root 3090 Dec 12 01:51 alternatives.log drwxr-xr-x 1 root root 4096 Jan 25 06:08 apt -rw-r--r-- 1 root root 42621 Dec 12 01:51 bootstrap.log -rw------- 1 root utmp 0 Dec 12 01:51 btmp -rw-r----- 1 root adm 31 Dec 12 01:51 dmesg -rw-r--r-- 1 root root 141863 Jan 25 06:08 dpkg.log -rw-r--r-- 1 root root 3360 Dec 12 01:51 faillog drwxr-xr-x 2 root root 4096 Dec 12 01:51 fsck -rw-rw-r-- 1 root utmp 30660 Dec 12 01:51 lastlog -rw-rw-r-- 1 root utmp 0 Dec 12 01:51 wtmp
/var/logの中身をみてみたりしたけど、やっぱりない。
実行ファイルの中身がおかしかったか?と確認してみるけど、特に問題なさそう。
root@6d4b1785f6fd:/# ls /usr/local/bin task.sh root@6d4b1785f6fd:/# ls /etc/cron.d cron-example root@6d4b1785f6fd:/# ls -l /etc/cron.d total 4 -rw-r--r-- 1 root root 42 Jan 7 12:36 cron-example root@6d4b1785f6fd:/# ps -ax PID TTY STAT TIME COMMAND 1 ? Ss 0:00 cron -f 17 pts/0 Ss 0:00 /bin/bash 27 ? S 0:00 CRON -f 28 ? Ss 0:00 /bin/sh -c test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 29 ? S 0:00 run-parts --report /etc/cron.daily 30 ? S 0:00 /bin/sh /etc/cron.daily/apt-compat 37 ? S 0:00 sleep 211 43 pts/0 R+ 0:00 ps -ax root@6d4b1785f6fd:/# ls /tmp
他にもファイルがちゃんと配置されてるか、cronが動いてるかを確認してみたけど問題なさそう。
しかし、crontab -lでスケジュール設定されているかを確認してみると…
root@6d4b1785f6fd:/# crontab -l no crontab for root
スケジューリングされてない…?
root@6d4b1785f6fd:/# /etc/init init/ init.d/ root@6d4b1785f6fd:/# /etc/init init/ init.d/ root@6d4b1785f6fd:/# /etc/init.d/c checkfs.sh checkroot-bootclean.sh checkroot.sh cron root@6d4b1785f6fd:/# /etc/init.d/c checkfs.sh checkroot-bootclean.sh checkroot.sh cron root@6d4b1785f6fd:/# /etc/init.d/cron status * cron is running root@6d4b1785f6fd:/# /etc/init.d/cron restart * Restarting periodic command scheduler cron * Stopping periodic command scheduler cron [ OK ] * Starting periodic command scheduler cron
念のためcronを再起動してみるけど効果なし。
やっぱり定義ファイルに問題があるのか…?ということで、
cron定義ファイルの書き方をちゃんと調べて書き直してみました。
(最初から調べて書くべきでした)
イメージを作り直し、もう一回実行してみると…
cronjob 16:19:33 hoge $ docker container run -d --rm --name cronjob example/cronjob:latest c4a33f2a2c92b6f21a99333f354d0cb223d183737582cf03a405b42d8058479b cronjob 16:19:43 hoge $ docker container exec -it cronjob cat /var/log/cron.log cat: /var/log/cron.log: No such file or directory cronjob 16:19:57 hoge $ docker container exec -it cronjob cat /var/log/cron.log [Sat Jan 25 07:20:01 UTC 2020] Hello!
おお!ログが表示された!
どうやら、crontabの書き方が間違っていたようです。
今回のキモはこちらのサイトの以下の部分です。
「第 6」フィールド (行の残りの部分) には実行されるコマンドを指定する。
その行のコマンド部 (改行文字または % 文字まで) が /bin/sh
(またはその crontab ファイルの SHELL 環境変数で指定されたシェル) によって実行される。
最初はてっきりタブとスペースの置き方をミスっていたのかと思いましたが、
crontabを書くときはどこまでが実行コマンドかを判断させるために改行文字か%をコマンドの後ろに置く必要が
あったみたいです。
以前職場で、あるサーバのバックアップをとるためにバックアップシェルをcronで日次実行しようとしたとき、
何故か次の日実行されておらず、原因が分からずじまいでしたが
やっとわかりました。よかったよかった。
まとめとおまけ
一旦今日はここまでです。
12月上旬から始めてハンズオンにめちゃくちゃ時間がかかっている理由は、
こちらが原因です。
ハンズオン、理解が進んで楽しいんだけど、ファイル作成と参考書を読むことを交互に進めるのが非常に苦痛。。
— Mamekonb (@mamekonb) 2020年1月18日
なので一気にファイルを作成して後で一気に実行することにした
こないだやっとハンズオンで使用するすべて(?)の資材を作成し終わったので、
今日からやっとハンズオンを再開し始めた次第です。
資材を作るのがめんどくさい!という方は以下のgithubリポジトリを公開しておりますので
よろしければどうぞ。
くじらくんに癒やされながら残りのハンズオンも頑張っていきたいと思います。
おしまい