雑に知ってしまったDockerを知り直す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278872/4c205179-9edc-05c2-52aa-25690be74cd3.png)
かわいい。Moby Dockという名前だそうです。
（くん付けかちゃん付けかで悩んで性別調べたけど出てこなかったので、ご存知の方いたらこっそり教えて下さい）
# TL;DR
- Dockerの存在は知っていて、コンテナ起動の方法なんかも知っている
- 自分でイメージ作成したことが無く、ちゃんとしたデバッグの手法とか知らないので改めて一から学ぶ 
- k8sとかもそのうちやる 

# Dockerとは
星の数ほど書かれた見出しではあるものの、単語が多すぎて？？？ってよくなります。
解説記事眺めていて登場頻度が高めだなと感じた単語だけピックアップ。（適宜更新予定）

- 仮想化  
  ホスト型/ハイパーバイザ型/コンテナ型などの方式があり、Dockerはコンテナ型。他の方式との違いについては実際に触っていないのでハッキリとは言えず。解説記事を鵜呑みにするなら
  - 構成のコード化。コードなので共有するためのファイルが軽い
  - 処理/起動が早い
  - プロセス:コンテナの比率は基本的に1:1  
    DBサーバとAPIサーバが必要なアプリケーションを構成する場合、他の方式だと一つの仮想環境にまとめることが多いが、コンテナ型の場合は1つのコンテナに対して1つのプロセス。よってコンテナを2つ立ち上げる。サービスの規模次第とも思うので例外はありそうだけど、これがベストプラクティスらしい。
- ホストマシン  
  Dockerをインストールしたマシン。今この記事を書いているMacbookのこと。
- Dockerエンジン  
  Dockerのコア。Dockerそのものっていう認識。
- コンテナ  
  超頻出。センター英語で言うとas long asぐらい頻出。うまく言語化するのが難しいけどプロセスの実行環境みたいな。ホストマシンからは分離された独立した環境。
- Dockerイメージ  
  これも超頻出。コンテナの設計図、なんて解説されたりもしているけど、調べてくうちに設計図兼ファイル群みたいなイメージなのかなと感じた。レイヤ構造になっていて理解するにはLinuxの知識がもっと必要だと感じたので要勉強。
- Docker Hub  
  大量のDockerイメージが保存されたクラウド。  
  プログラミング言語の実行環境や、DBサーバWebサーバのイメージなどが置いてあり、ここからイメージを引っ張ってくればあっというまに環境ができあがる。


# インストール
※今回もmacでやってます

https://hub.docker.com/ からdmgファイル落としてきていつも通りのムーブでインストールしましょう。

前は特にアカウントとか要らなかった気がするけど、今は会員登録してダウンロードするらしい。  
ちゃんと探せば会員登録しなくても落とせるリンクありそう。  

brewをインストールしてあるなら以下でいけるはず

```
$ brew install docker
$ brew cask install docker
```

# 使ってみる
今回はnginxサーバ立ち上げてみました。

```
$ docker run [Dockerイメージ名]
-d バックグラウンド起動 
-p ポートフォワード設定 
--name コンテナに名前をつける 

$ docker run -d -p 80:80 --name webserver nginx
Unable to find image 'nginx:latest' locally # nginxっていう名前のイメージをまずローカルで探してから、Docker Hubを見に行く
latest: Pulling from library/nginx
bc51dd8edc1b: Pull complete 
66ba67045f57: Pull complete
bf317aa10aa5: Pull complete
Digest: sha256:ad5552c786f128e389a0263104ae39f3d3c7895579d45ae716f528185b36bc6f
Status: Downloaded newer image for nginx:latest
0d5655a34ba94e4cecad342f78e943830ea452f196ce5017464547266d6658b8
```

http://localhost:80 へアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278872/3b5028e5-5e84-dba8-9c53-377d8bf2ad70.png)


お手軽すぎてYABAI


- 立ち上げたコンテナ情報やイメージ情報確認

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              2073e0bcb60e        5 days ago          127MB

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
0d5655a34ba9        nginx               "nginx -g 'daemon of…"   8 minutes ago       Up 8 minutes        0.0.0.0:80->80/tcp   webserver
```

- コンテナへ接続

```
$ docker exec -it webserver(コンテナ名) /bin/bash

root@0d5655a34ba9:/# hostname
0d5655a34ba9

# ちゃんとnginxの設定ファイルもある
root@0d5655a34ba9:/# cat /etc/nginx/nginx.conf 
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
```

- コンテナ停止

```
$ docker stop webserver
webserver

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

# コンテナ停止しただけなので、イメージは残ってる
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              2073e0bcb60e        5 days ago          127MB

```

うんうん。


# おわり
nginxはユーザ設定やパフォーマンスを少しいじったことがあるだけでインストールすらしたことありません。よくわからんけどなんか動いてる、っていうのはまさにこのこと。楽しいけど良し悪しあるなぁというのが本音です。（せっかくなのでnginxの勉強もします）

nginxコンテナを起動したわけですが、ここからの道のりはまだまだ長く。。
どうやってこの環境にアプリケーション持ち込むの？とか、
自分の好きな設定をいれたDockerイメージを作成したりとか、
コンテナはそれぞれが隔離された環境なのでコンテナ同士が通信できるようにしたりとか。
知らないといけないことは山積みなので定期的にインプット/アウトプットしていきます。


# 今回の学び
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278872/4c4b32b9-8fae-af12-0ffc-a83a3b4815a6.png)


テザリングでのpullのし過ぎには気をつけましょう。