技術ネタはQiitaに移りました。壁もどこぞに。

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

f:id:Yoichi-KIKUCHI:20150308181906p:plain

これでいくらでも環境を個別に立てられるようになった。停止したいときは、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

参考:https://docs.docker.com/installation/ubuntulinux/

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 へ ssh のインストール

CentOS だと sshd だったので、Ubuntu でも同様にググってしまっていて、ちょっと手こずったのでおぼえがき。Ubuntu だとサービス名は ssh になっているようだった。

apt-get のリポジトリ更新をしてから、openssh-server のインストールでおわり。

$ sudo apt-get update
$ sudo apt-get install openssh-server
$ service ssh status
ssh start/running, process 22624

参考:https://forums.ubuntulinux.jp/viewtopic.php?pid=53557

Ubuntu 14.04 のキーボード設定

適当にインストールしたら日本語キーボードになっていなかったのでおぼえがき。

sudo dpkg-reconfigure keyboard-configuration

キーボードの設定ウィザードが始まるので、自分のマシンに応じた設定を選択して進めていく。

参考:http://qiita.com/ktyubeshi/items/847b05b7879e2f45da54

Ubuntu 14.04 を CUI で起動

ググったらけっこう出てきたので、それに倣う。また、デフォルトで vim が入っていないようなので、vim をインストールしてから作業したほうがいいだろう。

sudo vi /etc/default/grub

内容を確認しつつ、以下のように変更。

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
 ↓
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash text"

参考:http://note.kurodigi.com/ubuntu1404-cuilaunch/

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

よさげ。