Dockerを0から勉強する

# やること

OSS(オープンソースソフトウェア)のDockerを0から勉強する。
コマンドの使い方や仕組みを理解することを目的とする。

Dockerfileを用いる方法は別記事で。。

##開発環境
* OS Ⅹ EL Capitan
* Vitualbox(5.1.0)
* Vagrant(1.9.1)
* Docker(1.13.1)
* Ubuntu(16.04)
* CentOS7  

##1.Vagrantを使ってUbuntuを立ち上げる
※入門ということで仮想マシンを立ち上げ、その上でDockerの動作検証を行います。

仮想マシン用のディレクトリの作成

```
$ cd ~/MyVagrant
$ mkdir docker_study
```


Vagrantfileの作成

```
$ vim Vagrantfile
```

```Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-16.04"
  #Vitual boxのケーブル接続設定
  config.vm.provider "virtualbox" do |vb|
   vb.customize ["modifyvm", :id, "--cableconnected1", "on"]
  end

  config.vm.define "dockerstudy" do |dockerstudy|
    #ホスト名の設定
    dockerstudy.vm.hostname = "dockerstudy"

	#メモリの設定
	# test.customize ["modifyvm", :id, "--memory", "1024"]

	#ホストOSと通信するIPアドレスの設定
    dockerstudy.vm.network "private_network", ip: "192.168.33.17"
  end

  #ansibleの設定
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "provisioning/main.yml"
    ansible.inventory_path = "provisioning/hosts"
    ansible.limit = 'all'
  end
end
```

Ubuntuの起動

```
$ vagrant up
```

ansibleの実行

```
$ vagrant provision
```

Ubuntuへの接続

```
$ vagrant ssh
```

##2.Dockerインストール

[インストール手順（公式）
](https://docs.docker.com/engine/installation/linux/ubuntu/)

※Ubuntuのバージョンに注意  

###①リポジトリを設定する

aptパッケージを更新する

```
$ sudo apt-get update
```

HTTPS経由でリポジトリを使用できるようにパッケージをインストールする

```
$ sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
```

Dockerの公式GPGキーを追加

```
$ curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add -
```

key IDが58118E89F3A912897C070ADBF76221572C52609Dであることを確認

```
$ apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D

  pub   4096R/2C52609D 2015-07-14
        Key fingerprint = 5811 8E89 F3A9 1289 7C07  0ADB F762 2157 2C52 609D
  uid                  Docker Release Tool (releasedocker) <docker@docker.com>
```

非公式リポジトリ(docker用リポジトリ)の追加

```
$ sudo add-apt-repository \
       "deb https://apt.dockerproject.org/repo/ \
       ubuntu-$(lsb_release -cs) \
       main"
```

###②Dockerをインストールする

aptパッケージを更新する

```
$ sudo apt-get update
```

Dockerの最新バージョンをインストール

```
$ sudo apt-get -y install docker-engine
```

正しくインストールされているか確認

```
$ docker -v  
  Docker version 1.13.1, build 092cba3
```

hello-worldイメージをダウンロードして、コンテナ内で実行。  
実行後、「Hello from Docker!」が表示されたらOK

```
$ sudo docker run hello-world
```


##3.Dockerイメージの操作

* コンテナのイメージ(centos)を探す
[https://hub.docker.com/_/centos/](https://hub.docker.com/_/centos/)

* コマンドでも同様のことを行える

```
$ sudo docker search centos | more
```

centOS(デフォルトよりcentos7)のイメージをdocker hubからpullする

```
$ sudo docker pull centos
```

イメージが取得できてるか確認

```
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              48b5124b2768        5 weeks ago         1.84 kB
centos              latest              67591570dd29        2 months ago        192 MB
```

イメージの設定確認
（内容の理解は困難。。。笑）

```
$ sudo docker inspect [IMAGE ID]
```

イメージの削除

```
$ sudo docker rmi [IMAGE ID]
```


##4.コンテナの操作

###①hello dockerを表示するコンテナの作成

作成したイメージ(centos)上で、"hello docker"を表示するコンテナの作成

```
$ sudo docker run centos echo "hello docker"
```

実行中のコンテナの確認
（上コマンドは実行終了しているので、表示はないはず）

```
$ sudo docker ps
```

実行したコンテナの確認

```
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                         PORTS               NAMES
311c2032139a        centos              "echo 'hello docker'"   4 minutes ago       Exited (0) 4 minutes ago                           sharp_bohr
```

実行したコンテナの最新の10個を表示

```
sudo docker ps -a -n=10
```

コンテナの削除

```
sudo docker rm 311c2032139a
```

###②デーモン化（常駐）したコンテナの作成・操作

作成したイメージ(centos)上で、メモリ状況を3秒おきに表示するコンテナをデーモン化(-d)  
※ 実行するとプロセスのIDが表示

```
$ sudo docker run -d centos free -s 3
50f825594131f17d4d77cb125ef02934b0b1463956160a64c699a05ef53faf5b
```

コンテナが動いているか確認

```
$ sudo docker ps
```

コンテナの実行を確認

```
$ sudo docker logs 50f
```

コンテナをフォアグラウンドで実行したい時(ctrl+cで停止)

```
$ sudo docker attach --sig-proxy=false 50f
```

実行中のコンテナの停止

```
$ sudo docker kill 50f
```

いろいろ確認してみる

```
$ sudo docker ps
$ sudo docker ps -a
$ sudo docker start 765
$ sudo docker ps
```

##5. コンテナからイメージを作る

コンテナ内(centos)に入って作業する  
-t: ホスト側の入力をコンテナの標準出力をつなげる  
-i: キーボードから入力した文字はコンテナ内のプロセスに送られる

```
$ sudo docker run -i -t centos /bin/bash
```

hello.txtの作成

```
$ touch hello.txt
```

コンテナからイメージを作成

```
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
4b9328129e13        centos              "bin/bash"               4 minutes ago       Exited (0) 4 minutes ago                          goofy_gates

$ sudo docker commit 4b9 admin/hello

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
admin/hello         latest              064996b61631        16 seconds ago      192 MB
centos              latest              67591570dd29        2 months ago        192 MB

```

作成されたイメージからコンテナの作成


```
$ sudo docker run -i -t admin/hello /bin/bash

```

イメージの作成→コンテナの作成→イメージの作成→コンテナの作成→...  
これを繰り返して編集していくのかな！

##5. イメージをpushする

Docker hubにsign upしておく
[https://hub.docker.com](https://hub.docker.com)

イメージ名はusernameと同じじゃないといけない点に注意
username: admin
Images: admin/????

Docker hubにloginする(ユーザ名など聞かれる)

```
sudo docker login
```

Docker hubにpushする

```
sudo docker push admin/httpd
```

Docker hubにログインして、Repositoriesのところにadmin/helloがあればOK

これをpullしたい時は

```
$ sudo docker pull admin/hello
```

をすれば良い

##作業の流れ(まとめ)
※2017/5/4 図の間違えを修正
![Docker図.png](https://qiita-image-store.s3.amazonaws.com/0/161771/64d99cb9-d1cd-de03-1f8d-4135c5d916f3.png)

Docker hubからpullしたイメージからコンテナを作り、コンテナ内に何らかの編集を加え、再びイメージを作る。
その後、イメージをDocker hubにpushする。
これが本記事で説明した一連の流れです。