「プログラマのためのDocker教科書」の感想・備忘録1

スポンサーリンク

書籍「プログラマのためのDocker教科書」のまとめ。

点数

73

感想

基礎から書かれているが、説明がわかりづらい。
ただし、基本的なコマンドは参考になった。

主な内容

Dockerイメージ

OSやネットワーク設定、ミドルウェアをまとめたもので、コンテナの雛形になる。Dockerfileという設定ファイルからイメージを作ることができる。

Dockerイメージは積み重ねて使うことができる。例えば、OS用のイメージにWebアプリケーションサーバ用のイメージを重ねて、別の新しいイメージを作成できる。

Dockerでは1つのイメージには1つのアプリケーションのみを入れておき、複数のコンテナを組み合わせてサービスを構築するという手法が推奨されている。

Dockerイメージの正体は、ファイル群が格納されたディレクトリである。Dockerコマンドでtarファイルに出力することができる。

コンテナ

DockerはLinux上でコンテナ単位でサーバ機能を動かす。
このコンテナのもとになるのがDockerイメージである。
他の仮想化技術でサーバ機能を起動するためには、OSを起動させるところから始まるため時間がかかるが、Dockerの場合はすでに動いているOS上でプロセスを実行するのとほぼ同じ速さで高速に起動することができる。

Dockerは1つのLinuxカーネルを複数のコンテナで共有している。コンテナ毎にファイルシステムやネットワークなどを割り当てる。コンテナが異なればプロセスやファイルへのアクセスはできない。これらを実現するためにLinuxカーネル機能の技術が使われている。

ネットワーク構成

LinuxにDockerをインストールすると、物理NICがdocker0という仮想ブリッジネットワークに接続される。
コンテナを起動すると、コンテナのeth0に172.17.0.0/16のサブネットマスクを持つプライベートIPアドレスが自動的に割り当てられる。
さらにホストOSに仮想NIC(vethxxx)が作成される。コンテナ側からはvethxxxがeth0として見える。

コンテナ起動時に、コンテナ内で使用するポートがdocker0にポートフォワード設定される。例えば、ホストOSのポート8080番をコンテナのポート80番に転送設定することで、外部ネットワークからホストOSの8080番にアクセスすると、コンテナの80番につながる。

Hello world

docker container run ubuntu /bin/echo 'Hello world'

docker container run [オプション] イメージ名[:タグ名] [引数]
コンテナの生成&起動まで行う。

Webサーバを構築してみよう

いきなりdocker container runではなく、手動でダウンロードしてみる。

  1. イメージのダウンロード
    docker pull nginx
  2. イメージの確認
    docker image ls
  3. コンテナ生成&起動
    docker container run --name webserver -d -p 80:80 nginx
    d:バックグラウンド
    -p ホストのポート:コンテナのポート
  4. http://localhostで確認できる。
  5. コンテナの状態確認
    docker container ps
  6. コンテナの詳細確認
    docker container stats webserver
  7. コンテナの停止
    docker stop webserver
  8. コンテナの起動
    docker start webserver

Docker Hub

たくさんのイメージが公開されている。
https://hub.docker.com/

Tagsタブにタグ情報が記載されている。
イメージダウンロード時にタグ名=latestを指定すると最新版になる。
タグ名を省略した場合、latestを指定した事になる。
本番環境でdockerを利用するときは、タグ名を指定したイメージを使用するべき。

docker imageコマンド

イメージのダウンロード

docker image pull [オプション] イメージ名[:タグ名]
例)docker image pull centos:7

イメージの一覧表示

docker image ls [オプション]
-aオプションを指定すると中間イメージも表示される。

Dockerはイメージを生成する際、自動で中間イメージを生成する。
中間イメージは、他のイメージをビルドする際に内部的に再利用される。
これによって、生成が高速化する。
中間イメージが再利用されているときは、ビルドログにUsing cacheと表示される。

イメージの詳細確認

docker image inspect イメージ名:タグ名]

イメージに別名を付ける

docker image tag 元イメージ名[:元タグ名] イメージ名[:タグ名]

イメージの検索

docker search [オプション] 検索ワード
例)docker search nginx

Docker Hubに公開されているイメージを検索できる。
公式のイメージは[OFFICIAL]が[OK]になる。
安全のため、公式イメージだけ使うべき。

イメージの削除

docker image rm [オプション] IDまたはイメージ名
例)docker image rm nginx

docker containerコマンド

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

イメージ→docker container create→コンテナ生成済み→docker container start→コンテナ稼働中→docker container stop→コンテナ停止済み→docker container start→コンテナ稼働中

※コンテナ生成&起動
イメージ→docker container run→コンテナ稼働中

コンテナ生成

docker container create --name 名前 イメージ名

コンテナ生成&起動

docker container run [オプション] イメージ名 [コマンド]

オプション

-d:バックグラウンドで実行
-i:標準入力を開く
-t:端末デバイスを使う
–name:コンテナ名
-c=:CPU時間(デフォルトは1024)
-m=:メモリ制限(単位はk,m,gなど)
–env=:環境変数

例)
docker container run -it --name "test1" centos --env foo=bar /bin/cal
docker container run -it --name "test2" -c=512 -m=1g centos /bin/bash

–hostname,-h:ホスト名
–dns=DNSのIP
-p[ホストのポート]:[コンテナのポート]
例)docker container run -d -p 8080:80 nginx
–net=:ユーザー定義ネットワーク名
※デフォルトではホストOSとブリッジ接続する。
docker network create -d bridge webap-net
のように作成したネットワークを、–netオプションで指定できる。
すると、コンテナ同士がコンテナ名やIPで通信できる。
例)docker container run -d -p 8080:80 nginx

稼働中コンテナ一覧表示

docker container ls
停止中コンテナも表示する場合は-a

稼働中コンテナ状態確認

docker container stats [IDまたはコンテナ名]
停止中コンテナも表示する場合は-a

コンテナ起動

docker container start IDまたはコンテナ名

コンテナ停止

docker container stop IDまたはコンテナ名

コンテナ削除

docker container rm IDまたはコンテナ名
停止してるコンテナのみ削除可能

コンテナ中断/再開

docker container pause/unpause IDまたはコンテナ名

コメント