Docker入門 ローカル環境とクラウド環境を作ってみよう(2/4)

第2回目になります。

今回はDockerに慣れるというのがゴールです。
Dockerらしい使い方ではないですが、とりあえず使うのが目的です。


# 関連する記事

[Docker入門 ローカル環境とクラウド環境を作ってみよう(1/4)](https://qiita.com/acron/items/329cd7aa3e2657002218)

[Docker入門 ローカル環境とクラウド環境を作ってみよう(3/4)]
【中級】本番環境を意識した役割で細分化してみた

[Docker入門 ローカル環境とクラウド環境を作ってみよう(4/4)]
【上級】コンテナオーケストレーションを意識して作ってみた

---

# 【初級】VMみたいに使ってみた

Dockerの動作として以下の構成は知っておいて損はないです。
『Docker for Mac/Windows』だと一度にクライアントとサーバがインストールされます。

## Dockerを構成するコンポーネント

![Docker のアーキテクチャ](http://docs.docker.jp/_images/architecture.png)
引用: http://docs.docker.jp/engine/docker-overview.html


- Dockerクライアント
    - コマンドをデーモンに送ります
- Dockerデーモン（サーバ）
    - コンテナを動作させます
- Dockerレジストリ
    - イメージを保管します **<-更に詳しく掘り下げます**

## レジストリにあるDockerイメージについて

Dockerイメージとは読み込み専用のテンプレートで、コレを使ってDockerコンテナを起動します。
Dockerイメージはレイヤの積み重ねで構成されています。
レイヤ構成については詳しく説明してくれている記事があるので、そちらを読んだほうがいいです。

イメージは、ベース・イメージ（例 Ubuntu、CentOS）から作成します。
さらに構築できるようにするため、『命令』と呼ぶ構築手段を簡単に記述した集まりがあります。

命令は次のような動作をします。

- コマンドの実行
- ファイルやディレクトリの追加
- 環境変数の作成
- 対象イメージを使ってコンテナを起動する時、どのプロセスを実行するか

これらの命令を『**Dockerfile**』と呼ぶファイルに保管します。
DockerはこのDockerfileを読み込み、命令を実行し、最終的なイメージを作ります。

## Dockerfileについて

記述するシンプルなテキスト形式のファイルになります。

### （例） Web+DBサーバのDockerfile

```dockerfile:Dockerfile
# ベース・イメージを決める
FROM centos:6.9

# 必要なパッケージをインストール
RUN yum install -y httpd httpd-devel mysql mysql-server php php-pdo php-mysql

# インデックス
RUN echo '<?php phpinfo() ?>' > /var/www/html/index.php

EXPOSE 80 3306
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
```

## イメージからコンテナ作成・・・そして起動まで

Dockerfileを作り終えたら、DockerクライアントからDockerコマンドを利用してイメージの作成をします。
その後、生成されたイメージからコンテナを生成して起動します。

![Docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266407/e951f606-c3e2-d5df-37d2-090af33a6875.png)

### コマンドリスト

#### コンテナ作成

```shell
使い方: docker build [ -t ｛イメージ名｝ [ :｛タグ名｝ ] ] ｛Dockerfileのあるディレクトリ｝

$ docker build -t acron/web:1.0 .
```

#### コンテナ起動

```shell
使い方: docker run -p ｛開放ポート:アクセスポート｝ --name ｛コンテナ名｝ ｛イメージ名｝:｛タグ名｝

$ docker run -p 80:80 --name web1 acron/web:1.0

すでにrunで起動している場合は以下のコマンドになります。
$ docker start web1
```

#### コンテナへログイン

```shell
使い方: docker exec -it ｛コンテナ名｝ ｛起動シェル｝

$ docker exec -it web1 /bin/bash
```

#### ローカルPCのマウント
オプション『-v』を利用します。

```shell
使い方: docker run -v {ホスト側ディレクトリ}:{コンテナ側ディレクトリ} -it --name {コンテナ名} {イメージ名}:｛タグ名｝

$ docker run -v ./app -it --name web1 acron/web:1.0
```

#### コンテナ停止

```shell
使い方: docker stop {コンテナID または イメージ名}

$ docker stop web1
```

## WebコンテナをDockerで立ち上げる

起動シェルなどを作成したら複数プロセスを立ち上げれますが、今回はコンテナにログインして起動しています。

```shell
1. イメージの作成
$ docker build -t acron/web:1.0 .

2. コンテナ起動
$ docker run -p 80:80 --name web1 acron/web:1.0
 Webページが生成されます。
 ブラウザで「http:localhost」にアクセス

3. コンテナにログイン
$ docker exec -it web1 /bin/bash

4. DBインスタンスを起動
$ service mysqld start
```

# まとめ

Dockerっぽい使い方ではなかったですが、Ansbleとかで作成していた内容がDockerfileにまとまり、Dockerコマンドを利用してコンテナという形で生成することができたと思います。
イメージという概念のおかげで、生成・削除が容易になっていたと思います。

次回は、もう少しコンテナらしくイメージを作成をして起動していきます。


# 参考にした詳しい資料

詳しい使い方や、Dockerの構造などが、とても分かりやすく説明されています。

**Docker入門: コンテナ型仮想化技術の仕組みと使い方**
https://www.slideshare.net/yuichi110/docker-introduction-42455180

**Dockerfile を書くためのベストプラクティス解説編**
https://www.slideshare.net/zembutsu/explaining-best-practices-for-writing-dockerfiles