Docker入門

主に「[ドットインストール/Docker入門](https://dotinstall.com/lessons/basic_docker)」をまとめています。

## Dockerとは

- 軽量な仮想化環境
- 環境の違いを意識することなくアプリケーションを導入できる

## 環境

- Docker version 18.06.0-ce
- Vagrant 2.0.3
- Ubuntu 14.04

## vagrant-ubuntu-trust64でログインまで

vagrantを使ってUbuntuでログインする

vagrantboxの公式サイト[http://www.vagrantbox.es/](http://www.vagrantbox.es/)のリストからUbuntuを追加する
「https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box」


```terminal
$ vagrant box add trusty64 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
```

※Vagrantをinstallしてなければ[公式サイト](https://www.vagrantup.com/)でinstall

### 初期化/vagrantfile編集

直下にVagrant/Dockerディレクトリ作成後、初期化

```terminal
~/Vagrant/Docker $ vagrant init trusty64
```

vagrantfileを編集

```terminal
~/Vagrant/Docker $ vi vagrantfile
```

「config.vm.network "private_network"」のコメントアウトを外す

### vagrant立ち上げ/ubuntu-trust64にログイン

```terminal
~/Vagrant/Docker $ vagrant up
~/Vagrant/Docker $ vagrant ssh
```

## Docker install

vagrant-ubuntu-trust64にログインしている状態

Docker公式サイトの手順を元にinstall
[Get Docker CE for Ubuntu](https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository)

```terminal
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get update

vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

vagrant@vagrant-ubuntu-trusty-64:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-key fingerprint 0EBFCD88
```

実行で以下の出力になります

```
pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22
```

### リポジトリ設定

``` terminal
vagrant@vagrant-ubuntu-trusty-64:~$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```

### DockerCEをinstallしてHello World

```terminal
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get update
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get install docker-ce
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker run hello-world
```

以下のようなメッセージが表示されることを確認

```
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```

## 作業の流れ

1. OSにDockerをinstall
2. 「[DockerHub](https://hub.docker.com/)」からImageを検索
3. OSのDockerにimageを```docker pull```
4. ```docker run```で実行。Containerが作られる
5. Containerでアプリケーションを作ったりする
6. ```docker commit```でImageを作る
7. 6のImageを```docker push```で「DockerHub」にpush
8. 他のOSで「DockerHub」からImageを``` docker pull```

## DockerHubからImageを取得

DockerHubからImageを検索

- [DockerHub](https://hub.docker.com/)から検索する
- terminalで```sudo docker search hoge | more```

### Image「centos」をpull

```terminal
$ sudo docker pull centos
```

### Image一覧を確認

```terminal
$ sudo docker images
```

### Imageの詳細を確認

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

### Imageの削除

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

## Containerを作る

```docker run```でContainerを作る
centosからContainerを作って「hello world」実行

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

### 実行中のContainerを確認

```terminal
$ sudo docker ps
```

### 動作が終了したContainerを確認

```terminal
$ sudo docker ps -a
```

### 最新の5件を表示

```terminal
$ sudo docker ps -a -n=5
```

### Containerを削除

```terminal
$ sudo docker rm [CONTAINER ID]
```

## Containerを操作

- backgroundを走らせる```-d```
- ```free```というメモリを表示させるコマンドを3秒ごとに走らせる

```terminal
$ sudo docker run -d centos free -s 3
```

実行中のContainerを確認

```terminal
$ sudo docker ps
```

### logを表示

```terminal
$ sudo docker logs [CONTAINER ID]
```

### プログラム実行

``` terminal
$ sudo docker attach --sig-proxy=false [CONTAINER ID]
```

※```ctrl C```でプログラム停止

### 実行中のContainerを停止

```terminal
$ sudo docker stop [CONTAINER ID]
```

### Containerを再開

```terminal
$ sudo docker start [CONTAINER ID]
```

## ContainerからImageを作る

- interactive modeにする
- Containerのなかにterminalを立ち上げる

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

### hello.txtを作成

```terminal
# touch hello.text
exit
```

### Imageにcommit

```terminal
$ sudo docker commit [Container ID] hoge/hello
```

### Image一覧で確認

```terminal
$ sudo docker images
```

### Containerで確認

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

## Dockerfileを使ってbuild/command作成

Image/Containerの一連の作業をスクリプトにして自動化

### Dockerfile作成

```terminal
$ vi Dockerfile
```

```vim:Dockerfile
FROM centos
MAINTAINER [NAME] <MAIL-ADDRESS>
# RUN: buildする時に実行される
RUN echo "now building..."
# CMD: runするときに実行される
CMD ["echo", "now running..."]
```

### build

```terminal
$ sudo docker build -t hoge/echo .
Sending build context to Docker daemon  14.34kB
Step 1/4 : FROM centos
.
.
.
```

buildされたImage確認(hoge/echo)

```terminal
$ sudo docker images
```

### Container実行

```terminal
$ sudo docker run hoge/echo
now running...
```

## Webサーバーを立ち上げる

### Dockerfileで設定

```terminal
$ vi Dockerfile
```

```vim:Dockerfile
FROM centos:centos6
MAINTAINER [NAME] <MAIL-ADDRESS>
RUN yum install -y httpd
ADD ./index.html /var/www/html/
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
```

### index.html作成

```terminal
$ vi index.html
```

```vim:index.html
<html>
hello from Docker!
</html>
```

### build

```terminal
$ sudo docker build -t hoge/httpd .
.
.
.
Successfully tagged hoge/httpd:latest
```

### Container実行

```terminal
$ sudo docker run -p 8080:80 -d hoge/httpd
```

### ページ確認

vagrantfileのIPアドレスからページ確認

```vim:vagrantfile
config.vm.network "private_network", ip: "192.168.55.44"
```

「[192.168.55.44:8080](192.168.55.44:8080)」
```hello from Docker!```と表示される

## Imageをpush

Imageをpushする前に[DockerHub](https://hub.docker.com/)でsignupが必要

### login

```terminal
$ sudo docker login
```

## DockerHubにpush

下記のサイトを元に行いました。
「[Docker Hub にpushする方法](http://kengotakimoto.com/post-2645/)」

1. DockerHubのアカウント作成
2. DockerHubで「Create Repository」
3. Repository名や説明文を入力
4. Image名とDockerHubのRepository名を紐づけ

### 紐づけ

```terminal
$ sudo docker tag hoge/httpd [DockerHubのユーザー名/リポジトリ名]
```

### Image一覧確認

```terminal
$ sudo docker images
```

REPOSITORYにDockerHubで作成した```Repository```を確認

### push

```terminal
$ sudo docker push [ユーザ名/リポジトリ名]
```

DockerHubのRepositoryに反映


## 参考サイト

- [Docker公式](https://www.docker.com/)
- [DockerHub](https://hub.docker.com/)
- [ドットインストール/Docker入門](https://dotinstall.com/lessons/basic_docker)
- [Vagrant公式](https://www.vagrantup.com/)
- [Get Docker CE for Ubuntu](https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository)
- [Ubuntu16.04へのDocker CEインストール手順](https://qiita.com/ketch/items/69c7d542d8ab6395cfb0)
- [Docker Hub にpushする方法](http://kengotakimoto.com/post-2645/)