1つの Dockerfile を使って、バージョンの違うイメージをいくつか作りたかった。
いろいろ調べていると build-time argumentsの利用 が docker 1.9 からできるらしい。
CentOS 7.1.1503 の最新の docker は 1.8 でどうしたものかと思っていたが、
公式サイトに Docker Repository を追加する方法が載っていた。
こちらの方が最新版をすぐ使えそうなので、さっそく移行してみた。
Docker 停止
# systemctl stop docker
CentOSリポの Docker 削除
# yum remove docker docker-selinux
docker.x86_64 0:1.8.2-7.el7.centos
docker-selinux.x86_64 0:1.8.2-7.el7.centos
# tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
Dockerリポからインストール
# yum install docker-engine
docker-engine.x86_64 0:1.9.1-1.el7.centos
docker-engine-selinux.noarch 0:1.9.1-1.el7.centos
# systemctl start docker
これだけでイメージやコンテナが失われず移行できてしまった。
##/etc/sysconfig/docker が読まれてない問題(追記)
Remote API を使えるようにするため
/etc/sysconfig/docker に Daemon socket option を指定していたが効いていなかった。
OPTIONS='-H tcp://0.0.0.0:2375'
公式マニュアル Custom Docker daemon options に従ってやってみたら効くようになった。
ようは、Systemdの設定ファイルで /etc/sysconfig/docker を読み込むようになっていない様子。
# cat /lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/docker daemon -H fd://
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
[Install]
WantedBy=multi-user.target
公式ドキュメントに従って下記のようにやってみたらOKだった。
# systemctl show docker | grep Env
出力なしなので、Custom Docker daemon options の設定をする
# mkdir /etc/systemd/system/docker.service.d
# tee /etc/systemd/system/docker.service.d/docker.conf <<EOF
[Service]
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// \$OPTIONS \\
\$DOCKER_STORAGE_OPTIONS \\
\$DOCKER_NETWORK_OPTIONS \\
\$BLOCK_REGISTRY \\
\$INSECURE_REGISTRY
EOF
# systemctl restart docker
Warning: Unit file of docker.service changed on disk, 'systemctl daemon-reload' recommended.
# systemctl show docker | grep Env
出力なしだったので、Warning を試す
# systemctl daemon-reload
# systemctl show docker | grep Env
EnvironmentFile=/etc/sysconfig/docker (ignore_errors=yes)
EnvironmentFile=/etc/sysconfig/docker-storage (ignore_errors=yes)
EnvironmentFile=/etc/sysconfig/docker-network (ignore_errors=yes)
設定ファイルが読まれるようになったことが確認できた
# ps -ef | grep docker
root 10000 1 0 01:20 ? 00:00:00 /usr/bin/docker daemon -H fd://
この時点ではまだ反映されていない
# systemctl restart docker
# ps -ef | grep docker
root 10071 1 4 01:21 ? 00:00:00 /usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
無事に反映された