dockerの初歩（メモ書き）

# dockerとは?
dockerとは、2013年にdotCloud(現Docker)社が公開したアプリケーション実行環境である。
dockerはLXC（Linux Containers）機能を使い、コンテナ型仮想化技術を実現している。
これによって、1つのOS上で実行環境を他のプロセスから隔離してその中でアプケーションを動作させることができる。

dockerを使用することで、実行するのに複雑な手順が必要な環境の構築の必要がなくなるため、開発環境やテスト段階での使用目的での利用はもちろん、本番システム上での利用も増えつつある。

実際に使用してみて

* ローカル等で開発環境を作りたいときに面倒な、環境構築手順をスキップすることができる
* 本番環境に一部の処理で必要なソフトウェアやライブラリをインストールしなければならない場合、それをdocker内で実行することで本番環境の汚染を防ぐことができる

といったメリットを感じている。

# dockerの使い方

## dockerのインストール
[公式](https://docs.docker.com/engine/installation/#server)から、インストールしたいプラットフォームのパッケージをダウンロードし、インストールする。

CentOS等のサーバーにdockerをインストールしたい場合、yumコマンドからインストールすることもできる。
(CentOS7の場合、リポジトリを追加せずにインストールすることができる)

```bash
$ sudo yum -y install docker
```

MacやWindowにインストールした場合は、dockerが自動実行される。
環境設定等を変更したい場合は、ツールバーから [docker] > [Preference...] で変更することができる。

<img width="337" alt="スクリーンショット 2017-12-06 10.48.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/189662/9e8ba393-2f3f-d804-7da8-30464fc94fbf.png">

## dockerの実行方法
※ 以下は、docker for Macで動かしてみた際の処理になります。

dockerが起動していれば、dockerコマンドを動かすことができる。

```bash
$ docker -v
Docker version 17.11.0-ce, build 1caf76c
```

[公式のリポジトリ](https://hub.docker.com/)にあるイメージであればpullして持ってくることが可能。

```bash
$ docker pull centos:centos7
centos7: Pulling from library/centos
85432449fd0f: Pull complete
Digest: sha256:3b1a65e9a05f0a77b5e8a698d3359459904c2a354dc3b25ae2e2f5c95f0b3667
Status: Downloaded newer image for centos:centos7

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              centos7             3fa822599e10        6 days ago          204MB
```

``docker images``でローカルにあるdockerのイメージ一覧を見ることができる。
pullせずに直接指定して実行することもできるが、ローカルのimageにない場合は先にpullされる。

では、実際にpullしてきたimageの中で処理を走らせる。

```bash
$ docker run centos:centos7 echo 'hello world'
hello world
```

これで上記の``echo 'hello world'``はdockerのコンテナで実行されたことになる。

また、現在dockerで実行しているコンテナの一覧を見るためには``docker ps``を使う。
試しに、複数で``sleep 10``を実行してみる。

```bash
$ docker run centos:centos7 sleep 10
..
$ docker run centos:centos7 sleep 10
..
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED
STATUS              PORTS               NAMES
27ae13db6bf2        centos:centos7      "sleep 10"          3 seconds ago
Up 3 seconds                            amazing_mccarthy
a88e1f1f6603        centos:centos7      "sleep 10"          5 seconds ago
Up 5 seconds  
```

それぞれの``sleep 10``が別のコンテナで実行されていることがわかる。

# 自作のdockerイメージの作り方

公式のリポジトリにあるものだけではなく、自分の必要なライブラリ等をインストールして環境を作成したい場合は自作でdockerのイメージを作成する必要がある。
その場合は、DockerFileという作成したい内容を記載した設定ファイルを用意する。

## DockerFileを使ったビルド

下記はAWSのS3のAPIをpython上で使うためのDockerFileの例である。

```text:DockerFile
FROM python:3.6-alpine
RUN apk --update add --virtual build-dependencies \
    curl \
    &&  curl -kL https://bootstrap.pypa.io/get-pip.py | python \
    && apk del build-dependencies
RUN pip -V
RUN pip install boto3
```

上記のDockerFileをビルドしてみる

```bash
# docker build -t [image名:タグ] [DockerFileのあるパス]
$ docker build -t python-boto3 ~/docker/python/boto3/
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM python:3.6-alpine
3.6-alpine: Pulling from library/python
ab7e51e37a18: Pull complete
4a57a4e05b89: Pull complete
00662d5a9ee5: Pull complete
ccff5d0c07e6: Pull complete
9f2b218d61fa: Pull complete
...
Successfully built 69b53c833f4b
Successfully tagged python-boto3:latest

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
python-boto3        latest              69b53c833f4b        About a minute ago   134MB
python              3.6-alpine          4429b95d5625        34 hours ago         89.1MB
```

これで必要な環境をローカルに作成することができた。

## 作成したイメージをファイルとして出力/取り込みする

DockerFileで作成したイメージから手が加わったものや、毎度ビルドするのが大変な複雑なものの場合、直接イメージをファイルとして出力/取り込みすることもできる。

ローカルのイメージをファイルとして出力する

```bash
$ docker save python-boto3 > python-boto3.tar 
```

ファイルをイメージとして取り込む

```bash
$ docker load < python-boto3.tar
```

上記はコンテナでも``docker export``で同様の処理が可能

- - -

次回（があったら）、
docker-compose
ranchar
dockerとホストの繋ぎ方
ポート解放
とかも調べて書きたい:hugging: