読者です 読者をやめる 読者になる 読者になる

めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

OpenStack上でRHEL7のDockerを使う手順

事前準備

取り急ぎのメモ書き・・・。CentOS7でも本質的には同じです。CentOS7の場合は、subscription-managerコマンドは無視してください。

はじめに、RHEL7のクラウドイメージをCustomer Portalからダウンロードして、Glanceに登録しておきます。

Dockerのイメージ保存領域を追加のエフェメラルディスクに配置するので、追加のエフェメラルディスク(とついでにSwap領域)を持ったフレーバー m1.docker を定義しておきます。

# nova flavor-show m1.docker
+----------------------------+--------------------------------------+
| Property                   | Value                                |
+----------------------------+--------------------------------------+
| OS-FLV-DISABLED:disabled   | False                                |
| OS-FLV-EXT-DATA:ephemeral  | 20    <---ココが重要                  |
| disk                       | 10                                   |
| extra_specs                | {}                                   |
| id                         | a385b85b-8efd-4149-a914-4d870f09af9b |
| name                       | m1.docker                            |
| os-flavor-access:is_public | True                                 |
| ram                        | 1024                                 |
| rxtx_factor                | 1.0                                  |
| swap                       | 2048     <---ココが重要               |          
| vcpus                      | 1                                    |
+----------------------------+--------------------------------------+

RHEL7のイメージからVMインスタンスを起動してログインしたら、下記のコマンドでDockerを導入します。

# subscription-manager register
# subscription-manager attach --pool=<pool id>
# subscription-manager repos --disable=*
# subscription-manager repos --enable=rhel-7-server-rpms --enable=rhel-7-server-extras-rpms
# yum -y update
# yum -y install docker lvm2

この状態でインスタンスを停止(削除ではないですよ!)して、スナップショットを作成しておきます。(スナップショットを作成する前のゴミ掃除は適当にお願いします。)

# glance image-list
+--------------------------------------+------------------+-------------+------------------+------------+--------+
| ID                                   | Name             | Disk Format | Container Format | Size       | Status |
+--------------------------------------+------------------+-------------+------------------+------------+--------+
| d6bd60e9-be04-4610-8cad-c3644182fa69 | RHEL7.1          | qcow2       | bare             | 425956864  | active |
| cdcc6a27-c88f-4032-87a9-1370ea89d0ff | RHEL7_Docker     | qcow2       | bare             | 1449000960 | active |
+--------------------------------------+------------------+-------------+------------------+------------+--------+

VMインスタンスの起動

先ほど保存したスナップショットからインスタンスを起動して、UserDataで、下記のスクリプトを流します。フレーバーは事前に用意したm1.dockerを使用してください。/etc/sysconfig/dockerと/etc/hostsの設定は、プライベートレジストリー(192.168.1.101)を参照するためのものです。

#!/bin/bash -x

cat <<'EOF' >>/etc/sysconfig/docker
INSECURE_REGISTRY='--insecure-registry registry01:5000'
EOF
cat <<'EOF' >>/etc/hosts
192.168.1.101 registry01
EOF

umount /mnt
sed -i 's/^\/dev\/vdb/#\/dev\/vdb/' /etc/fstab
cat <<'EOF' >/etc/sysconfig/docker-storage-setup
VG=vg_pool
DATA_SIZE=18G
EOF
systemctl stop --no-block docker.service
rm -rf /var/lib/docker/*
pvcreate -f /dev/vdb
vgcreate vg_pool /dev/vdb
docker-storage-setup

systemctl start --no-block docker.service

この後、インスタンスにログインすれば、普通にdockerコマンドが使えます。

# docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: vg_pool-docker--pool
 Pool Blocksize: 524.3 kB
 Backing Filesystem: xfs
 Data file: 
 Metadata file: 
 Data Space Used: 20.45 MB
 Data Space Total: 19.33 GB
 Data Space Available: 19.31 GB
 Metadata Space Used: 49.15 kB
 Metadata Space Total: 25.17 MB
 Metadata Space Available: 25.12 MB
 Udev Sync Supported: true
 Deferred Removal Enabled: true
 Library Version: 1.02.93-RHEL7 (2015-01-28)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.10.0-229.14.1.el7.x86_64
Operating System: Employee SKU
CPUs: 1
Total Memory: 993.3 MiB
Name: docker02.novalocal
ID: LT2Y:LJKF:JZRM:C3RH:U4BK:K6IK:3AMS:BESA:DAFO:NMDJ:FCED:HI6Z

UserDataからコンテナを起動する方法

これには、実は少しトリックが必要です・・・・。

UserDataを実行するcloud-init.serviceは、systemdのサービスと実行しているため、この中で発行した "systemctl start --no-block docker.service" は、UserDataの実行が完了するまで実際の実行が行われません。つまり、UserDataの中で、docker.serviceの起動完了を待って、"docker run"を実行するという処理ができないのです。

ここでは、「docker.serviceの起動完了を待って、"docker run"を実行する」というスクリプトをその場で作って、バックグラウンドで実行しておくという作戦を取ります。具体的には、次のようなUserDataになります。

#!/bin/bash -x

# Settings for the private registry
cat <<'EOF' >>/etc/sysconfig/docker
INSECURE_REGISTRY='--insecure-registry registry01:5000'
EOF
cat <<'EOF' >>/etc/hosts
192.168.1.101 registry01
EOF

# Setting up the local storage
umount /mnt
sed -i 's/^\/dev\/vdb/#\/dev\/vdb/' /etc/fstab
cat <<'EOF' >/etc/sysconfig/docker-storage-setup
VG=vg_pool
DATA_SIZE=18G
EOF
rm -rf /var/lib/docker/*
pvcreate -f /dev/vdb
vgcreate vg_pool /dev/vdb
docker-storage-setup

# Starting the docker service and a container
systemctl --no-block start docker.service
cat <<'EOF' >/tmp/run_container$$.sh
#!/bin/bash
while [[ true ]]; do
  sleep 5
  systemctl is-active docker.service && break
done
docker run -itd -p 8000:80 --name dengonban01 registry01:5000/enakai00/rails:ver1.0
EOF
chmod u+x /tmp/run_container$$.sh
/tmp/run_container$$.sh 2>&1 | logger -t run_container$$ &

うーん。もうちょっとすっきりできないですかね。