CentOS Atomic HostでDockerを触ってみたので参考資料や作業メモなど

CentOS Atomic Hostですが、今まで触った事無かったので、少し触ってみたので関連の情報と合わせてメモしていきます。

はじめに

今の最新バージョンとコンポーネントはこちらのようです。 New CentOS Atomic Host Images Available for Download – Seven.CentOS.org 記載の通り、AMIなんかでも提供されていますが、手元のVirtual BoxとVagrantで動かしていこうと思います。

もし既に前のバージョンのCentOS Atomic Hostを使っていた場合は、以下のコマンドでアップデートできます。

$ sudo atomic host upgrade

コマンドを実行すると必要な個別パッケージのダウンロードが始まります。完了後に再起動を促すメッセージが表示されるので、再起動をすることで最新のバージョンのCentOS Atomic Hostにアップデートされます。もともと小さいOSなので、UPGRADEの時間はそんなにかからなかったです。  
Docker専用OSであるCentOS Atomic HostはDockerコンテナを動かすことへの最適化のとして、運用簡素化やセキュリティを追求するために基本的ににRead onlyのOSです。個々のパッケージインストールも無いので(yumも入っていない)、システムパッケージ全体の一括のアップデートになります。

こちらも参考までに。

yomon.hatenablog.com

 
 

Virtual BoxでSSHログオンまで

現在、手元にdocker環境が無い方もVirtual BoxとVagrantで簡単に作成できます。ここでは書かないのですが、画面付きで丁寧に説明してくれているサイトがあるので、そちらを参考にしてみてください。 www.webcyou.com  
インストールなどはそちらのサイトを参考にしていただくとして、CentOS Atomic Hostを触るのも本当に簡単です。  
まず、設定ファイルであるVagrantFileに以下の設定をして、CentOS Atomic Host先ほどダウンロードしたBoxを指定します。ここで指定しているAtlasのCentOS Atomic Hostのイメージはこちらのものです。 https://atlas.hashicorp.com/centos/boxes/atomic-host  

config.vm.box = 'centos/atomic-host'

 
 
後は起動して、SSH接続します。初回の起動の際にマシンイメージをダウンロードするので少し時間がかかります。触るまでならこれだけで終わりです。

$ vagrant up
$ vagrant ssh

 
 
もし、マシンイメージを事前にダウンロードしたい場合は以下のコマンドを実行します。

$ vagrant box add centos/atomic-host

 
 
上記で何も意識しないと最新版のイメージがダウンロードされてきますが、古いモノを使いたい場合はVagrantFileに以下のように必要なバージョン記述してあげます。

config.vm.box_version = 'x.y.z'

 
 
ダウンロード時間合わせても、ここまでで20分程度あればいけると思います。  
 

環境確認

環境できたので早速ログオンして中身を見ていきます。  

Dockerのバージョン

手元のCentOS7だとDockerの1.10がインストールできるのですが、現時点のCentOS Atomic Hostだとまだ1.8.2です。

$ docker version
Client:
 Version:      1.8.2-el7.centos
 API version:  1.20
 Package Version: docker-1.8.2-10.el7.centos.x86_64
 Go version:   go1.4.2
 Git commit:   a01dc02/1.8.2
 Built:
 OS/Arch:      linux/amd64

Server:
 Version:      1.8.2-el7.centos
 API version:  1.20
 Package Version:
 Go version:   go1.4.2
 Git commit:   a01dc02/1.8.2
 Built:
 OS/Arch:      linux/amd64

 
 
こちらが関連の深いコンポーネントのバージョンです。

kernel-3.10.0-327.10.1.el7.x86_64
cloud-init-0.7.5-10.el7.centos.1.x86_64
atomic-1.6-6.gitca1e384.el7.x86_64
kubernetes-1.2.0-0.6.alpha1.git8632732.el7.x86_64
etcd-2.2.2-5.el7.x86_64
ostree-2016.1-2.atomic.el7.x86_64
docker-1.8.2-10.el7.centos.x86_64
flannel-0.5.3-9.el7.x86_64

 
 

ネットワーク関連

 
次にネットワーク情報見てみます。

$ nmcli d
DEVICE   TYPE      STATE      CONNECTION
docker0  bridge    connected  docker0
enp0s3   ethernet  connected  Wired connection 1
enp0s8   ethernet  unmanaged  --
lo       loopback  unmanaged  --
$ nmcli --fields ipv4.addresses connection show docker0
ipv4.addresses:                         172.17.42.1/16

 
docker0というデバイスが見えていますが、まさにこちらのスライドの絵の通りなので、見比べるとイメージがわきやすいと思います。

 
 

ディスク関連

 

ディスク関連情報確認

そしてディスク関連情報です。Device Mapperが使われています。  
dfを見る限りはdockerのデータが入っているディレクトリは見えません。

# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/atomicos-root  3.0G  998M  2.0G  34% /
devtmpfs                   478M     0  478M   0% /dev
tmpfs                      497M     0  497M   0% /dev/shm
tmpfs                      497M  6.5M  491M   2% /run
tmpfs                      497M     0  497M   0% /sys/fs/cgroup
/dev/sda1                  297M   88M  210M  30% /boot
tmpfs                      100M     0  100M   0% /run/user/1000

 
docker infoで見てみます。Device Mapperを使ってatomicos-docker-poolを使っていることが見て取れます。

# docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: atomicos-docker--pool
 Pool Blocksize: 524.3 kB
 Backing Filesystem: xfs
 Data file: 
 Metadata file: 
 Data Space Used: 61.87 MB
 Data Space Total: 2.902 GB
 Data Space Available: 2.841 GB
 Metadata Space Used: 40.96 kB
 Metadata Space Total: 12.58 MB
 Metadata Space Available: 12.54 MB
 Udev Sync Supported: true
 Deferred Removal Enabled: true
 Library Version: 1.02.107-RHEL7 (2015-12-01)

 
 
LVM上でのdocker-poolを見てみます。VGのatomicosからdfで見えたrootとdocker-poolを切り出しているのがわかります。

# pvs
  PV         VG       Fmt  Attr PSize PFree
  /dev/sda2  atomicos lvm2 a--  9.70g 4.05g
# vgs
  VG       #PV #LV #SN Attr   VSize VFree
  atomicos   1   2   0 wz--n- 9.70g 4.05g
# lvs
  LV          VG       Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  docker-pool atomicos twi-a-t--- 2.70g             2.13   0.33                            
  root        atomicos -wi-ao---- 2.93g           

 

ディスク領域拡張

docker-pool領域が2.7GBなので少し拡張してみます。LVM管理なので追加ディスクによる領域拡張も簡単にできます。  
新たに接続したこちらのデバイスを使って拡張してみます。

# fdisk -l /dev/sdb

Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

 
 
通常のLVMの手順と同じ手順で拡張してみます。VSizeとVFreeの項目が拡張されました。

# vgs
  VG       #PV #LV #SN Attr   VSize VFree
  atomicos   2   2   0 wz--n- 9.71g 4.06g
# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created
# vgextend atomicos /dev/sdb
  Volume group "atomicos" successfully extended
# vgs
  VG       #PV #LV #SN Attr   VSize  VFree
  atomicos   2   2   0 wz--n- 14.70g 9.04g

 
LVを拡張します。

# lvs /dev/atomicos/docker-pool 
  LV          VG       Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  docker-pool atomicos twi-a-t--- 2.70g             2.13   0.33                            

# lvextend -L+1GB /dev/atomicos/docker-pool 
  Size of logical volume atomicos/docker-pool_tdata changed from 2.70 GiB (692 extents) to 3.70 GiB (948 extents).
  Logical volume docker-pool successfully resized.

# lvs /dev/atomicos/docker-pool 
  LV          VG       Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  docker-pool atomicos twi-a-t--- 3.70g             1.56   0.33                            

# lvextend -l +100%FREE /dev/atomicos/docker-pool 
  Size of logical volume atomicos/docker-pool_tdata changed from 3.70 GiB (948 extents) to 11.75 GiB (3007 extents).
  Logical volume docker-pool successfully resized.

# lvs /dev/atomicos/docker-pool 
  LV          VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  docker-pool atomicos twi-a-t--- 11.75g             0.49   0.36                            

この時点でlsblkコマンド打ってみたりすると視覚的にわかりやすいかもしれません。

# lsblk                
NAME                            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                               8:0    0   10G  0 disk 
|-sda1                            8:1    0  300M  0 part /boot
`-sda2                            8:2    0  9.7G  0 part 
  |-atomicos-root               253:0    0    3G  0 lvm  /sysroot
  |-atomicos-docker--pool_tmeta 253:1    0   12M  0 lvm  
  | `-atomicos-docker--pool     253:3    0 12.8G  0 lvm  
  `-atomicos-docker--pool_tdata 253:2    0 12.8G  0 lvm  
    `-atomicos-docker--pool     253:3    0 12.8G  0 lvm  
sdb                               8:16   0    5G  0 disk 
`-atomicos-docker--pool_tdata   253:2    0 12.8G  0 lvm  
  `-atomicos-docker--pool       253:3    0 12.8G  0 lvm  
sdc                               8:32   0    1G  0 disk 
`-atomicos-docker--pool_tdata   253:2    0 12.8G  0 lvm  
  `-atomicos-docker--pool       253:3    0 12.8G  0 lvm  

Docker用のストレージ設定

CentOS Atomic Hostの場合は起動した時点で既にストレージ設定されているので、あまり意識しなくても使えるのですが、理解深めるためにストレージ設定を一から行ってみます。  
まずはDockerの既存の設定を削除します。この時点でコンテナやイメージが全て削除されるので、必要なデータがある場合はバックアップするか、そもそもこの作業やらないでください。  

# systemctl stop docker.service
# rm -rf /var/lib/docker/*

このディスクを使ってDockerのプールを作成します。

# fdisk -l /dev/sdd

Disk /dev/sdd: 6442 MB, 6442450944 bytes, 12582912 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

 
LVMでVolume Groupまで作成します。

# pvcreate /dev/sdd
  Physical volume "/dev/sdd" successfully created
# vgcreate my_vg_pool /dev/sdd
  Volume group "my_vg_pool" successfully created

 
設定ファイルでVolume Groupとサイズを指定します。

# vi /etc/sysconfig/docker-storage-setup  
VG=my_vg_pool
DATA_SIZE=5GB

 
後はdocker-storage-setupを実行してみます。メッセージ追っていくとVGからDocker用のLVが作成されていく様子がわかります。

# docker-storage-setup
  Rounding up size to full physical extent 8.00 MiB
  Logical volume "docker-poolmeta" created.
  Logical volume "docker-pool" created.
  WARNING: Converting logical volume my_vg_pool/docker-pool and my_vg_pool/docker-poolmeta to pool's data and metadata volumes.
  THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
  Converted my_vg_pool/docker-pool to thin pool.
  Logical volume "docker-pool" changed.

 
追加したディスクが起動しているdockerのストレージとして割り当てられました。

# lvdisplay /dev/my_vg_pool/docker-pool 
  --- Logical volume ---
  LV Name                docker-pool
  VG Name                my_vg_pool
  LV UUID                ECd6Gz-Lu9e-ddDg-MERt-E6fU-JitM-OxC6oE
  LV Write Access        read/write
  LV Creation host, time docker-test, 2016-03-20 03:25:52 +0000
  LV Pool metadata       docker-pool_tmeta
  LV Pool data           docker-pool_tdata
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Allocated pool data    0.00%
  Allocated metadata     0.44%
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:6
# systemctl start docker.service
# docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: my_vg_pool-docker--pool
 Pool Blocksize: 524.3 kB
 Backing Filesystem: xfs
 Data file: 
 Metadata file: 
 Data Space Used: 61.87 MB
 Data Space Total: 5.369 GB
 Data Space Available: 5.307 GB
 Metadata Space Used: 40.96 kB
 Metadata Space Total: 8.389 MB
 Metadata Space Available: 8.348 MB
 (省略)

 
 

コンテナでNginxを動かす

やっとDocker動かします。まずはHello Worldから。 https://hub.docker.com/_/hello-world/

$ sudo docker run hello-world

Hello from Docker.
This message shows that your installation appears to be working correctly.
...省略

イメージがダウンロードできているところも確認できました。

$ sudo docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/hello-world   latest              975b84d108f1        5 months ago        960 B

では、Nginxを動かします。80番ポートを8080として公開しながらのデプロイです。 https://hub.docker.com/_/nginx/

# docker run --name my-nginx -p 8080:80 -d nginx
# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
3b7aefbb5350        nginx               "nginx -g 'daemon off"   53 seconds ago      Up 51 seconds       443/tcp, 0.0.0.0:8080->80/tcp   my-nginx

CentOS Atomic Host上からもcurlでNginxのWelcomeページを確認できます。

$ curl http://localhost:8080

今回はもちろんVirtual Boxの外からもブラウザでNginxにアクセス可能です。

http://<atomichost_ipaddress>:8080

Dockerユーザの作成

今更ですが、ずっとrootで作業したくない場合は、ソケットファイルに権限を割り当てることで、root以外のユーザでもdockerコマンド操作できるようになります。

dockerユーザを作る手順と、他のユーザにdocker権限許可する手順です。

$ sudo useradd docker
$ sudo chown docker:docker /var/run/docker.sock
$ sudo usermod -aG docker $USER

片付け

検証環境でゴチャゴチャと作業していると、起動しているコンテナや、停止しているコンテナがあると思います。

# docker ps -a

とりあえず、全部削除したい場合は以下のコマンドでいけると思います。

# docker ps -a | awk 'NR > 1{ print $1}' | xargs docker stop | xargs docker rm

参考資料

 

マニュアル

https://docs.docker.com/engine/userguide/docs.docker.com  
 

Slideshare

 
個人的にはざっくり全体知りたい時には表現が端的な英語の方が好みだったりします。  

 
 
 
後は類似技術との比較も、ポイントが浮き彫りになってわかりやすいかと。  

 
 
 
私の場合はそもそもDockerを触り始めたところだったので、こちらもとても有用でした。  

書籍

まだ読み終えてないですが。理解にとても役立っています。