Dockerについてコンテナみたいな仮想環境ということくらいしか知らなかったので、
ハンズオンで実際に動かしながら勉強してみました。
ハンズオンをやる前に、そもそもDockerについての仕組みとか用語がわからなかったので、軽く調べてからやることにしました。
Dockerについて
Dockerとは
Linux等で「コンテナ型仮想化」と呼ばれる仮想化技術を用いて作成したコンテナを管理するためのソフトウェア。
シンプルで起動や処理が高速に行える。OSとアプリの迅速な開発・配備を目的としている。
導入がスピーディー、起動がはやい、一度に多くの処理が可能、コンテナの設定を再利用できるといった特徴がある。
コンテナとは
OSのカーネル機能を用いて作動させる、実行環境や命令など複数のファイルシステムをひとまとめにしたもの。
イメージとは
コンテナを作動させる際に必要なファイルや設定のこと。
AUFSとは
異なるファイルシステムのファイルやディレクトリを透過的に重ねて、ひとつのファイルツリーを構成できるファイルシステム。
ファイルシステム上ではread-onlyで使用していて、追加や変更があった場合にメモリー上で書き込みを行い、元のファイルシステムに差分データを被せて管理する仕組みのこと。
イメージ、コンテナ、ストレージ・ドライバの仕組みについて
下記のページがわかりやすかったです。
イメージ、コンテナ、ストレージ・ドライバの理解 — Docker-docs-ja 17.06.Beta ドキュメント
ハンズオン
下記を参考にさせて頂き、実際にDockerを使ってみました。
github.com
環境準備
Docker Toolboxのインストール
なぜかインストールがいっこうに進まない事象が発生しました。
Docker自体は以前にインストールしてあったので、この手順はスキップしてとりあえず次へ。
boot2docker の起動
下記コマンドを実行するとあったのですが、defaultがないエラーが返ってきました。
~$ docker-machine start default
Host does not exist: "default"
defaultの設定方法がよくわからなかったので、
とりあえずboot2dockerを起動させて、docker-machine を起動させて、
docker infoコマンドで正常な結果が返せるような別の方法を探しました。
Boot2dockerをインストールし、
下記コマンドでBoot2dockerの仮想マシンイメージをダウンロードしました。
~$ boot2docker init
docker-machineの起動
docker-machineが入っていることを確認。
~$ docker-machine version
docker-machine version 0.12.2, build 9371605
virtualboxにdevという仮想マシンを作成。
ちなみに最新のvirtualboxをインストールしておかないとエラーになりました。
~$ docker-machine create --driver virtualbox dev
作成した仮想マシンdevを起動させ、SSH接続します。
接続できるとクジラが出てきます。
~$ docker-machine start dev
~$ docker-machine ssh dev
Dockerの環境情報を表示させ、正常に起動できたことを確認しました。
~$ docker info
手動でコンテナを構築する
Docker イメージを取得
ハンズオンの手順通りに下記のコマンドを実行。
CentOS6を自分の環境に取り込み、イメージ一覧で確認します。
docker@dev:~$ docker pull centos:centos6
docker@dev:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos centos6 ea096efd33cc 2 weeks ago 194MB
コンテナを起動して httpd をインストール
手順通りに実行します。
下記コマンドでコンテナを新規作成してログインします。
-it を付けることでコンテナ内で操作ができます。
~$ docker run -it centos:centos6 /bin/bash
コンテナに入ったら、httpdをインストールしてApacheを起動します。
[root@c71fed6db3a7 /]# yum install -y httpd
[root@c71fed6db3a7 /]# service httpd start
コンテナのプロセスを確認
別のターミナルを開き、psコマンドを使ってコンテナのプロセスを確認します。
-a オプション -> 全てのプロセスを表示
-l オプション -> 最後に起動したプロセスを表示
オプションなし -> 起動しているプロセスのみ表示
~$ docker-machine ssh dev
docker@boot2docker:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c71fed6db3a7 centos:centos6 "/bin/bash" 5 minutes ago Up 5 minutes elastic_mccarthy
psコマンドの見方
CONTAINER ID -> コンテナIDの最初の12桁
IMAGE -> コンテナの元イメージ
COMMAND -> 起動時に与えられたコマンド
CREATED -> コンテナの作成日からの経過
STATUS -> 起動してからの経過・または停止してからの経過
PORTS -> バインドしているポート
NAMES -> コンテナの名前
コンテナを停止
exitで停止します。オプションを付けないpsコマンドを実行するとコンテナが何も表示されません。
[root@c71fed6db3a7 /]# exit
コンテナをイメージにする
手順通りに作成したイメージを確認します。
docker@boot2docker:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c71fed6db3a7 centos:centos6 "/bin/bash" 16 minutes ago Exited (0) 10 minutes ago elastic_mccarthy
コンテナID「c71fed6db3a7」のイメージを「tomi/manual-httpd」という名前で作成します。
イメージ名は基本的には「{ユーザー名} / {イメージ名}」です。
docker@boot2docker:~$ docker commit c71fed6db3a7 tomi/manual-httpd
作成したイメージを確認します。
docker@boot2docker:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomi/manual-httpd latest 09152d374a81 6 seconds ago 311MB
centos centos6 ea096efd33cc 2 weeks ago 194MB
httpd イメージを Mac にポートマッピングをした状態で起動する
手順通りにコンテナに入り、Apacheを起動します。
[root@44225433df3c /]# service httpd start
docker@boot2docker:~$ docker run -p 8080:80 -it tomi/manual-httpd /bin/bash
ブラウザでアクセスするため、Docker が起動してる IP を確認します。
私はdefaultの環境設定をしていないせいか手順通りではIPが確認できず、
仮想マシン名を指定する必要がありました。
ちなみにこのコマンドは、別のターミナルでコンテナから出た状態で実行します。
~$ docker-machine ip dev
192.168.99.100
デタッチ
exitしないでコンテナから抜けることができます。
コンテナに入っている状態で、Control + p, Control + q と順番に押すとコンテナから抜けられます。
抜けたあともブラウザでアクセスでき、psコマンドでも表示されます。
コンテナから抜けてちょっとした操作をしたいときに便利かと思いました。
デタッチして抜けたあと、またコンテナに入りたい場合は下記コマンドでコンテナIDを指定します。
docker@boot2docker:~$ docker attach ea9eb30c163f
[root@ea9eb30c163f /]#
Dockerfileを使う
手順通りにDockerファイルを編集します。
~$ docker-machine ssh dev
docker@boot2docker:~$ mkdir my_docker
docker@boot2docker:~$ cd my_docker/
docker@boot2docker:~/my_docker$ vi Dockerfile
Dockerファイルの中の設定は下記になっているようです。
FROM centos:centos6 ←Dockerイメージ元
MAINTAINER test ←作成者
RUN yum install -y httpd ←ビルド中に実行するコマンド
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"] ←docker runの際に起動するコマンド
Dockerファイルからイメージを構築します。
docker@boot2docker:~/my_docker$ docker build -t tomi/httpd .
新しくイメージが作成されました。ブラウザからもアクセスできます。
docker@boot2docker:~/my_docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomi/httpd latest b0e9dd058e56 12 seconds ago 311MB
tomi/manual-httpd latest 09152d374a81 2 hours ago 311MB
centos centos6 ea096efd33cc 2 weeks ago 194MB
バックグラウンドでイメージを起動
-d オプションを付けるとバックグラウンドで起動します。
docker@boot2docker:~/my_docker$ docker run -p 8080:80 -d tomi/httpd
コンテナを外から停止すると書いてあるので、手順通り別ターミナルから実施。
外から停止してもバックグラウンドで起動しているから、プロセスが起動しているのだと推測。
## 起動しているプロセス一覧を表示
docker@boot2docker:~/my_docker$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
53be3d3eabe4 tomi/httpd "/usr/sbin/httpd -D …" 57 seconds ago Up 56 seconds 0.0.0.0:8080->80/tcp vigilant_einstein
## プロセスを停止
docker@boot2docker:~/my_docker$ docker stop 53be3d3eabe4
53be3d3eabe4
## 起動しているプロセス一覧を表示
docker@boot2docker:~/my_docker$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
起動しているプロセスが表示されませんでした...。
停止したら停止するような気もしてきたのですが、
そうするとこの手順で何を確認したかったのかがよくわかりませんでした。
Docker Hub にイメージを公開
DockerHubのアカウントを作成します。
https://hub.docker.com/
DockerHubにログインしてpushします。
pushするとき、指定するリポジトリ名に含まれるユーザー名とDockerHubのユーザー名が同じでないとエラーになります。
## イメージを確認
docker@boot2docker:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomi/httpd latest b0e9dd058e56 30 minutes ago 311MB
tomi/manual-httpd latest 09152d374a81 3 hours ago 311MB
centos centos6 ea096efd33cc 2 weeks ago 194MB
## DockerHubにログイン
docker@boot2docker:~$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: mtomitomi
Password:
Login Succeeded
## push
docker@boot2docker:~$ docker push tomi/httpd
The push refers to repository [docker.io/tomi/httpd]
15a5798ee1c7: Preparing
80716a2ba414: Preparing
denied: requested access to the resource is denied
なのでリポジトリ名に含まれるユーザー名を変更します。
tagコマンドでイメージを新規作成します。
docker@boot2docker:~$ docker tag b0e9dd058e56 mtomitomi/httpd:ver1
docker@boot2docker:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mtomitomi/httpd ver1 b0e9dd058e56 38 minutes ago 311MB
tomi/httpd latest b0e9dd058e56 38 minutes ago 311MB
centos centos6 ea096efd33cc 2 weeks ago 194MB
不要になったイメージを削除します。
docker@boot2docker:~$ docker rmi tomi/httpd
Untagged: tomi/httpd:latest
docker@boot2docker:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mtomitomi/httpd ver1 b0e9dd058e56 39 minutes ago 311MB
centos centos6 ea096efd33cc 2 weeks ago 194MB
DockerHubのユーザー名とリポジトリのユーザー名が同じになったので、改めてpushします。
docker@boot2docker:~$ docker push mtomitomi/httpd
The push refers to repository [docker.io/mtomitomi/httpd]
15a5798ee1c7: Pushed
80716a2ba414: Pushed
ver1: digest: sha256:2dd7780259d3b61ccfcdfec5c4d07192deacdb3443dfbe4c32198498cfacc7f4 size: 741
Docker Hubに反映されました。
Docker Compose で複数コンテナを扱う
複数のコンテナから成るサービスの構築と実行を自動的に行い、管理を容易にする機能。compose ファイルを用意してコマンドを1 回実行することで、そのファイルから設定を読み込んですべてのコンテナサービスを起動することができます。
手順通りにコマンドを実行。
~/dockerfiles/compose_hits_app (master)$ docker-compose up
ダウンロードに少し時間がかかりました。
手順通りにアクセスカウンターアプリを起動させようとしましたが、起動できませんでした...。
原因わからず最後の最後で諦める。
ハンズオンやってみた感想
資料が2年前のものだったせいか、手順通りにやっても上手くいかない箇所がいくつかありました。けれども、そういった箇所があったおかげで自分で調べて試行錯誤しながら進めることができ、手順やコマンドの理解やが深まりました。
ネットには情報がたくさん載っていたので、調べながら進めやすかったです。
基本的な操作は理解できたのですが、仕組みの部分の理解がまだあまりできていなかったり、
Dockerについてはまだまだ奥が深いことが多いかと思うので、実際に触りながら覚えていきたいと思います。