Docker入門

この記事はDockerを初めてさわったときのメモ。

後から見つけましたが、[こちらの記事](https://qiita.com/etaroid/items/b1024c7d200a75b992fc)が最高にわかりやすい。Dockerが何か、から少し踏み込んだところまで分かりやすく説明してある。
これは、チートシート的に活用してください。

#インストール
必要なパッケージのインストール
`$ yum install yum-utils device-mapper-persistent-data lvm2`

リポジトリの登録
`$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo`
`$ ll /etc/yum.repos.d/`

```
-rw-r--r-- 1 root root 2424 Oct 19 06:57 docker-ce.repo
```

利用可能なヴァージョンをみる
`$ yum list docker-ce --showduplicates | sort -r`

インストール
`$ yum install docker-ce`
or
`$ yum install 3:19.03.7-3.el7`
インストール確認
`$ docker --version`

起動
`$ systemctl start docker`
確認
`$ systemctl status docker`

自動起動
`$ systemctl enable docker`
情報確認
`$ docker info`

#起動
Dockerイメージの一覧表示
`$ docker images`

```
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
```
※ないので、ヘッダーしか表示されない。

コンテナの一覧表示（Dockerコンテナとは、Dockerイメージをもとに起動させたコンテナのこと。）
`$ docker ps -a`
※aは停止中のコンテナも表示

```
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
```
※もちろん、ないので、ヘッダーしか表示されない。

Dockerイメージは、「Docker Hub」という公開管理しているところからダウンロードしたり、自分でDockerイメージを作成したりすることができる。

公開されているhello-worldというDockerイメージを取得、コンテナを起動
`$ docker run hello-world`

```
Unable to find image 'hello-world:latest' locally  ・・・①
latest: Pulling from library/hello-world           ・・・②
ca4f61b1923c: Pull complete
Digest: sha256:083de497cff944f969d8499ab94f07134c50bcf5e6b9559b27182d3fa80ce3f7
Status: Downloaded newer image for hello-world:latest

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://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```
①ローカル環境にはDockerイメージがない。
②Docker Hubに探しに行き、存在すればDockerイメージをダウンロードする。
ダウンロードが完了したら、コンテナが起動。
③コンテナの中でメッセージが出力（②、③を1~4のなかで説明している）

増えているかもう一度確認
`$ docker images`
`$ docker ps -a`
左から、コンテナのID、使用したDockerイメージ、コンテナ起動時にコンテナ内で実行するコマンド、コンテナの作成日時、状態（起動中、停止中など）、ポートフォワード設定、コンテナの名前

Exitedは停止中、Upは起動中。
※hello-worldイメージでは、メッセージを出力するだけのプロセスなので、停止する。

イメージだけダウンロードする場合
`$ docker pull hello-world`

#コンテナ、イメージを削除する
コンテナの削除
`$ docker rm <コンテナ名>`
または
`$ docker rm <CONTAINER ID>`

イメージの削除
`$ docker rmi <IMAGE ID>`
または
`$ docker rmi <REPOSITORY>:<TAG>`

#Nginxイメージを使って、いろいろ操作してみる
イメージをDL
`$ docker pull nginx`

起動
`$ docker run -d --name nginx -p 8080:80 -v ./log/nginx:/var/log/nginx nginx`
※オプションについては[こっち](http://docs.docker.jp/engine/reference/run.html)
※-d デタッチモード。バックグラウンドで実行。
※-name 参照できる名前
※-p ポートフォワード設定。<ホスト側のポート>:<コンテナ側のポート>」（ホスト側を省略すると自動で設定）
※-v ボリューム設定（ディレクトリ共有）。 <ホスト側>:<コンテナ側>

http://<作成したインスタンスのIPアドレス>:port/
で確認
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348885/b761f355-1661-fee5-1a5a-9963f10edb3d.jpeg)

ボリュームを確認。（ログが共有されているか）
`$ ls -la ./log/nginx`

コンテナにログインしてみる
`$ docker exec -it <コンテナ名> bash`
※もしも

```
OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "exec: \"bash\": executable file not found in $PATH": unknown
```
と出たら
`$ docker exec -it <コンテナ名> sh`
を試す。


停止
`$ docker stop nginx-container`

再度起動
`$ docker start nginx-container`

※
docker pull :DockerHubからイメージを取得
docker create ：取得したイメージからコンテナを作成
docker start ：作成したコンテナを起動
これらを同時に実行するコマンドがdocker run

コンテナの詳細を確認
`$ docker inspect <コンテナ名>`


#Dockerfileを使用して、Dockerイメージを作成

Dockerfileの作成
`$ cd <Dockerfileをつくるディレクトリ>`
`$ vi Dockerfile`

```
FROM nginx

#変数
ARG host="xxx.jp"

#confを追加
ADD ./conf/conf.d /etc/nginx/conf.d/

#ログ専用ディレクトリを作成
Run mkdir -p /var/log/nginx/$host
```

イメージ作成
`$ docker build -t <Dockerイメージ名> .`
※.は、Dockerfileが存在するディレクトリを指定

※コンテナからDockerイメージを作成する
`$ docker commit <コンテナ名> <作成するDockerイメージ名>`

#ネットワーク
複数立ち上げたコンテナ間で通信するためにネットワークが必要。
Bridgeネットワークは、デフォルトで存在するネットワークで、作成されたコンテナがデフォルトで接続される。
Bridgeネットワークでは、同じネットワーク内に存在するコンテナとIPアドレス指定で通信することができるが、DNSが定義されていないのでコンテナ名では他のコンテナに通信できない。
=>
名前解決できるようにするために独自ネットワークを作成し、コンテナをつなげることが必要になる。

ネットワーク作成(デフォルトのdriverはbridge)
`$ docker network create <ネットワーク名>`
コンテナをつなげる
`$ docker network connect <接続するネットワーク名> <コンテナ名>`

一覧確認
`$ docker network ls`

詳細
`$ docker network inspect <ネットワーク名>`

ネットワーク切断
`$ docker network disconnect <ネットワーク名>　<コンテナ名>`

削除
`$ docker network rm <ネットワーク名>`

コンテナ⇔ホスト間のファイルのやりとり
・ホスト側からコンテナ内にファイルをコピー
`$ docker cp <ホスト側のファイル> <コンテナ名>:<コンテナ内のコピー先ディレクトリ>`
・コンテナ内からホストへコピー
`$ docker cp <コンテナ名>:<コンテナ内のコピー先ディレクトリ> <ホスト側のファイル>`

※dockerはコンテナ名で名前空間を作ってくれるので、コンテナ名で通信できる。コンテナ間通信の場合も、この名前空間を使用できる。

#ボリューム
一覧確認
`$ docker volume ls`

削除
`$ docker volume rm <ボリューム名>`

#その他
詳細確認
`$ docker inspect <CONTAINER ID>`
コンテナに割り振られたIPアドレスの取得
`$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <CONTAINER ID>`

#docker-compose
起動する際のコマンドオプションや手順などを管理。複数のコンテナを扱うDcokerアプリを定義・実行するのに便利なツール。

ヴァージョンの確認
`$ https://github.com/docker/compose/releases`
インストール
`$ curl -L https://github.com/docker/compose/releases/download/<version>/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose`

インストール確認
`$ docker-compose --version`
`$ chmod +x /usr/local/bin/docker-compose`

docker-compose.ymlの作成
`$ cd <docker-compose.ymlを作るディレクトリ>`
`$ vi docker-compose.yml>`
例などはまた別記事でいずれ。

以下、
**docker-compose.ymlが置かれているディレクトリにいなければいけない。**

Dockerイメージのビルド
`$ docker-compose build`

起動
`$ docker-compose up -d`

停止
`$ docker-compose stop`

削除
`$ docker-compose rm`
確認なしに削除
`$ docker-compose rm -f`

停止、削除、ネットワーク削除
`$ docker-compose down`
停止、削除、ネットワーク削除、イメージ削除
`$ docker-compose down --rmi all`

コンテナにログイン
`$ # docker-compose ps`
`$ docker-compose exec <サービス名> bash`

ログの確認
`$ docker-compose logs -f`

サービスの再起動
`$ docker-compose restart`


#あとがき
[こちら](https://qiita.com/etaroid/items/b1024c7d200a75b992fc)のかたの記事が秀逸です・・・。