Docker勉強メモ① DockerインストールからHelloWorld


## はじめに

重い腰をあげて前から興味があったDockerの勉強をはじめました。これはそのメモです。
こちらのサイトを参考にハンズオン形式で始めていきます。

Docker勉強メモ

- [Docker勉強メモ① DockerインストールからHelloWorld](https://qiita.com/zgw426/items/c0687bdfd3c58eaaac33) **←ココ**
- [Docker勉強メモ② Dockerイメージ作ってみる](https://qiita.com/zgw426/items/b480ae298e1f92cf1418)
- [Docker勉強メモ③ Dockerfileを作ってDockerイメージ作成からコンテナ起動までやってみる](https://qiita.com/zgw426/items/bea786da9128af30937f)
- [Docker勉強メモ④ コンテナ間通信](https://qiita.com/zgw426/items/bb42f6bd17707de354b9)
- [Docker勉強メモ⑤ ネットワーク通信](https://qiita.com/zgw426/items/9a76f48edb6f7e34dffe)


参考

- [Docker入門（第一回）～Dockerとは何か、何が良いのか～](https://knowledge.sakura.ad.jp/13265/)
- [Docker入門（第二回）～Dockerセットアップ、コンテナ起動～](https://knowledge.sakura.ad.jp/13795/)
- [Amazon Linux2 にdockerをインストールしようとしたらはまった話](https://qiita.com/ajitator/items/493746dc45e200593b49)

## 環境

Dockerを触る環境はAWSのEC2を使いました。
※AWS ECSを使う記事はこっち → [AWS ECR/ECS 勉強メモ① Dockerコンテナ起動](https://qiita.com/zgw426/items/00dd61edf48a4a426ecf)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/9bef0ad2-702f-fc17-f984-bd1fb5d54d1f.png)

EC2作成時のAMIイメージは ami-045f38c93733dd48d です。
DockerインストールだけLinux2 (amzn2-ami-hvm-2.0.20200304.0-x86_64-gp2 (ami-052652af12b58691f))も使います。

## 1.Docker入門（第一回）メモ

#### 1-1.Dockerエンジンをインストールする

※ root権限が必要なところは、sudoを使ってます。

###### 1-1-1.CentOS7 ami-045f38c93733dd48d の場合

Dockerを使うにはDockerエンジンが必要らしいのでインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/1141a317-b00c-1e5f-ce7f-9c377d479d8c.png)

```console
$ yum-config-manager --enable Extra
$ yum install container-selinux
$ yum install -y yum-utils device-mapper-persistent-data lvm2
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

docker-ce.repoが追加されたか確認

```console
ll /etc/yum.repos.d/
```

Dockerインストール

```console
$ yum install docker-ce
```

Dockerインストールされたか確認

```console
$ yum list installed | grep docker-ce
```

こんな感じになるとインストール成功

```console
[centos@ip-172-31-7-38 ~]$ yum list installed | grep docker-ce
containerd.io.x86_64                  1.2.13-3.1.el7           @docker-ce-stable
docker-ce.x86_64                      3:19.03.7-3.el7          @docker-ce-stable
docker-ce-cli.x86_64                  1:19.03.7-3.el7          @docker-ce-stable
```

ユーザー `centos` が、sudoなくてもdockerコマンド使えるようにする。
以下コマンド実行したら設定反映のためセッションを繋ぎなおす(切断→接続)

```console
$ sudo usermod -a -G docker centos
$ cat /etc/group | grep docker
```


###### 1-1-2.amzn2-ami-hvm-2.0.20200304.0-x86_64-gp2 (ami-052652af12b58691f) の場合

```
$ yum update -y
$ amazon-linux-extras install docker
$ service docker start
$ ps -ef |grep docker
```

#### 1-2.Docketサービスを起動

Dockerサービスを起動

```console
$ systemctl start docker
```

Dockerサービス起動しているか確認

```console
$ systemctl status docker
```

こんな感じになると成功

```console
[centos@ip-XXX-XXX-XXX-XXX ~]$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-03-05 23:01:50 UTC; 6s ago
     Docs: https://docs.docker.com
 Main PID: 4219 (dockerd)
    Tasks: 8
   Memory: 42.7M
   CGroup: /system.slice/docker.service
           └─4219 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.476420738Z" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.476435398Z" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/contai... module=grpc
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.476445516Z" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.512172262Z" level=info msg="Loading containers: start."
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.696125954Z" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Da... IP address"
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.756440317Z" level=info msg="Loading containers: done."
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.770477383Z" level=info msg="Docker daemon" commit=7141c199a2 graphdriver(s)=overlay2 version=19.03.7
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.770631125Z" level=info msg="Daemon has completed initialization"
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal dockerd[4219]: time="2020-03-05T23:01:50.800711711Z" level=info msg="API listen on /var/run/docker.sock"
Mar 05 23:01:50 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
```

※余談※ Dockerサービスの自動起動設定

```console
sudo systemctl enable docker
```

－ーー　以上でDockerを触る環境が作れた。　－－－

![line.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/891d5568-e8d3-3bdc-2ddd-a8caf357020c.png)


## 2.Dockerコンテナ実行してみる

#### 2-1.挨拶する(hello-world)

新しいことは挨拶から始まる。Hello Worldしてみる。

```console
$ docker run hello-world
```

実行結果はのせないけど、『Hello from Docker!』とかいろいろ文字がドバっと出たら成功

動いたらもう不要なので削除する。DockerコンテナとDockerイメージの2つを削除。


#### 2-2.Dockerコンテナを削除

Dockerコンテナ削除コマンド

```console
$ docker rm <コンテナ名 or CONTAINER ID>
```

実行例

```console
sudo docker rm heuristic_wozniak
sudo docker rm 1740d7b07a8a
```

コンテナ名,CONTAINER IDの確認方法

```console
[centos@ip-172-31-3-246 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
1740d7b07a8a        hello-world         "/hello"            About a minute ago   Exited (0) About a minute ago                       heuristic_wozniak
```

- コンテナ名　→　NAMES (今回は`heuristic_wozniak`)
- CONTAINER ID　→　CONTAINER ID (今回は`1740d7b07a8a`)


#### 2-3.Dockerイメージを削除

Dockerイメージ削除コマンド

```console
$ docker rmi <Dockerイメージ名 or IMAGE ID>
```

イメージ名,IMAGE IDの確認方法

```console
[centos@ip-172-31-3-246 ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        14 months ago       1.84kB
```

- イメージ名　→　REPOSITORY (今回は`hello-world`)
- IMAGE ID　→　IMAGE ID (今回は`fce289e99eb9`)


これで、Dockerへの挨拶と後片付けが完了

## 3.DockerコンテナでWebサイト構築

Docker Hubに公開されているNginxのDocketイメージを使いWebサーバーを立てる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/dc0dea04-1766-ca9b-9acb-cfbe472826f3.png)


#### 3-1.Webサーバー構築

Dockerイメージ取得

```console
$ docker pull nginx
```

Dockerコンテナ起動

```console
$ docker run -d --name nginx-container -p 8181:80 nginx
```

オプションの意味
　-d バックグラウンド実行
　-name コンテナ名
　-p <ホスト側のポート>:<コンテナ側のポート>


起動したままになっている

```console
[centos@ip-172-31-3-246 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
a0672eaa1c9d        nginx               "nginx -g 'daemon of…"   5 minutes ago       Up 5 minutes        0.0.0.0:8181->80/tcp   nginx-container
```

これだけでWebサーバーができた。Docker便利！
`http://{ホストのIP}:8181/` でアクセスでWebサイトにアクセスできる。確認できたら後片付けする。


#### 3-2.後片付け

コンテナ停止

```console
sudo docker stop nginx-container
```

コンテナ停止時の実行ログ

```console
[centos@ip-172-31-3-246 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
a0672eaa1c9d        nginx               "nginx -g 'daemon of…"   5 minutes ago       Up 5 minutes        0.0.0.0:8181->80/tcp   nginx-container
[centos@ip-172-31-3-246 ~]$ sudo docker stop nginx-container
nginx-container
[centos@ip-172-31-3-246 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
a0672eaa1c9d        nginx               "nginx -g 'daemon of…"   7 minutes ago       Exited (0) 6 seconds ago                       nginx-container
```


Dockerコンテナ削除

```console
$ docker rm a0672eaa1c9d
```

Dockerイメージ削除

```console
$ docker rmi nginx
```


## おまけ:Dockerコマンドメモ

|コマンド|概要|
|:----|:---|
|systemctl start docker|Dockerサービス起動|
|systemctl status docker|Dockerサービス起動確認|
|docker info|Dockerの状態確認|
|docker images|初期状態の確認|
|docker ps -a|ローカル環境のDockerコンテナの一覧を確認|
|systemctl enable docker|OS起動時にDockerサービス起動|
|docker ps -a|コンテナ一覧|
|docker rm <コンテナ名 or CONTAINER ID>|コンテナイメージ削除|
|docker images|Dockerイメージ一覧|
|docker rmi <コンテナ名 or CONTAINER ID>|Dockerイメージ削除|
|docker pull <イメージ名>|Dockerイメージ取得|
|docker run ・・・|コンテナ起動|
|docker stop <コンテナ名 or CONTAINER ID>|コンテナ停止|
|docker cp <ホスト側のファイル> <コンテナ名>:<コピー先ディレクトリ>|ホスト→コンテナへデータコピー|
|docker cp <コンテナ名>:<コピー元ファイル> <ホストのコピー先ディレクトリ>|コンテナ→ホストへデータコピー|


docker run オプション

| オプション | 概要 |
|:--|:----|
| -d | バックグラウンド実行 |
| -name | コンテナ名|
| -p  | <ホスト側のポート>:<コンテナ側のポート> |
|-v||
|--link|コンテナ間通信　※レガシー機能|