Dockerをvagrantに入れてwebサーバーを立ち上げるまで

dockerは話にはよく聞くけど全くわからなかったので、とりあえずインストールして動かすところまでやってみた。

Ubuntu

Dockerはlinux環境でのみ動作可能、ということで、Vagrantにlinux環境を作って、そこにdockerをインストールする。
さらに、dockerはUbuntuで開発されているとのことなので、同じくUbuntuにインストールしてやるのが一番無難っぽい。

VagrantBoxの作成

Ubuntu14の64bit版を使ってvagrantboxを作成する。
http://www.vagrantbox.es/
このページ内で、trustyで検索。
(Ubuntu14はtrustyと呼ばれているらしい)

その64bit版のURLをコピー。ちなみに以下のURL。

https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box

VagratBoxの追加

vagrantに追加する。

$ vagrant box add trusty64 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box

box addで先程コピーしたURLから追加する。
trusty64としたところはboxの名前なので任意でよい。

10分くらい待つと完了した。

初期化

導入したいディレクトリに移動して、初期化する。

$ vagrant init trusty64

先程指定したboxの名前を使用する。
ここでもしばらく待つと完了。
Vagrantfileというファイルが作成される。
特に編集する必要はないが、IPアドレスのみ変更した。

起動

で、起動。

$ vagrant up

sshで入ってみる。

1
2
3
4
$ vagrant ssh
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-53-generic x86_64)
...
vagrant@vagrant-ubuntu-trusty-64:~$

Doker

インストール

で、Dockerをインストール。
公式に沿って実行する。
https://docs.docker.com/installation/ubuntulinux/

まずは必要なパッケージをインストール。

1
2
3
$ sudo apt-get update
$ sudo apt-get install linux-image-generic-lts-trusty
$ sudo reboot

再起動後、dockerのインストール。
wgetがインストールされているかを確認。
インストールされていたので、そのまま進む。

$ which wget
/usr/bin/wget

で、dockerパッケージをダウンロードし、インストールする。

$ wget -qO- https://get.docker.com/ | sh

しばらく待つと完了。

$ docker --version
Docker version 1.6.2, build 7c8fca2

Docker image

pull

https://registry.hub.docker.com/
上記サイトから任意のimageを引っ張ってくる。
centosのイメージを入れてみる。
centosの検索結果

$ sudo docker pull centos

入っているimageのリストは以下で確認できる。

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              latest              fd44297e2ddb        6 weeks ago         215.7 MB

Container

で、落としてきたimageからcontainerを作成して、その上で簡単なコマンドを走らせてみる。

$ sudo docker run centos echo "hello world!"
hello world!

docker runで指定したimageからcontainerを作成。
その後に続くコマンドをそのcontainer上で実行している。

実行されたcontainerを確認スルには以下。
(-aのオプションを外すすと実行中のcontainerが表示される。)

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS                          PORTS               NAMES
0a84f937b7c        centos:latest       "echo 'hello world!'   About a minute ago   Exited (0) About a minute ago                       agitated_banach

Webサーバーの立ち上げ

dockerfile

dockerfileを作る。

$ vim Dockerfile

中身は簡単に以下のように。

1
2
3
4
5
6
7
FROM centos
MAINTAINER xxx

RUN yum install -y httpd
ADD ./index.html /var/www/html/
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

MAINTAINERは作成者の名前などを書いてやるのが習慣らしい。

index.htmlを適当に作成。

1
2
3
4
5
<html>
<body>
hello docker world!
</body>
</html>

build

で、ビルドする。
ビルドで、imageからdockerfile内のコマンドを使用してcontainerを作成し、さらにその結果を新しくimageに出力する、ところまでをやってくれるコマンドのよう。

$ sudo docker build -t test/httpd .

test/httpdはcontainerの名前。任意でよい。
最後の.は現在のディレクトリでビルド、ということ。

しばらく待って完了…と行きたいところだけど、どうやらエラーが出て止まってしまってるよう。

1
2
Complete!
INFO[0012] The command [/bin/sh -c yum install -y httpd] returned a non-zero code: 1

Complete!って出てるけど、その先のStepに進まない…。

エラー回避

ググってみると以下がヒット。
Dockerのcentosでapacheインストール失敗する。rpmがうんちゃらとか言われる

どうやらpullしてきたcentOSがあたらしすぎてダメだったよう。
なので、この記事どおりcentos6をpullして使う。

$ sudo docker pull centos:centos6
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              centos6             b9aeeaeb5e17        6 weeks ago         202.6 MB

で、Dockerfileの中身をcentos6を使うように修正。

1
2
3
4
5
6
7
FROM centos:centos6
MAINTAINER xxx

RUN yum install -y httpd
ADD ./index.html /var/www/html/
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

これで再度実行。

$ sudo docker build -t test/httpd .

ようやく無事、完了。

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
test/httpd          latest              74ea9508c04c        52 seconds ago      271.2 MB
centos              centos6             b9aeeaeb5e17        6 weeks ago         202.6 MB

run

ポートを指定してバックグラウンドで実行。

$ sudo docker run -p 8080:80 -d test/httpd

起動している。

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                  NAMES
4aca4268ffa3        test/httpd:latest   "/usr/sbin/httpd -D    15 seconds ago      Up 15 seconds       0.0.0.0:8080->80/tcp   compassionate_poincare

Vagrantfileで指定したIPアドレスに8080のポートをつけてやればアクセスが出来る。

http://192.168.33.30:8080/

アクセスすると、先程作成したindex.htmlが表示された。

なんだかんだで大変だったけどとりあえず起動できた。

参考

Docker入門 (全11回) – プログラミングならドットインストール
【社内勉強会】Docker入門してみました | LexTech

   このエントリーをはてなブックマークに追加