Docker を使ってみる
コマンドをググってみた。Qiita によさ気なのがあったので、参考に。
ポートフォワードや、ホスト・コンテナ間のディレクトリ共有ができるようなので、このへんおさえておけば大抵のことはできそう。実際に、適当なイメージを拾ってきて、起動・動作確認までをやってみる。
Docker イメージの検索
まずはイメージの検索から。docker search
で公開されている Docker イメージの検索ができる。
$ sudo docker search httpd NAME DESCRIPTION STARS OFFICIAL AUTOMATED httpd The Apache HTTP Server Project 25 [OK] centos/httpd 4 simpledrupalcloud/httpd 1 [OK] chbrun/httpd 0 [OK] blinkmobile/apache-httpd Starting with an Ubuntu base image, this p... 0 [OK] avalawn/docker-httpd 0 [OK]
OFFICIAL [OK]
になっているのが公式イメージ。とりあえずこれを使う。
Docker イメージの取得
docker pull
で検索したイメージを取得できる。
$ sudo docker pull httpd 511136ea3c5a: Pull complete 8771fbfe935c: Pull complete 0e30e84e9513: Pull complete b383ad0b6022: Pull complete 8ca194da6670: Pull complete 17d1cc0a6b8f: Pull complete f1244916b1c5: Pull complete cb1152147ebb: Pull complete bc0b697528ac: Pull complete b051ef63bcb4: Pull complete efca243ee409: Pull complete d9a38da3e22c: Pull complete 159cb4622828: Pull complete 739aef46f6f6: Pull complete f90095a67f5b: Pull complete httpd:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. Status: Downloaded newer image for httpd:latest
apt-get で取得した docker.io
パッケージの Docker 1.0.1 では、この pull できれいにイメージを取ってくることができず、途中でダウンロードが止まったり、REPOSITORY:TAG
が設定されていなかったりしていたが、lxc-docker
パッケージから入れた Docker 1.5.0 ではダウンロードも安定していて、REPOSITORY:TAG
も正しく設定された状態で取得できた。
取得した Docker イメージの確認
docker images
でローカルに保持している Docker イメージの一覧を確認できる。
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE httpd latest f90095a67f5b 5 weeks ago 159.4 MB
Docker 1.0.1 では、イメージをひとつしか pull していないのに、何故か複数のイメージが表示されていたりしたが、Docker 1.5.0 では一覧の内容も正しくなっていた。
Docker コンテナの起動
いよいよ起動。docker run
を使うがオプションがたくさんある。
$ sudo mkdir -p /var/opt/docker/httpd-1 $ sudo mkdir -p /var/opt/docker/httpd-2 $ sudo mkdir -p /var/opt/docker/httpd-3 $ sudo mkdir -p /var/opt/docker/httpd-4 $ sudo docker run -itd -p 80 -v /var/opt/docker/httpd-1:/usr/local/apache2/htdocs httpd:latest eb756ba23c2b1b69628b10903373853b1a7fe0ca0a1fbd0be115144c623ea188 $ sudo docker run -itd -p 80 -v /var/opt/docker/httpd-2:/usr/local/apache2/htdocs httpd:latest 22780937665c4ec75c776277d18167679cf3b578628baf769edc726429c0563e $ sudo docker run -itd -p 80 -v /var/opt/docker/httpd-3:/usr/local/apache2/htdocs httpd:latest 219c733f64e346442cce768fc965a783b6d471f892e7391cc79e0b937ce1358f $ sudo docker run -itd -p 80 -v /var/opt/docker/httpd-4:/usr/local/apache2/htdocs httpd:latest 1846f6acb7a5101f7b24680376836c69bf5a3a7abf98a8049387649c6e26aa74
この状態で4つの http サーバが起動している。-v
と -p
がキモ。
-v
では、ホスト・コンテナ間で共有するディレクトリを指定している。-v /var/opt/docker/httpd-4:/usr/local/apache2/htdocs
は、ホストの /var/opt/docker/httpd-4
ディレクトリを、コンテナの /usr/local/apache2/htdocs
ディレクトリに割り当てることを意味している。
-p
では、コンテナ内のどのポートをホストに公開するかを指定している。端的にいえば、ポートフォワーディングの設定をおこなっている。-p 80
は、ホストの任意のポートを通じて、コンテナの80番ポートを公開することを意味している。ホストのポートを指定する場合は、-p {host-port}:{container-port}
というかたちで指定する。公開されたポートを確認するには、docker ps
を使用する。
Docker コンテナの利用
ここまでの流れで、ホストの /var/opt/docker/httpd-4
をコンテンツディレクトリとして、http サーバが起動しているので、試しにファイルを設置して動きを確認してみる。公開されているポートの確認をしてブラウザでアクセス。
$ sudo vi /var/opt/docker/httpd-4/index.html ... $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1846f6acb7a5 httpd:latest "httpd-foreground" 4 seconds ago Up 4 seconds 0.0.0.0:49160->80/tcp backstabbing_einstein 219c733f64e3 httpd:latest "httpd-foreground" 19 minutes ago Up 19 minutes 0.0.0.0:49159->80/tcp admiring_babbage 22780937665c httpd:latest "httpd-foreground" 19 minutes ago Up 19 minutes 0.0.0.0:49158->80/tcp romantic_wozniak eb756ba23c2b httpd:latest "httpd-foreground" 19 minutes ago Up 19 minutes 0.0.0.0:49157->80/tcp silly_mccarthy
これでいくらでも環境を個別に立てられるようになった。停止したいときは、docker stop {container-id|container-name}
で。
念のため、今回の検証環境
$ uname -a Linux ubuntu 3.16.0-31-generic #41~14.04.1-Ubuntu SMP Wed Feb 11 19:30:13 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux $ docker --version Docker version 1.5.0, build a8a31ef
Ubuntu 14.04 へ Docker のインストール
Docker インストールの準備を済ませたら、いよいよインストール。まだの場合は先に準備。
Ubuntu 14.04 へ Docker のインストール準備 - 作業ノート
まずはパッケージ名を検索。
$ apt-cache search docker pidgin - graphical multi-protocol instant messaging client for X docker - System tray for KDE3/GNOME2 docklet applications docker.io - Linux container runtime karbon - vector graphics application for the Calligra Suite kdocker - lets you dock any application into the system tray vim-syntax-docker - Docker container engine - Vim highlighting syntax files
docker.io
が仮想コンテナの Docker。docker
の方は説明を読む限り、GUI で使うドックレットアプリケーションに使用されるもののよう。紛らわしい。vim のシンタックスと一緒にインストールする。
$ sudo apt-get install docker.io vim-syntax-docker $ source /etc/bash_completion.d/docker.io $ docker --version Docker version 1.0.1, build 990021a
古い…最新リリースが 2015-03-07 時点で 1.5.0 なので、結構前のやつ。しばらく使ってみたところ、色々と問題が出たので最新リリースのインストールをしてみる。
公式ドキュメントに従って。apt-transport-https
モジュールが必要そうなので、事前にインストールされているか確認しておく。入っていなければインストールする。
$ apt-cache policy apt-transport-https apt-transport-https: インストールされているバージョン: (なし) $ sudo apt-get install apt-transport-https $ apt-cache policy apt-transport-https apt-transport-https: インストールされているバージョン: 1.0.1ubuntu2.6
入った。引き続き、鍵の取得と apt リポジトリの追加。
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 $ sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list" $ sudo apt-get update $ sudo apt-cache search docker ... lxc-docker-1.2.0 - Linux container runtime lxc-docker-1.3.0 - Linux container runtime lxc-docker-1.3.1 - Linux container runtime lxc-docker-1.3.2 - Linux container runtime lxc-docker-1.3.3 - Linux container runtime lxc-docker-1.4.0 - Linux container runtime lxc-docker-1.4.1 - Linux container runtime lxc-docker-1.5.0 - Linux container runtime
lxc-docker パッケージが大量追加されたのでインストール。
$sudo apt-get install lxc-docker $ docker --version Docker version 1.5.0, build a8a31ef
Docker バージョンが最新化された。今回は apt-get remove docker.io
をせずにそのまま最新版を入れてみたが、とくに問題はないようだった。
念のため、今回の検証環境
$ uname -a Linux ubuntu 3.16.0-31-generic #41~14.04.1-Ubuntu SMP Wed Feb 11 19:30:13 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux $ docker --version Docker version 1.5.0, build a8a31ef
Ubuntu 14.04 へ Docker のインストール準備
最近、職場で Docker が熱い。ので、自宅でも立ててみる。
仕事を通じていろいろ調べさせてもらった結果、Docker は OS のカーネルに依存する部分が多く、そのバージョンとの相性が悪いと、いろいろ不具合が出るようだった。
CentOS 7 や、Ubuntu 14.10 で検証をした際にはとくに問題は出なかったのだが、それらより前のバージョンでは、何かしらの問題に遭遇した。なお、CentOS 6 系以前はもうお手上げなので取り上げない。
AWS でインスタンスを作成しようとしたところ、提供されている AMI に Ubuntu 14.10 はないもよう。Ubuntu 公式で提供している AMI は LTS である 14.04 だった。そこで、このバージョンでの構築が多いであろうことを見越して、こいつでセットアップを進める。
まずは uname -r
でカーネルバージョンの確認。
$ uname -r 3.13.0-24-generic
3.13 系以前のカーネルだと、Docker 側で不具合が出るようなので、事前にバージョンを上げておく。apt-get のリポジトリ更新を済ませていない場合は、事前に sudo apt-get update
を行っておく。
$ apt-cache search linux-image-3 ... linux-image-3.13.0-46-generic - Linux kernel image for version 3.13.0 on 64 bit x86 SMP linux-image-3.13.0-46-lowlatency - Linux kernel image for version 3.13.0 on 64 bit x86 SMP linux-image-3.16.0-25-generic - Linux kernel image for version 3.16.0 on 64 bit x86 SMP linux-image-3.16.0-25-lowlatency - Linux kernel image for version 3.16.0 on 64 bit x86 SMP linux-image-3.16.0-26-generic - Linux kernel image for version 3.16.0 on 64 bit x86 SMP linux-image-3.16.0-26-lowlatency - Linux kernel image for version 3.16.0 on 64 bit x86 SMP linux-image-3.16.0-28-generic - Linux kernel image for version 3.16.0 on 64 bit x86 SMP linux-image-3.16.0-28-lowlatency - Linux kernel image for version 3.16.0 on 64 bit x86 SMP linux-image-3.16.0-29-generic - Linux kernel image for version 3.16.0 on 64 bit x86 SMP linux-image-3.16.0-29-lowlatency - Linux kernel image for version 3.16.0 on 64 bit x86 SMP linux-image-3.16.0-30-generic - Linux kernel image for version 3.16.0 on 64 bit x86 SMP linux-image-3.16.0-30-lowlatency - Linux kernel image for version 3.16.0 on 64 bit x86 SMP linux-image-3.16.0-31-generic - Linux kernel image for version 3.16.0 on 64 bit x86 SMP linux-image-3.16.0-31-lowlatency - Linux kernel image for version 3.16.0 on 64 bit x86 SMP
一番新しいのを入れてしまおうと思う。
$ sudo apt-get install linux-image-3.16.0-31-generic $ uname -r 3.13.0-24-generic
まだ更新が反映されていないようなので、再起動する。
$ sudo reboot $ uname -r 3.16.0-31-generic
更新された。これで安心して Docker のインストールをはじめられる。なお、カーネルバージョンの更新は Docker セットアップのあとでも問題ない。
念のため、今回の検証環境
$ uname -a Linux ubuntu 3.16.0-31-generic #41~14.04.1-Ubuntu SMP Wed Feb 11 19:30:13 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
参考
Ubuntu 14.04 のキーボード設定
適当にインストールしたら日本語キーボードになっていなかったのでおぼえがき。
sudo dpkg-reconfigure keyboard-configuration
キーボードの設定ウィザードが始まるので、自分のマシンに応じた設定を選択して進めていく。
Ubuntu 14.04 を CUI で起動
AWS EC2 セットアップメモ ディスクマウント
社内向けの m3.xlarge のセットアップをすることがあったのでメモ。
まずはマウントディスクの状態から確認。
$ df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 /dev/xvda1 8377344 876560 7500784 11% / devtmpfs 7602628 0 7602628 0% /dev tmpfs 7487128 0 7487128 0% /dev/shm tmpfs 7487128 16668 7470460 1% /run tmpfs 7487128 0 7487128 0% /sys/fs/cgroup /dev/xvdb 38565344 49164 36534128 1% /mnt
デフォルトこんな感じだったので、まずはアンマウントから。
$ sudo umount /dev/xvdb $ df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 /dev/xvda1 8377344 876560 7500784 11% / devtmpfs 7602628 0 7602628 0% /dev tmpfs 7487128 0 7487128 0% /dev/shm tmpfs 7487128 16668 7470460 1% /run tmpfs 7487128 0 7487128 0% /sys/fs/cgroup
マウントはずれたので、マウント先のディレクトリ作成。
次いで、ディスクマウント。
$ sudo mkdir /mnt/flush1 $ sudo mkdir /mnt/flush2 $ sudo mount /dev/xvdb /mnt/flush1 -t auto $ sudo mount /dev/xvdb /mnt/flush2 -t auto $ df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 /dev/xvda1 8377344 876560 7500784 11% / devtmpfs 7602628 0 7602628 0% /dev tmpfs 7487128 0 7487128 0% /dev/shm tmpfs 7487128 16668 7470460 1% /run tmpfs 7487128 0 7487128 0% /sys/fs/cgroup /dev/xvdb 38565344 49164 36534128 1% /mnt/flush1 /dev/xvdc 38565344 49164 36534128 1% /mnt/flush2
マシンの再起動後にもマウントが維持されるように fstab も編集。
$ sudo vi /etc/fstab # # /etc/fstab # Created by anaconda on Mon Sep 29 21:48:54 2014 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=0f790447-ebef-4ca0-b229-d0aa1985d57f / xfs defaults 1 1 /dev/xvdb /mnt/flush1 auto defaults,nofail,comment=cloudconfig 0 2 /dev/xvdc /mnt/flush2 auto defaults,nofail,comment=cloudconfig 0 2
リブートして確認。
$ sudo reboot $ df -B G ファイルシス 1G-ブロック 使用 使用可 使用% マウント位置 /dev/xvda1 8G 1G 8G 11% / devtmpfs 8G 0G 8G 0% /dev tmpfs 8G 0G 8G 0% /dev/shm tmpfs 8G 1G 8G 1% /run tmpfs 8G 0G 8G 0% /sys/fs/cgroup /dev/xvdb 37G 1G 35G 1% /mnt/flush1 /dev/xvdc 37G 1G 35G 1% /mnt/flush2
よさげ。