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について書いてみようかと思ってます。