Docker 実行環境を新規構築(CentOS 7.2)
Docker実行環境を CentOS で整えるにあたり、2016/4/23 現在での情報をまとめるものです。
OSのバージョンは、CentOS Linux release 7.2.1511 (Core) を利用しています。
背景
以前、CentOS 6.6 から CentOS 7.0 へアップグレードするにあたり、様々な依存関係にひっかかっかりつつアップグレードを強行したのですが、その弊害で現座、新たなパッケージをインストールすると失敗するケースが度々発生してしまうおかしい状態になっていました。
当該マシンでは Docker 1.2 を利用してましたが、現在はAPIバージョンも変更されており新たな Docker Image の取得さえ困難に…ということで、新規インストールすることとしました。
事前準備
ESXiで作成した仮想マシン上にインストールすることを想定しています。 もちろん、物理マシンでも手順は大きく変わりませんが、余計な作業をしています。
OS イメージの入手
http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
OSインストール直後の設定
パッケージを最新化
とりあえず何も考えずに各パッケージを最新化します。
yum update
仮想マシン環境下におけるポイント
仮想マシンを作成する際に NIC を VMXNET3 でしか作成しなかった場合、VMwareTooolsをインストールしていない状態ではIPアドレスの割当が行われず、ネットワークへの接続ができなくなります。そして、VMwareTools を利用しようにも Minimal 環境下では Perl もインストールされていませんので詰んでしまいます。
その場合、一度シャットダウンした後、仮想マシンの編集で NIC を E1000 で追加して再度起動すると、DHCPでアドレスが取得されるはずです。
VMwareTools もどきの open-vm-tools をインストール
レポジトリを追加する
vi /etc/yum.repos.d/vmware-tools.repo
# 記載内容は以下のとおり
[vmware-tools]
name = VMware Tools
baseurl = <http://packages.vmware.com/packages/rhel7/x86_64/>
enabled = 1
gpgcheck = 1
open-vm-tools をインストールする。
# 鍵の取得
rpm --import <http://packages.vmware.com/tools/keys/VMWARE-PACKAGING-GPG-RSA-KEY.pub>
# アップデートしたうえで open-vm-tools が見つかるか確認
yum update && yum search open-vm-tools
# 問題なければインストール
yum install open-vm-tools
インストール前の ip a show
(ifconfig相当)
inet6など若干省略しています。ens160(VMXNET3で作成したNIC)にIPアドレスが割り振られていないことが分かります。なお、数字は環境により異なります。
[root@yourhost ~]# ip a show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
3: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:XX:XX:XX:YY brd ff:ff:ff:ff:ff:ff
inet 192.168.4.56/24 brd 10.0.4.255 scope global dynamic ens33
valid_lft 85504sec preferred_lft 85504sec
ネットワーク設定の変更
先ほど割り当てたNICは暫定的なものなので、VMXNET3 のNICに対し固定IPを設定します。(もちろん、DHCPで運用を続ける場合は必要ありません)
従来 /etc/sysconfig/network-scripts
の ifcfg-xxxx
を直接変更してきましたが、CentOS 7 からは nmcli
コマンドが推奨されているようなので、コンフィグを直接編集する代わりにコマンドを利用してみます。
CentOS 7.1.1503ではnmcliでIPアドレスを固定する方法が変更された - Qiita
# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 10.0.4.13/24 ipv4.gateway 10.0.4.1 ipv4.dns "10.0.4.12 10.0.4.15"
すると、/etc/sysconfig/network-scripts
でも変更した対象のコンフィグが変更されます。その後rebootにて固定IPが設定されていることを確認しましょう。
# systemctl restart NetworkManager
こちらのコマンドでもよいみたいですが。 なお、ONBOOT が yes になっているかしっかり確認しましょう。
- ONBOOT=no
+ ONBOOT=yes
OSインストール後の定番の設定
各自好みもでてきますので、必要な設定を行ってください。 ここでは以下の状態を目指します。
- docker コマンドは一般ユーザーで行えるようにする (<–Dockerインストール後の作業)
- root には原則スイッチしない。sudoで行う
- SSHは鍵認証のみに制限し、かつログイン可能ユーザーも限定する
- SELinuxはOFFに…せず、本当に面倒くさくなった時にOFFにする
- 最初っからセキュリティレベルを下げすぎる意味はないという意味
- Dockerでの利用が主ならば、それで済むことも多いはず
- 参考記事:SELinux と Docker と OpenShift v3 - Qiita
- シェルはzsh。コンフィグには Prezto を利用して楽をする
その他インストールパッケージ群
- sudo yum install -y git
- sudo yum install -y zsh
OSバージョンアップなど今後の運用負担を考慮し、できるだけ最小限にしています。
各種リンク
Docker のインストール
$ yum info docker
$ sudo yum -y install docker
$ sudo systemctl status docker
インストール直後は起動していません。
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: <http://docs.docker.com>
念のため再起動して、自動起動するか確認します。
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since 土 2016-04-23 21:43:01 JST; 15s ago
Docs: <http://docs.docker.com>
Main PID: 891 (sh)
CGroup: /system.slice/docker.service
├─891 /bin/sh -c /usr/bin/docker daemon $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS ...
├─894 /usr/bin/docker daemon --selinux-enabled
└─895 /usr/bin/forward-journald -tag docker
上がってこない場合は、有効化しましょう。
$ sudo systemctl enable docker
一般ユーザーで Docker コマンドを利用する設定
利用したいユーザーを Docker のグループに追加します。
CentOS 7 の場合、グループは dockerroot
のようですね。docker
とやると、対象は存在しないと警告されてしまいます。
で、グループ追加するだけでOK…のはずだったのですが。
$ sudo gpasswd -a user_onamae dockerroot
$ docker ps
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED ...
ここでは、sudo
にて docker ps
コマンド(動作確認を目的として、稼働中のコンテナを表示するコマンド)を叩くときちんと動作していますが、通常ユーザーでは警告が表示され上手くいかないという状態を表しています。
とりあえず対処策として、下記対処で様子を見ることとしました。
# Modify these options if you want to change the way the docker daemon runs
#OPTIONS='--selinux-enabled'
OPTIONS='--selinux-enabled -G dockerroot'
via Ec2 Centos7 + Docker 1.6 · Issue #13098 · docker/docker
修正前の動作 docker.sock の状態
$ ls -l /var/run/ | grep docker
srw-rw----. 1 root root 0 4月 23 21:49 docker.sock
修正後の動作 docker.sock の状態
$ ls -l /var/run/ | grep docker
srw-rw----. 1 root dockerroot 0 4月 23 21:57 docker.sock
動作確認:
$ docker pull busybox
Using default tag: latest
Trying to pull repository docker.io/library/busybox ... latest: Pulling from library/busybox
4b51ded9aed1: Pull complete
307ac631f1b5: Pull complete
Digest: sha256:4a887a2326ec9e0fa90cce7b4764b0e627b5d6afcb81a3f73c85dc29cea00048
Status: Downloaded newer image for docker.io/busybox:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/busybox latest 307ac631f1b5 5 weeks ago 1.113 MB
$ docker run -it --rm busybox
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
/ #
/ # exit
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ひとまず動いているようです。 ここでは、
- 軽量のイメージ
busybox
をダウンロード- - その後
busybox
Image からdocker run
にてコンテナを起動(終了したらコンテナを即削除する-rm
オプション付) exit
にてコンテナを終了docker ps -a
(終了しているコンテナを含め全てを表示) し、何も表示されない=コンテナが削除されていること
を一連のステップで確認しています。
これで Docker の実行環境が整いました。
$ docker version
Client:
Version: 1.9.1
API version: 1.21
Package version: docker-1.9.1-25.el7.centos.x86_64
Go version: go1.4.2
Git commit: 78ee77d/1.9.1
Built:
OS/Arch: linux/amd64
Server:
Version: 1.9.1
API version: 1.21
Package version: docker-1.9.1-25.el7.centos.x86_64
Go version: go1.4.2
Git commit: 78ee77d/1.9.1
Built:
OS/Arch: linux/amd64
ここまでで消費しているディスクサイズは 1.5GB ほどで、とてもスッキリしています。
$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/mapper/centos-root 48G 1.3G 47G 3% /
tmpfs 921M 8.5M 912M 1% /run
/dev/sda1 497M 166M 332M 34% /boot
..(一部省略)
なお、ここでは触れていませんが Docker Compose のインストールもほぼ必須です。ないことで何かができなくなるということはありませんが、Dockerコンテナの扱いが非常に楽になります。Dockerで実行可能な各種ソフトウェア群の Quick Start なんかでは Docker Compose のコンフィグがベタ書きされていることも多くあります。
まとめ
Docker を使うための最低限のシンプルな環境構築ということで一通りの手順を記載しました。
この頃、OSSなど多くのものが Docker Image を配布してくれているおかげで、「ちょっと試してみたいな」と思った時の敷居が非常に小さくなり嬉しいです。
とりあえず docker pull
&& docker run
すれだけですからね。