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も入っていない)、システムパッケージ全体の一括のアップデートになります。
Virtual BoxでSSHログオンまで
現在、手元にdocker環境が無い方もVirtual BoxとVagrantで簡単に作成できます。ここでは書かないのですが、画面付きで丁寧に説明してくれているサイトがあるので、そちらを参考にしてみてください。
www.webcyou.com
インストールなどはそちらのサイトを参考にしていただくとして、CentOS Atomic Hostを触るのも本当に簡単です。
まず、設定ファイルであるVagrantFileに以下の設定をして、CentOS Atomic Host先ほどダウンロードしたBoxを指定します。ここで指定しているAtlasのCentOS Atomic Hostのイメージはこちらのものです。
Vagrant box centos/atomic-host | Atlas by HashiCorp
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 someuser
片付け
検証環境でゴチャゴチャと作業していると、起動しているコンテナや、停止しているコンテナがあると思います。
# docker ps -a
とりあえず、全部削除したい場合は以下のコマンドでいけると思います。
# docker ps -a | awk 'NR > 1{ print $1}' | xargs docker stop | xargs docker rm
参考資料
マニュアル
Slideshare
個人的にはざっくり全体知りたい時には表現が端的な英語の方が好みだったりします。
後は類似技術との比較も、ポイントが浮き彫りになってわかりやすいかと。
私の場合はそもそもDockerを触り始めたところだったので、こちらもとても有用でした。
書籍
まだ読み終えてないですが。理解にとても役立っています。
Docker実践入門――Linuxコンテナ技術の基礎から応用まで
- 作者: 中井悦司
- 出版社/メーカー: 技術評論社
- 発売日: 2015/09/26
- メディア: Kindle版
- この商品を含むブログを見る