Fugu Log

げきょゎエンジニアの技術修行ブログ

【Docker/Kubernetes実践コンテナ開発入門】 ハンズオンレポート①

 

お久しぶりです。

年が明けてから残業続きでゆっくりブログを書く暇もなかったのですが、

そろそろ書くことが溜まってきてしまったのでアウトプットしたいと思います。

3日坊主はよくない…


- - -


今日は、12月ごろからCKAの勉強の為に始めた

↓こちらの本のハンズオンを実践中、個人的に詰まった箇所と原因について

書いていきたいと思います。


gihyo.jp


全然関係ないですがDockerのくじらくんってかわいいですよね。

f:id:siromamex:20200125221419p:plain
moby dock
 

詰まったところ①

最初に詰まったのは2.5の「Docker Composeでマルチコンテナを実行する」

というハンズオン。

 

内容的には、Jenkinsのイメージを使ってmaster,slaveのコンテナを

docker-compose.yamlで立て、JenkinsのGUIを使用して

masterからslaveにSSHログインできるように設定するというもの。

 

こちらは、

プラグインが正常にインストールされず、slaveへのSSH設定ができない」

と言う問題と、

「なんとかプラグインを導入し、SSH接続の設定はできたものの

 接続が行われない」

という二つの問題が起きました。

 

一つ目の問題は一応一人で解決できましたが、二つ目で心が折れたため

同僚に頼って問題を解決してもらいました。

 

こちらの問題については、以下の記事にまとめられています。

 
qiita.com


 

自分で問題解決できるような何度エラーが起きても折れない強い心と知識が欲しいですね。。

 

詰まったところ②

次に詰まったところは、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の書き方が間違っていたようです。


今回のキモはこちらのサイトの以下の部分です。

manpages.debian.org

「第 6」フィールド (行の残りの部分) には実行されるコマンドを指定する。
その行のコマンド部 (改行文字または % 文字まで) が /bin/sh
(またはその crontab ファイルの SHELL 環境変数で指定されたシェル) によって実行される。


 最初はてっきりタブとスペースの置き方をミスっていたのかと思いましたが、
crontabを書くときはどこまでが実行コマンドかを判断させるために改行文字か%をコマンドの後ろに置く必要が
あったみたいです。


以前職場で、あるサーバのバックアップをとるためにバックアップシェルをcronで日次実行しようとしたとき、
何故か次の日実行されておらず、原因が分からずじまいでしたが
やっとわかりました。よかったよかった。

まとめとおまけ

一旦今日はここまでです。
12月上旬から始めてハンズオンにめちゃくちゃ時間がかかっている理由は、
こちらが原因です。

こないだやっとハンズオンで使用するすべて(?)の資材を作成し終わったので、
今日からやっとハンズオンを再開し始めた次第です。

資材を作るのがめんどくさい!という方は以下のgithubリポジトリを公開しておりますので
よろしければどうぞ。

github.com


くじらくんに癒やされながら残りのハンズオンも頑張っていきたいと思います。


おしまい