Dockerを基本から復習してみる Part1

今回はDockerを改めて復習してみたのでその内容について説明します。

Docker内部についての知識

Dockerの内部には大きく分けて 「Docker Daemon」「Docker Client」というものが存在します。

Docker Clientの役割

コマンドの発行場所。Docker Daemonに指示をする
例えばターミナル上で

$ docker build -it testImage1 .

と入力して Enterを押すと コマンドの指示が Docker Daemonに渡されます。

Docker Daemonの役割

Docker Clientからの指示をREST APIで受け取る
他のDockerの機能に命令をする
上の例でいえば Docker Clientからの発行されたコマンドを受けて、カレントディレクトリ上にある Dockerfileを読み込んでそこから 「testImage1」という名前の DockerImageをローカル上に作成する という流れになります。(この点についてはのちほど、下の方で詳しく説明します)

Dockerのレジストリについて

DockerコンテナはDocker Imageというものをもとに起動しているのですが、このイメージの保管場所としてDocker レジストリなるものが存在します。
因みに
Docker Image とは OSやアプリケーションがひとまとめになっているもの
DockerレジストリはDocker Imageの倉庫みたいなもの
です。
Dockerレジストリの具体的なものとして 「Docker Hub」「Amazon ECR」などがあります。

Docker Hubとは

GitHubのDocker版みたいなものでオープンソースソフトウェアの公式イメージ(MySQL,Nginxなど)や個人が公開しているものなど様々なイメージを取得したり、自分個人の領域にイメージを保存することもできます。

実際にDocker Imageからコンテナを作成してみる

基本的な知識はこれくらいにしてそれでは具体的に コマンドを実行しながらイメージの作成やコンテナの立ち上げなどをやってみます。

1 Docker Hubから ubuntu 14.04イメージを取得する

docker pull ubuntu:14.04

2 ちゃんとイメージが取り込めたか確認してみる

$ docker images

うまく取り込めている場合は

ubuntu                              14.04                  13b66b487594   10 months ago   197MB

と表示されるはずです。

3 次に上で取り込んだイメージからコンテナを起動してみる

$ docker run -it ubuntu:14.04 /bin/bash
root@5f37611d749d:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

すると下記のようにコンテナの立ち上げ&コンテナ内でのコマンド実行が可能になります。

4 コンテナ内に curlコマンドをインストールして curlコマンドを実行してみるとレスポンスが返ってくるのが確認できる

root@5f37611d749d:/# apt-get install curl
root@5f37611d749d:/# curl https://www.google.com/

しかしこのままでは このコンテナを終了して再度 ubuntu:14.04 イメージからコンテナを起動すると curlコマンドは入っていない状態のため、curlコマンドを実行したい場合は再度curlコマンドをインストールしなければなりません。
そこで curlコマンドが入った ubuntuコンテナのイメージを保存してみます。

5 別ターミナルを立ち上げて 起動中のコンテナを確認してみます。

➜  ~ docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED              STATUS              PORTS     NAMES
3ca590db9363   ubuntu:14.04   "/bin/bash"   About a minute ago   Up About a minute             objective_jackson

上のように 現在起動しているコンテナID は 3ca590db9363 なのでこれをDocker Imageとして保存してみます。

6 Docker Imageが作成できたかどうか確認してみると作成できているのが確認できます。

➜  ~ docker commit 3ca590db9363  ubuntu_with_curl
sha256:8ad681f4d7c3361e0a532554aeec5742af55cac55da9cec02dbf5d4877c8762b
➜  ~ docker images
REPOSITORY                          TAG                    IMAGE ID       CREATED          SIZE
ubuntu_with_curl                    latest                 8ad681f4d7c3   19 seconds ago   200MB

7 上で作成したイメージをもとにコンテナを起動してみて、コンテナ内でcurlコマンドを実行してみると レスポンスが返ってくるのが確認できるため、最初からcurlコマンドをインストールしたコンテナを起動できるようになりました。

➜  ~ docker run -it ubuntu_with_curl /bin/bash
root@f3cc79c859df:/# curl https://www.google.com

次は Dockerfileから オリジナルの Docker Imageを作成してみる

CentOS+Nginx からなるコンテナをDockerfileから作成してみます。
ディレクトリ構造としては下記のようなものを作成します。

docker_test(作業用ディレクトリ)
| ------ Dockerfile  
| ------ index.html (トップページ表示のためのファイル)
| ------ nginx.repo (yumのリポジトリにnginxを追加するためのファイル)

Dockerfileとindex.htmlの中身は下記の通りです。(今回はあくまでDockerfileからDocker Imageを作成 → コンテナ立ち上げ の説明なのでいずれも中身はシンプルです。)
因みに Dockerfileの中で
RUN の後に書かれているコマンドは docker build(Dockerfileから Docker Imageの作成)の際に実行されるコマンド
CMD の後に書かれているコマンドは docker run (Docker Imageから Docker コンテナの起動)の際に実行されるコマンドになります。

Dockerfile

# CentOS7のイメージをDocker Hubから取り込む
FROM centos:7

# yumのリポジトリにnginxのパッケージを追加
ADD nginx.repo /etc/yum.repos.d/


# nginx & curl をインストール
RUN yum -y install nginx \
  curl

# カレントディレクトリ上の index.htmlファイルを /usr/share/nginx/html/ にコピーする
ADD index.html /usr/share/nginx/html/

# ポート設定
EXPOSE 80

# nginxは通常はdaemonで動くが、forgroundで動くようにする(こうしないとコンテナがすぐ停止してしまう)
CMD ["nginx","-g","daemon off;"] 

# /usr/share/nginx/html ディレクトリに移動
WORKDIR /usr/share/nginx/html/

index.html

<h1> Hello World From Nginx</h1>

nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

1 ターミナル上で 上で作成した docker_test ディレクトリに移動

➜  ~ cd ~/projects/docker_test

2 同じ階層にある Dockerfileから Docker Imageを作成する

➜  docker_test git:(master) ✗ docker build -t centos-with-nginx .

コマンドの解説としては -t の後の 「centos-with-nginx」が作成するイメージ名、 最後の .(ドット)は カレントディレクトリ上の Dockerfileから イメージを作成するという意味
イメージ作成完了まで少々時間がかかります。

3 centos-with-nginx イメージが作成できたのを確認

➜  docker_test git:(master) ✗ docker images
REPOSITORY                          TAG                    IMAGE ID       CREATED          SIZE
centos-with-nginx                   latest                 5943b626e31d   11 seconds ago   360MB

4 centos-with-nginx から nginxServer という名前でコンテナ を起動。因みにホストOSの8080番ポートとコンテナの80番ポートを同期している。http://localhost:8080 で接続可能

➜  docker_test git:(master) ✗ docker run --name nginxServer -d -p 8080:80 centos-with-nginx
6ba6ab6c5c3576658250ca3976381dcebcc1d0698a1cc66302b85c5878712497

接続も確認できました。

最後にDocker関連で個人的に便利だと思ったコマンドをまとめておきまーす。

Docker関連で便利なコマンドをまとめ

どのような流れで Docker Imageが作成されたか確認できる(xxxxxxにはイメージ名またはイメージIDを指定)

$ docker history xxxxxx

JSON形式でより詳細なDocker Imageの中身を確認できるxxxxxxにはイメージ名またはイメージIDを指定)

$ docker inspect xxxxxx

現在ローカル上にある Docker Imageの一覧を出せる

$ docker images -q

上のコマンドを利用することでローカル上のDocker Image全てを下記のコマンドで削除可能

$ docker rmi -f `docker images -q`

今回は PART1でDockerの基本についてまとめましたが、
次回は docker-composeについて、その次はECSについて書いてみようかと思ってます。

Related article

おすすめ関連記事