事前準備
取り急ぎのメモ書き・・・。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$$ &
うーん。もうちょっとすっきりできないですかね。