Dockerを使ってみる
モチベーション
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 SIZEDocker 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 auxbashしか起動していない(コンテナ内)ことがわかる.コンテナからは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.1⁄8 scope host lo valid_lft forever preferred_lft forever inet6 ::1⁄128 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.159⁄20 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.1⁄16 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::5484:7aff:fefe:9799⁄64 scope link valid_lft forever preferred_lft forever
Memo
OpenStack同様、Dockerもiptableをふんだんに使っている。参考:Dockerのネットワーク管理とnetnsの関係 - めもめも