Docker で環境作成 for centos7


## なぜDockerがよいのか

1. 永続化コンテナを使えばデータベースのスナップショットが保存できる
1. 別のLinuxBoxで実行環境をコピーできる
1. １台のマシン上で複数のコンテナを実行できるためリソースの有効利用ができ効率的で安全
1. 仮想環境上のLinuxBoxで実行できる

## 今回の検証環境

1. vagrantのイメージ bento/cntos-7.1 をベースにしたもの
1. VirtualBox

### OSを最新にする

```bash
$ sudo yum update -y
$ sudo systemctl disable firewalld
$ sudo vi /etc/sysconfig/selinux
SELINUX=disabled
```
OSを再起動
## インストール
```bash
$ sudo yum install docker -y
$ sudo systemctl start docker
$ sudo systemctl status docker
$ sudo systemctl enable docker
```

#### dockerの動作確認

sudo を使わないと動かないので注意
ユーザ権限で動かす方法もあるかよくわからなかった

```bash
$ sudo docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: docker-253:0-67396965-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: xfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 2.407 GB
 Data Space Total: 107.4 GB
 Data Space Available: 37.68 GB
 Metadata Space Used: 2.552 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.145 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
 Library Version: 1.02.93-RHEL7 (2015-01-28)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.10.0-229.20.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
CPUs: 1
Total Memory: 1.462 GiB
Name: crystal
ID: Y5N5:VL7S:KKQC:JYZT:25PI:6FKP:S3MJ:T254:AOLZ:S6QA:UC3Q:VELQ
```

## MySQL docker

### イメージの検索

```bash
$ sudo docker search mysql
INDEX       NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/mysql                        MySQL is a widely used, open-source relati...   1383      [OK]
docker.io   docker.io/mysql/mysql-server           Optimized MySQL Server Docker images. Crea...   70                   [OK]
docker.io   docker.io/orchardup/mysql                                                              42                   [OK]
docker.io   docker.io/centurylink/mysql            Image containing mysql. Optimized to be li...   28                   [OK]
docker.io   docker.io/wnameless/mysql-phpmyadmin   MySQL + phpMyAdmin https://index.docker.io...   25                   [OK]
docker.io   docker.io/sameersbn/mysql                                                              21                   [OK]
```

### イメージの取得

```bash
$ sudo docker pull mysql:5.6

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/mysql     latest              917f04aa61ad        7 days ago          359.8 MB
docker.io/mysql     5.6                 d99302287ecc        7 days ago          324.2 MB
```

### コンテナの実行から終了まで

```bash
$ sudo docker run --name mysql_instance -e MYSQL_ROOT_PASSWORD=mysql -d mysql:5.6
bc4849729617569b34169a7cc2944e37128e6f57e1bc7408051a0ddc33fe0f82 ← ランダムなハッシュ値が返る

# コンテナの情報が JSON 形式で取得
$ sudo docker inspect mysql_instance

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
bc4849729617        mysql               "/entrypoint.sh mysql"   7 minutes ago       Up 7 minutes        3306/tcp            mysql_instance

# 終了させる
$ sudo docker stop mysql_instance
mysql_instance

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
bc4849729617        mysql               "/entrypoint.sh mysql"   10 minutes ago      Exited (137) 26 seconds ago                       mysql_instance

$ sudo docker rm mysql_instance
```
### サーバに接続する
```bash
$ sudo docker run --name mysql_instance -e MYSQL_ROOT_PASSWORD=mysql -d mysql:5.6

$ sudo docker run -it --link mysql_instance:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

## CentOS container

```bash
$ docker pull centos:latest
$ docker run -it -h myhostname --rm centos:latest /bin/bash
[root@myhostname /]#
```

## コンテナの変更を保存する

コンテナにミドルウエアや設定などをインストールしたものをレポジトリにイメージとして保存する
実行中のものは一時中断(paused)になるので注意

```bash
$ docker commit container_name bibio/myimage:latest 
```
イメージのサイズは大きくなるのでディスクサイズの管理には注意が必要

## 永続化させる

### ホスト上のディスクに設置する

`docker run` の `-v` オプションを使用するとコンテナ上にマウントできる

```bash
$ sudo docker run -v /home/vagrant/var/lib/mysql:/var/lib/mysql --name mysql_instance -e MYSQL_ROOT_PASSWORD=mysql -d mysql:5.6

$ sudo docker run -it --link mysql_instance:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
```