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

Docker Remote API を使ってみる

これがやりたいがためにローカル環境に Docker を構築したといってもいい。ここを突破したら、API 使って Web フロントエンドの開発をするつもり。

ググったらまた使い方出てきた。

とりあえず、Remote API を使える状態にして、curl からレスポンスを確認するところまでやってみる。

Remote API の有効化

/etc/init/docker.conf を編集する。設定ファイルのように見えて内容はスクリプト。中ごろに DOCKER_OPTS= となっている行があるのでここを編集する。

$ sudo vi /etc/init/docker.conf
script
        # modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
        DOCKER=/usr/bin/$UPSTART_JOB
#       DOCKER_OPTS=
        DOCKER_OPTS=' -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock'
        if [ -f /etc/default/$UPSTART_JOB ]; then
                . /etc/default/$UPSTART_JOB
        fi
        exec "$DOCKER" -d $DOCKER_OPTS
end script

設定を終えたら、Docker サービスを再起動。

$ sudo service docker restart
docker stop/waiting
docker start/running, process 15741

Remote API の動作確認

Curl を使って、API の動作確認をする。Ubuntu にはデフォルトで Curl が入っていないので、インストールしてから確認する。

$ sudo apt-get install curl
...
$ curl http://localhost:2376/images/json
[{"Created":1422470699,"Id":"f90095a67f5b0d8d22c3195e75b4d5b93eb894479d93f714512747fb15098bf9","ParentId":"739aef46f6f646ceca836a93b5166235cd32fb915aa8dbb7db86f703a990d8df","RepoTags":["httpd:latest"],"Size":0,"VirtualSize":159369766}
]

無事に動いた。今回リクエストしたエンドポイントは、イメージの一覧を確認するものなので、Docker イメージを準備していない場合は docker pull を使用して、事前に 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
$ docker --version
Docker version 1.5.0, build a8a31ef

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/