昨年、「dockerでWebサイトを集約してみた一事例」というのを書いたんだけど、同じようなことをCentOS7でやったので、前の記事のアップデートと、自分の備忘を兼ねて、書いておく。
最初に
「dockerでWebサイトを集約してみた一事例」でやったことを、CentOS7でやった。スクリプトがやっつけなので、dockerのバージョンアップで具合が悪くなってたとこもあるので、細かく修正もした。
逃れえぬ運命、Systemd
「UbuntuLTSで遊んでりゃいいや」と思っていたが、転職したので「CentOSですよね」みたいな感じになった。そして立ちはだかるCentOS7。CentOSを普段使いしてた人たちからさえ悲鳴が上がるという状況で、この老害生き残れるのか?と思ったけど、普段使いしてなかったせいか、いろんなことをきれいさっぱり忘れていて、素直に受け止められた。
Ubuntuの事例では、upstartのスクリプト書いてゴニョってたけど、今回はその部分がSystemdのサービス登録になる。
[Unit]
Description=DockerContainersRestart
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/root/docker-containers-restart.sh
[Install]
WantedBy=multi-user.target
#!/bin/bash
cat /etc/hosts | grep -v 172.17. > /tmp/hostsbase
docker start $(docker ps -a -q)
docker inspect $(docker ps -q) | grep '"IPAddress":' | tr -d "[:alpha:][:blank:]:,\"" > /tmp/list1
docker inspect $(docker ps -q) | grep '"Name": "/' | sed -e "s/ \"Name\": \"\///g" | tr -d ",\"" > /tmp/list2
paste -d " " /tmp/list1 /tmp/list2 >> /tmp/hostsbase
mv /tmp/hostsbase /etc/hosts
「grep '"IPAddress":'」のとこは前回から修正した。dockerのバージョンアップでinspectの結果が変化してたっぽく、知らん間に動かなくなってたので。ほんとは、ちゃんとパースするべきなんだろうけど。
依存関係の記述については、/usr/lib/systemd/system/nginx.serviceのものをコピーしている。その上で、/usr/lib/systemd/system/nginx.serviceをコピーして、依存関係だけ修正した、
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=docker-containers-restart.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
を作った。要点は、nginxを起動する用意ができたら、nginxを起動する前に、コンテナのリスタートと、/etc/hostsの修正をやってしまうというところ。ここはUbuntuの時、スタートアップ機構が並存してて、nginxの起動タイミングを制御できなくて不完全だった機構が、Systemdに統一された環境のおかげで、きれいに作れた。
Systemd、良いかも知んない。
定期バックアップ
#!/bin/bash
CONTAINERS=(`docker inspect $(docker ps -q) | grep '"Name": "/' | sed -e "s/ \"Name\": \"\///g" | tr -d ",\""`)
IMAGES=(`docker inspect $(docker ps -q) | grep ' "Image": "' | sed -e "s/ \"Image\": \"//g" | tr -d ",\"" | sed -e "s/:.*//g"`)
VERSION=(`env LANG=en_US.UTF-8 date +%a`)
if [ "`date +%d`" = "01" ] ; then
VERSION=(`env LANG=en_US.UTF-8 date +%b`)
fi
for (( i = 0; i < ${#CONTAINERS[@]}; ++i ))
do
docker commit ${CONTAINERS[$i]} ${IMAGES[$i]}:$VERSION
done
docker rmi $(docker images | awk '/^<none>/ { print $3 }')
grepのとことか、dateのロケールとか、ちょっと修正した。