exlar's IT note

ITやスマートデバイスを中心とした趣味情報の寄せ集め

シンプルな Docker 実行環境 CentOS 7.2 に構築する

このブログ記事は移転しました。10秒後に自動でリダイレクトします。

----------------------

本記事の目標

Docker実行環境を CentOS で整えるにあたり、2016/4/23 現在での情報をまとめるものです。

f:id:exlair:20160423224522p:plain

OSのバージョンは、CentOS Linux release 7.2.1511 (Core) を利用しています。

背景(余談)

以前、CentOS6.6 から CentOS 7.0 へアップグレードするにあたり、色々と依存関係にひっかかっかりつつ強引なアップグレードを強行したのですが、その弊害でいま新たなパッケージをインストールすると失敗するケースが度々発生してしまうおかしい状態になっていました。

当該マシンでは Docker 1.2 を利用してましたが、現在はAPIバージョンも変更されており新たな Docker Image の取得さえ困難に…ということで、新規インストールすることとしました。

前提:マシンの準備

ESXiで作成した仮想マシン上にインストールすることを想定しています。 もちろん、物理マシンでも手順は大きく変わりませんが、余計な作業をしています。

OS イメージの入手

Download CentOS

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-scriptsifcfg-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

ひとまず動いているようです。 ここでは、

  1. 軽量のイメージ busybox をダウンロード-
  2. その後 busybox Image から docker run にてコンテナを起動(終了したらコンテナを即削除する --rm オプション付)
  3. exit にてコンテナを終了
  4. 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 のコンフィグがベタ書きされていることも多くあります。

Install Compose

まとめ

Docker を使うための最低限のシンプルな環境構築ということで一通りの手順を記載しました。

この頃、OSSなど多くのものが Docker Image を配布してくれているおかげで、「ちょっと試してみたいな」と思った時の敷居が非常に小さくなり嬉しいです。 とりあえず docker pull && docker run すればいいのですから。