dockerでwebサーバを起動する


<!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->

<!-- code_chunk_output -->
目次：
- [dockerコンテナを作成してみる](#dockerコンテナを作成してみる)
- [docker実行環境確認](#docker実行環境確認)
- [dockerを使用したwebサーバを構築する](#dockerを使用したwebサーバを構築する)
- [dockerイメージを使用してnginxを動かす](#dockerイメージを使用してnginxを動かす)

<!-- /code_chunk_output -->


##### dockerコンテナを作成してみる
ubuntuのイメージをもとにコンテナを作成・実行し、作成したコンテナでhelloworldを表示する

```
$ docker container run ubuntu:latest echo 'Hello World'
>>> Hello World
すでにubuntuのlatest(最新のイメージ)が入っていたのでリポジトリからとってくるようなことはせずただhello worldを出力した
```

##### docker実行環境確認

```
$ docker system info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
  compose: Docker Compose (Docker Inc., 2.0.0-beta.1)
  scan: Docker Scan (Docker Inc., v0.8.0)

Server:
 Containers: 11                                                          コンテナの数
  Running: 1
  Paused: 0
  Stopped: 10
 Images: 3
 Server Version: 20.10.6                                                          dockerのバージョン
 Storage Driver: overlay2                                                          ストレージドライバーの種類
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.4.72-microsoft-standard-WSL2
 Operating System: Docker Desktop
 OSType: linux                                                                 OSの種類
 Architecture: x86_64                                                          アーキテクチャ
 CPUs: 8
 Total Memory: 9.237GiB
 Name: docker-desktop
 ID: ODNB:5MX5:6OBG:42MC:VNCR:OJJF:TP3E:D7WM:FMVK:5YUU:AK6W:HGLE
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: No blkio throttle.read_bps_device support
WARNING: No blkio throttle.write_bps_device support
WARNING: No blkio throttle.read_iops_device support
WARNING: No blkio throttle.write_iops_device support
```

docker system df ディスク利用状況

```
$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          3         3         120.1MB   5.613MB (4%)
Containers      11        1         1.116kB   0B (0%)
Local Volumes   1         1         10.32MB   0B (0%)
Build Cache     32        0         396MB     396MB
```

##### dockerを使用したwebサーバを構築する
nginxを使用する

```
$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
f7ec5a41d630: Pull complete
aa1efa14b3bf: Extracting  2.654MB/26.58MB
b78b95af9b17: Download complete
c7d6bca2b8dc: Download complete
cf16cd8e71e0: Download complete
0241c68333ef: Download complete

nginxイメージがダウンロードされている。
$ docker image ls
REPOSITORY                    TAG       IMAGE ID       CREATED       SIZE
docker101tutorial             latest    f108ba0cc6df   2 hours ago   28MB
meri100ht/docker101tutorial   latest    f108ba0cc6df   2 hours ago   28MB
ubuntu                        latest    7e0aa2d69a15   2 weeks ago   72.7MB
alpine/git                    latest    c99c7d810bc1   3 weeks ago   25.1MB
nginx                         latest    62d49f9bab67   4 weeks ago   133MB

```

##### dockerイメージを使用してnginxを動かす
使用するイメージはnginx

```
imagenginxを使ってwebserverという名前のdockerコンテナを起動。ブラウザからHTTP(80番ポート)でのアクセスを許可するために-pオプションでコンテナからの転送を許可している

-p 80:80 -ホストのポート80をコンテナのポート80にマップします

$ docker container run --name webserver -d -p 80:80 nginx
789a5e28f3d3199f2b59482f660c974fdb59455729dab113491786caeaf1c26f
docker: Error response from daemon: driver failed programming external connectivity on endpoint webserver (499d03f5142f3b1f78970f8bf05b356afceff22744feab8a0d63c7c23d717c93): Bind for 0.0.0.0:80 failed: port is already allocated.

$ docker container ps
CONTAINER ID   IMAGE               COMMAND                  CREATED       STATUS       PORTS                               NAMES
01419f74cb77   docker101tutorial   "/docker-entrypoint.…"   2 hours ago   Up 2 hours   0.0.0.0:80->80/tcp, :::80->80/tcp   docker-tutorial

さっきのチュートリアルで80番ポートを開けていたので、このコンテナを停止すればnginxでアクセスできそう

$ docker container run --name webserver -d -p 80:80 nginx
docker: Error response from daemon: Conflict. The container name "/webserver" is already in use by container "789a5e28f3d3199f2b59482f660c974fdb59455729dab113491786caeaf1c26f". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

webserverという名前でコンテナを作ってしまったので名前が重複している。

新しい名前のコンテナを作成
LAPTOP-XXXXXX MINGW64 /c/dockerlesson
$ docker container run --name webserver1 -d -p 80:80 nginx
8cfddf61720d3c84a7695e903ef0ed1fa1d1477e2b8af5bdbf1289244eedd53f

ちゃんと動いてるっぽい
$ docker container ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                               NAMES
8cfddf61720d   nginx     "/docker-entrypoint.…"   34 seconds ago   Up 31 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   webserver1


コンテナを停止

LAPTOP-XXXXXX MINGW64 /c/dockerlesson
$ docker stop webserver1
webserver1
```

アクセスできなくなっていることが分かる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/01d1504e-17e8-1553-48f2-e9f7a6ed34a4.png)

```
コンテナを再起動

LAPTOP-XXXXXX MINGW64 /c/dockerlesson
$ docker start webserver1
webserver1
```

繋がっていることがわかる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/0da24648-b156-8238-0582-557f68ec7747.png)