ローカルDockerでCentOS立てた時の忘備録　~Docker基本（pull, run, save, load)~


## 何について書くのか
DockerでCentOSイメージコンテナを立て、アプリケーション環境を用意したが保存をしたい。
始めはイマイチ忘れてよくわからなくなる。
やったことベースで簡潔に纏めておきたかった。

コマンド自体はたくさんあるが、必要最低限のものだけ記載したので
私とやりたいことが似ていたら役立つかもしれません。

ローカル、と記載している理由は、いつもAWS上で使っていましたが
今回は自身のMac上で行ったため、です。

## イメージを持ってくる

これから記載するのはすでに公開されているイメージを引っ張ってくる場合です。

*「あーMacでCentOS7の検証したいな〜」* という場合は
`# docker pull centos:centos7`
これで持って来れます。

もちろん「単純に分離したいだけ」「自作のイメージを配布したいだけ」などなら
自分で作るので別にいいんですが、大体の場合私は
ローカルでCentOSなどのイメージを持ってきたいなんて場合が多い。

**イメージさ、どこから持ってくるの？**
Dockerhubです。
https://hub.docker.com

普通のCentosであればこの辺りを使います
https://hub.docker.com/_/centos?tab=tags

あ、もちろんサイトにわざわざ行かなくても、コマンドで探したりもできます。

他の用途だと、例えば
Deep LearningのためPython×TensorFlow環境用意するの面倒で
Kerasとか色々環境用意するのだるいな…
なんて時もベースイメージとしてこの辺り持って来れば済みます。
しかも、プロセスとして機能するDocker、メモリなりCPUを制限させておけば暴走の心配がほぼない。分離。
https://hub.docker.com/r/tensorflow/tensorflow/
↑よく使ってた

では、やっていきます。

欲しいイメージの検索。こちらはCentOSの場合。

```
# docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5520                [OK]                
ansible/centos7-ansible            Ansible on Centos7                              122                                     [OK]
jdeathe/centos-ssh                 CentOS-6 6.10 x86_64 / CentOS-7 7.6.1810 x86…   111                                     [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC session…   99                                      [OK]
centos/mysql-57-centos7            MySQL 5.7 SQL database server                   62                                      
imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              57                                      [OK]
tutum/centos                       Simple CentOS docker image with SSH access      44                                      
centos/postgresql-96-centos7       PostgreSQL is an advanced Object-Relational …   39                                      
kinogmt/centos-ssh                 CentOS with SSH                                 29                                      [OK]
centos/php-56-centos7              Platform for building and running PHP 5.6 ap…   22                                      
pivotaldata/centos-gpdb-dev        CentOS image for GPDB development. Tag names…   10                                      
nathonfowlie/centos-jre            Latest CentOS image with the JRE pre-install…   8                                       [OK]
drecom/centos-ruby                 centos ruby                                     6                                       [OK]
mamohr/centos-java                 Oracle Java 8 Docker image based on Centos 7    3                                       [OK]
darksheer/centos                   Base Centos Image -- Updated hourly             3                                       [OK]
…
```
ｷﾞｬｰｲｯﾊﾟｲﾃﾞﾃｷﾀ ( ◠‿◠ )

ここで行ってる検索は、Dockerhubでここに文字入れてるのと同じようなものです。（filter可）

<img width="811" alt="スクリーンショット 2019-08-22 15.42.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/99265dc1-4699-f43c-69d9-d4fd0d2bf509.png">


## Ubuntuイメージでやってみるの巻

ではこれから試しにUbuntuイメージを持ってきます。
念の為まずはイメージ検索します。

```
$ docker search ubuntu
NAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   9855                [OK]                
dorowu/ubuntu-desktop-lxde-vnc                            Docker image to provide HTML5 VNC interface …   334                                     [OK]
rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi…   228                                     [OK]
consol/ubuntu-xfce-vnc                                    Ubuntu container with "headless" VNC session…   186                                     [OK]
ubuntu-upstart                                            Upstart is an event-based replacement for th…   99                  [OK]                
…
```

あ、大丈夫ですね。ちゃんとイメージ公開されています。
では一番上のOfficialイメージにしましょう。

```
$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
35c102085707: Pull complete 
251f5509d51d: Pull complete 
8e829fe70a46: Pull complete 
6001e1789921: Pull complete 
Digest: sha256:d1~c94d90
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
```

なにもタグを指定しないとlatestを引っ張る模様。
https://hub.docker.com/_/ubuntu?tab=description

## イメージの確認

持ってきたイメージを確認します。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              a2a15febcdf3        6 days ago          64.2MB
```

※今後、REPOSITORY:TAGでよく指定する機会があります。


## 立ち上げ
では、実際に立ち上げてみます。

```
$ docker run -ti ubuntu:latest /bin/bash
root@df0c54ef3b07:/#
```
立ち上がって入れました。

```
root@df0c54ef3b07:/# cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
…
```
確認できました。

Dockerコンテナが立ち上がっているのか確認するときは

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                              NAMES
cfb97fea54fe        ubuntu:latest       "/bin/bash"         About a minute ago   Up About a minute                                      peaceful_villani
```
です。


※以下補足です。
docker runにて

|オプション|説明|
|:---|:---:|--:|
|*-ti*|	コンテナのプロセスにttyを割り当てる。|
|*/bin/bash*	|bashで起動|


## イメージの保存と読込

試しにdocker内でファイルを作成しておきます（新しくUbuntu立てた）

```
root@e7ff353d5a71:~# touch meguro
root@e7ff353d5a71:~# ls
meguro
```

現在のイメージは以前の状態。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              a2a15febcdf3        7 days ago          64.2MB
```
コンテナをイメージに変換して

```
$ docker commit be6e776efcc4 ubuntu:meguntu
sha256:~e67r2d
```
saveコマンドでイメージ保存！

```
$ docker save ubuntu:meguntu > meguntu.tar
```
確認。できてる！

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              meguntu             63322548e865        2 minutes ago       64.2MB
```


（今起動しているコンテナを停止。こうやってIDで指定もできる。）

```
$ docker stop be6e776efcc4
be6e776efcc4
```

（イメージも持っていない状態にします）

```
$ docker rmi ubuntu:meguntu
Untagged: ubuntu:meguntu
```
**果たして保存されているのか？**
ロードする

```
$ docker load < meguntu.tar 
61f77b8c33fa: Loading layer [==================================================>]  2.048kB/2.048kB
Loaded image: ubuntu:meguntu
```
確認。できてる


```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              a2a15febcdf3        7 days ago          64.2MB
```
では動かしてみる。本当に保存できてた…？

```
$ docker run -ti ubuntu:meguntu /bin/bash
root@d8eab066c577:/# cd
root@d8eab066c577:~# ls
meguro
```
**できてたー！**


## まとめ

ということで、ローカルDockerでCentOSを立て、構築など変更をし、そのイメージ保存/ロードまでできました。

保存したイメージ、dockerhubで公開なり配布をすれば、Dockerのメリットを享受できますね。

少しでも、役に立った！復習できた！
と思って頂けたら、いいね！お願いしますm(_ _)m

ありがとうございました。