Skip to content
joniyjoniy edited this page Nov 17, 2016 · 4 revisions

Docker入門

手軽に使えることで人気の仮想コンテナツールDockerの入門講座です.

Dockerとは

Dockerがなぜ生まれたのか

  • Docker社(旧DotCloud社)が開発
  • dotCloudというPaaSを提供していた
  • 自分が開発したアプリケーションをクラウドに アップロードして,クラウド上で実行できるというもの
  • PaaSでは実行フレームワークや各種ライブラリを クラウド側で用意されている
  • しかし,自分が使いたいライブラリがクラウド上に用意されていなかったりする
  • そこで,利用者が独自のPaaS環境を自由に構築できるように dotCloudのコアコンポーネント(コア技術みたいなもの) を公開した

Dockerの役割

  • アプリケーションイメージの作成と実行
  • アプリケーションの実行に必要なファイルを全て含んだアプリケーションイメージを作成する
  • 実際にアプリケーションを実行する実行基盤
  • 一般的なPaaSでは実行環境はクラウド側で用意するので,開発者はクラウド環境に合わせる必要がある
  • しかしDockerならアプリケーションのコードだけでなく 実行に必要なすべてのファイルを含んだ「アプリケーションイメージ」 を作成できる
  • これをDockerイメージという

Dockerのすごいところ

  • 実行環境とアプリケーションを管理できる
    • 手元の環境では動くのにサービス環境では動かないという問題が無くなる
    • インフラエンジニアとアプリケーション開発者のやりとりが楽に
    • チーム開発でも楽!

Dockerのインストール

インストール

  • Dockerをインストールするためのシェルスクリプトが公開されているので,それを利用する.
  • Ubuntuだけかもしれない.
  • インストール後,dockerを実行するユーザをdockerグループに追加する.
  • dockerのデーモンを起動する.
  • dockerデーモンの状態を確認する.

以下のコマンドを実行

wget -qO- https://get.docker.com/ | sh
sudo usermod -aG docker vagrant
sudo start docker
sudo status docker

コンテナの起動

  • dockerデーモンの起動を確認後,ubuntu:14.04のコンテナイメージを使ったコンテナを起動する.
    • docker run {オプション} {--name 新しいコンテナ名} {利用するコンテナ名} {実行する処理}という順に記述する.
    • --nameは指定しなくとも良いが,よく分からない名前が勝手に生成されてわからなくなるので,できるだけつけたほうが良い.
  • [host]がdockerを起動するホストOS側で実行するコマンド,
    [docker]がdocker側で実行するコマンドである.
  • dockerを起動後パッケージのupgradeを行い,apache2をインストールする.
  • インストール後,Ctrl-p Ctrl-qを実行.
  • Ctrl-p Ctrl-qを実行することでプロセスを停止せずに,コンテナから出ることができる.
  • exitでコンテナから抜けると,実行しているbashプロセスが終了する.
  • 実行しているプロセスが終了するとコンテナは自動で停止してしまう.
  • docker stop {コンテナ名}で指定したコンテナを停止する.

以下のコマンドを実行

[host]
docker run -it --name ubuntu01 ubuntu:14.04 /bin/bash
[docker]
apt-get update && apt-get upgrade -y
apt-get install apache2
Ctrp-p Ctrl-q
[host]
docker stop ubuntu01

コンテナのライフサイクル

  • docker run でコンテナ生成&コンテナ起動
  • docker stop でコンテナ停止
  • docker start でコンテナ起動
  • docker attach で起動しているコンテナに接続
  • docker rm でコンテナ削除

lifecycle

Dockerにおけるコンテナのライフサイクルより引用

dockerでApacheを起動してみよう

ポートフォワードの設定

  • コンテナ内のApacheへポートフォワードするためVagrantfileを編集する
  • このままで,vagrantの80番ポートをコンテナの80番ポートに転送してもいいが,
    ちょっとわかりづらいので,ホストOSの10100番をvagrantの8000番に転送して,
    vagrantの8000番をコンテナの80番に転送するようにする.
    ホスト:10100 -> VM(vagrant):8000 -> コンテナ:80 という感じ.
  • ここでは,ホスト:10100 -> VM(vagrant):8000 部を設定する.

Vagrantfileの以下の部分を修正

# config.vm.network :forwarded_port, guest: 80, host: 10100
config.vm.network :forwarded_port, guest: 8000, host: 10100

dockerのコンテナイメージ保存

  • [host]がdockerを起動するホストOS側で実行するコマンド,
    [docker]がdocker側で実行するコマンドである.
  • docker commit {コンテナ名} {保存後のコンテナ名}で指定したコンテナを別名で複製して,コンテナイメージとして保存することができる.
  • docker rm {コンテナ名}で指定したコンテナを削除できる.
    • 停止中の場合のみ削除できる?
    • コンテナイメージを削除する場合は docker rmi {コンテナイメージ名}
  • docker imagesで存在するコンテナイメージ一覧を表示する.
    • docker images {コンテナイメージ名}で指定したコンテナイメージのみ表示.

以下のコマンドを実行

[host]
docker commit ubuntu01 vagrant/apache2:ver1.0
docker rm ubuntu01
docker images vagrant/apache2

ポートフォワードを使うコンテナ起動

  • docker runコマンドでコンテナを起動する.
    • -pオプションでポートフォワードの設定を行う.
    • -p {ホストポート}:{コンテナポート}というように指定.
  • Apacheで表示したいページ/var/www/html/index.htmlに文字列を書き込む.
  • serviceコマンドでapache2を起動.
  • Ctrl-p Ctrl-qを実行することでプロセスを停止せずに,コンテナから出ることができる.

以下のコマンドを実行

[host]
docker run -it -p 8000:80 --name web01 vagrant/apache2:ver1.0 /bin/bash
[docker]
echo 'Hello, Docker' > /var/www/html/index.html
service apache2 start
Ctrl-p Ctrl-q でホストOSに戻る

Webページの確認

  • ブラウザで 133.92.147.245:10100にアクセス
  • 書き込んだ内容が表示されていることを確認
  • もしくは,vagrant上でcurl実行
curl http://192.168.11.100:8000

アクセスログの確認

  • docker diffコマンドでコンテナ内で変更のあったディレクトリ・ファイルを確認できる.
  • docker cpコマンドでコンテナ内の指定したディレクトリ・ファイルをホスト側にコピーできる.
    • docker cp {コンテナ名}:{パス} {保存する名前}
  • コピーしたaccess.logを確認.

以下のコマンドを実行

[host]
docker diff web01
docker cp web01:/var/log/apache2 tmp
cat tmp/access.log

Dockerhub

https://hub.docker.com/

  • 作成したコンテナイメージを共有できるサイト
  • Docker版Githubのようなもの.

コンテナイメージの自動生成

  • ここまで手動でコンテナイメージを作成した.
  • Dockerfileを定義することで自動で生成することができる.
  • Dockerfileの詳細な説明はDockerfileについてに記載する.

Dockerfileの作成

docker ディレクトリを作成して移動

[host]
mkdir docker
cd docker
  • 以下の内容を記述したDockerfileを作成する.
  • user-00の部分は自分のユーザ名に変更する.
  • dockerでApacheを起動してみようで行ったapacheの操作と同じ処理.(なぜかリンク飛んでくれない)

Dockerfile

FROM ubuntu:14.04
MAINTAINER user-00

RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y apache2
ADD index.html /var/www/html/index.html
CMD service apache2 start & bash

/var/www/html/index.htmlに設置するファイルindex.htmlを作成する

echo 'Hello, Docker' > ~/docker/index.html

Dockerfileを使ったコンテナイメージの生成

作成したDockerfileを利用してコンテナイメージを生成する.

docker build -t vagrant/apache2:ver1.1 ~/docker
  • 以下に実行例を示す.
$ docker build -t vagrant/apache2:ver1.1 ~/docker
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM ubuntu:14.04
 ---> 1e0c3dd64ccd
Step 2 : MAINTAINER user-00
 ---> Running in ba8a155480cb
 ---> a158d53ae084
Removing intermediate container ba8a155480cb
Step 3 : RUN apt-get update
 ---> Running in 6391ea0e3e56
Ign http://archive.ubuntu.com trusty InRelease
Get:1 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB]
Get:2 http://archive.ubuntu.com trusty-security InRelease [65.9 kB]
...(中略)
Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...
Processing triggers for ureadahead (0.100.0-16) ...
 ---> 7cbc5a8e9d22
Removing intermediate container b500a124f44b
Step 6 : ADD index.html /var/www/html/index.html
 ---> 7b86e8473254
Removing intermediate container 95c1534eb995
Step 7 : CMD service apache2 start & bash
 ---> Running in a9132e596272
 ---> a92267bde908
Removing intermediate container a9132e596272
Successfully built a92267bde908
  • Step1 ~ Step7の7つのステップが実行されていることがわかる.

  • 各ステップの完了後にはステップを実行したコンテナイメージを保存し,中間コンテナを破棄する.

  • 次のステップでは,保存したコンテナイメージを起動して,ステップを実行 -> コンテナイメージ保存 -> コンテナ破棄 といった流れになる.

  • Step3に当たる部分だけを編集して再度buildした場合はStep2完了時点のコンテナイメージを利用して,以降の処理を行う.

  • 中間イメージを利用しない場合は, --no-cacheオプションを指定する.

  • なるべくDockerfileを配置するディレクトリには,コンテナイメージに関係無いファイルは置かないようにする.

  • build実行後 Sending build context to Docker daemon 3.072 kB と出力されているが,ここで指定したディレクトリ内のすべてのファイルを転送するためである.

  • コンテナイメージに不要だが,同じディレクトリ配置する必要のあるファイルがある場合は,.dockerignoreファイルに記載しておくことで,転送対象から除外できる.

コンテナの起動

生成したコンテナイメージを利用してコンテナを起動する.

docker run -itd -p 8000:80 --name web02 vagrant/apache2:ver1.1
  • -dオプションをつけることでバックグラウンドでdockerを起動する.
  • 起動していることはdocker psコマンドで確認できる.実行例を示す.
docker ps -l
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                  NAMES
66438f3c522e        vagrant/apache2:ver1.1   "/bin/sh -c 'service "   2 minutes ago       Up 2 minutes        0.0.0.0:8000->80/tcp   web02
  • -lオプションで直近のプロセスのみ確認できる.-aオプションをつけると,停止しているコンテナの情報も確認できる.

  • コンテナ内のプロセスはdocker topコマンドで確認することができる.

  • 実行例を以下に示す.

docker top web02
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4978                4969                0                   02:28               pts/2               00:00:00            /bin/sh -c service apache2 start & bash
root                5004                4978                0                   02:28               pts/2               00:00:00            bash
root                5044                4978                0                   02:28               ?                   00:00:00            /usr/sbin/apache2 -k start
www-data            5047                5044                0                   02:28               ?                   00:00:00            /usr/sbin/apache2 -k start
www-data            5048                5044                0                   02:28               ?                   00:00:00            /usr/sbin/apache2 -k start

実行結果の確認

  • curlコマンドで,htmlファイルの内容を確認する.
curl http://192.168.11.100:8000
  • ブラウザから確認する場合は,133.92.147.245:10100等にアクセスする.

公開イメージの利用

  • Dockerhubで公開されているコンテナイメージを利用することで簡単にアプリケーションを実行することができる.

以下のコマンドを実行

mkdir ~/nyan
cd ~/nyan
docker run -it --rm supertest2014/nyan
  • Ctrl-cで動作を停止する.
  • --rmオプションを指定するとコンテナが停止するとそのまま,コンテナを破棄する.

Dockerfileとシェルスクリプトの連携

コンテナ間の連携

Kubernetesによるオーケストレーション

Docker専用ホストLinux環境 Atomic Host

Webサーバの負荷分散構成例

参考資料

Clone this wiki locally