モチベーション

Dockerの基本的な使い方を学習したい

背景

個人で運用しているサーバを移行するにあたりコンテナ技術を使った運用に変更しようと思っている.コンテナ管理はLXCとDockerを候補に考えているがDockerの使い方がいまいちわかっていないので使ってみることにした.

環境

OS: Ubuntu14.04LTS

Dockerをインストールする

Ubuntu14.04へのインストール方法は公式ページを参照した.

$ sudo apt-get update
$ sudo apt-get install docker.io
$ source /etc/bash_completion.d/docker.io (dockerコマンドをタブ補完できるようにする)

Dockerイメージの取得

Dockerではコンテナを作るためにイメージと呼ばれるコンテナの素を利用する.(VMにおけるような位置づけ)イメージは自分で作ることもできるが,Docker Hubで提供されているものも自由に利用できる.今回は,Docker Hubで管理されているUbuntuの公式イメージを取得する.

はじめはイメージを持たないが,

sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
Docker HubからUbutuイメージを取得すると一覧に出てくる
$ sudo docker pull ubuntu
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              15.04               4dd534bebcd0        13 hours ago        117.2 MB
ubuntu              vivid               4dd534bebcd0        13 hours ago        117.2 MB
ubuntu              14.10               4108fa8e113b        13 hours ago        199.2 MB
ubuntu              utopic              4108fa8e113b        13 hours ago        199.2 MB
ubuntu              14.04.1             ed5a78b7b42b        13 hours ago        192.7 MB
ubuntu              14.04               ed5a78b7b42b        13 hours ago        192.7 MB
ubuntu              trusty              ed5a78b7b42b        13 hours ago        192.7 MB
ubuntu              precise

Docker hubで提供されているイメージはサイトで検索することもできるが,CUIからも検索できる。

$ docker search 検索する単語

また,trustedオプションを有効にすることでTrusted repositoryのみを対象に検索する事ができる。

$ docker search -trusted 検索する単語

コンテナの作成: docker run

docker run -it --name ubuntu01 ubuntu /bin/bash

コンテナを起動するとコンテナ内に入るので,起動プロセスを確認すると,

root@089f2d3705ff:/# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18156  1948 ?        Ss   15:39   0:00 /bin/bash
root        12  0.0  0.0  15568  1132 ?        R+   15:43   0:00 ps aux
bashしか起動していない(コンテナ内)ことがわかる.コンテナからはCtrl + dで抜けることができる.起動時にオプションを指定したが主なものは以下の通り.

  • –name: 作成するコンテナの名前を指定
  • -d(detach):バックグラウンドで実行する。デフォルトだとコンテナーをフォアグラウンドで実行するため、Webサーバーやアプリケーションサーバーなど常時実行するコンテナーで指定

  • -i:コンテナーの標準入力を開く。/bin/bashなどでコンテナーを操作する際に指定

  • -t:tty(端末デバイス)を確保する。/bin/bashなどでコンテナーを操作する際に指定

  • -p {ホストのポート番号}:{コンテナーのポート番号}:Dockerサーバーのホストとポートマッピングを構成

オプションの-itはほぼ必須かな.

コンテナ一覧の取得: docker ps & dokcer ps -a

作成したコンテナ一覧はdocker psコマンドで取得できる.今回作成したコンテナは既に停止しているので-aオプションをつけて確認する.

sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
089f2d3705ff        ubuntu:latest       /bin/bash           10 minutes ago      Exited (0) About a minute ago

コンテナの起動: docker start

停止したコンテナを使うにはdocker startを使う.

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
089f2d3705ff        ubuntu:latest       /bin/bash           16 minutes ago      Exited (0) 7 minutes ago                       ubuntu01
$ sudo docker start 089f
089f
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
089f2d3705ff        ubuntu:latest       /bin/bash           16 minutes ago      Up 8 seconds                            ubuntu01

docker startで起動できるコンテナは/bin/bashなどをdocker runで指定しておく必要がある.

コミット(イメージの作成): dokcer commit

sudo docker commit 089f2d takanabe/test
ebffed26a6f0b462f5806199c92813dd16e7ce98ad6e4748137654bea05f238d

このように,イメージのバージョン管理をすることができる.(tagをつけたりできる) 作成したイメージから新しいコンテナを作成することができる.また,Docker HubやDocker Registoryと組み合わせることで,Dockerがインストールされているホストに全く同じコンテナをデプロイすることができる. ## 起動しているコンテナに入る(Docker 1.3以上で可能)
docker exec -it nstest bash

Dockerのネットワーク周りの話

Dockerをインストールした後にNICを確認するとDocker用のNICが増えていた.j

ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.18 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1128 scope host
       valid_lft forever preferred_lft forever
2: eth0:  mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 06:09:72:64:53:b4 brd ff:ff:ff:ff:ff:ff
    inet 172.31.15.15920 brd 172.31.15.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::409:72ff:fe64:53b4/64 scope link
       valid_lft forever preferred_lft forever
3: docker0:  mtu 9001 qdisc noqueue state DOWN group default
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.116 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::5484:7aff:fefe:979964 scope link
       valid_lft forever preferred_lft forever

Memo

OpenStack同様、Dockerもiptableをふんだんに使っている。参考:Dockerのネットワーク管理とnetnsの関係 - めもめも

参考

入門記事

実戦参考

Dockerのネットワーク周りを解説している記事