もう逃げない。基礎から学ぶDocker入門 / Dockerの基本操作（イメージの作成, コンテナの起動, 停止, 削除）（2/9）

## はじめに

今まで、全然理解できていなくて逃げてたDockerに関して、しっかり理解していこうと思います。

https://www.docker.com/

コレまで、便利なんだろうなと思いながらも、逃げてました。

なので、開発環境では使いこなせるスキルにまでは理解したいと思います。

あと、暗記してたDockerコマンドを１つ１つ理解していきます。

以下のような順番で勉強していきます。

- [Dockerの概要（1/9）](https://qiita.com/ryosuketter/items/d7833182dced67713d27)
- [Dockerの基本操作（イメージの作成, コンテナの起動, 停止, 削除）（2/9）
](https://qiita.com/ryosuketter/items/c53352f1143366d8b9a9) :point_left_tone1: 今ここ
- [Dockerの基本操作（ログの出力, コンテナの中でプロセスを実行する方法, 使用していない Docker オブジェクトの削除）（3/9）](https://qiita.com/ryosuketter/items/5fd73b7311175a691dfe)
- [Dockerfileを使用したサーバー構築（座学編）（4/9）](https://qiita.com/ryosuketter/items/d9c3420be7da586225e8)
- [Dockerfileを使用したサーバー構築（実践編）（5/9）](https://qiita.com/ryosuketter/items/716a4c5e49795d494600)
- [Docker Composeの概要（座学編）（6/9）](https://qiita.com/ryosuketter/items/104a4eb38f8824eb6de9)
- [Docker Composeのよく使う基本操作（7/9）](https://qiita.com/ryosuketter/items/8bbd2c60392f443cfe23)
- [Docker Composeを使ってRailsの環境を構築する（8/9）](https://qiita.com/ryosuketter/items/91cd107794c1cbe358c6)
- [Docker上に構築したRailsをHeroku（本番環境）にデプロイ（公開）する（9/9）](https://qiita.com/ryosuketter/items/e3e68ce6ec572dc8905e)

## Dockerのイメージとコンテナの基本操作

アプリケーションを作成して、Dockerで実行する基本的な流れは大まかに以下になります

![IMG_AF56A8F04EEB-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14191/4e68f99c-20e1-4b73-7a27-93dc00a6044b.jpeg)

- アプリケーションコードの用意
- Dockerfileの用意
- 上記2つをDockerイメージの雛形として、Dockerイメージを作成
- Dockerイメージからコンテナを作成し、起動

この流れに沿って、やっていきます。

### アプリケーションコードの用意

RubyでWebサーバを用意して、TOPページにアクセスしたら`Hello`と出力するやつを作ります。

worikng directory

```
practice_docker
├ Dockerfile
└ main.rb
```

Ruby で簡易的なwebサーバーを作成する

```rb
require 'webrick'

# サーバーの初期設定
server = WEBrick::HTTPServer.new(
  DocumentRoot: './',
  BindAddress: '0.0.0.0',
  Port: 8000
)

# TopページアクセスしたらHelloを返す設定
server.mount_proc('/') do |req, res|
  res.body = 'hello'
end

# サーバーの起動
server.start
```

簡易的な内容なのでツッコミ不要です。

### Dockerファイルの用意

詳しくは説明しますが、Dockerファイルとはイメージの雛形になり、それを作ります。

Dockerファイルには主に以下の内容を書いていきます。

- ベースとなるイメージ
- ライブラリ
- アプリケーションコード

この内容を元に、イメージを作成します。

```dockerfile
FROM ruby:2.7

RUN mkdir /var/www
COPY main.rb /var/www

CMD ["ruby", "/var/www/main.rb"]
```

- `FROM`は　rubyのバージョンは2.7と指定
- `RUN`は コマンドの実行、実際に`RUN`の右側に書いてあるのは読んで字の如くですね
- `COPY`は `main.rb` を `/var/www`に置くよ、という内容
- `CMD`は Dockerイメージを作成・起動した時の実行するコマンドの指定
    - 今回は、実態ファイル`main.rb`を実行せよという意味です

### イメージの作成

これで、アプリケーションコードと、Dockerファイルというイメージを作成するための下準備が整いました。

ここからは、イメージを作成していきましょう。

基本的なコマンドは`docker image build`です。

```bash
docker image build　-t sample/webrick:latest .
```

オプションの `-t` は今回、`sample/webrick:latest`という名前をつけますという意味

```
名前はなんでもいい/今回はwebrick使うので安易な名前だけどwebrickとした/最新バージョンなのでlatest
sample/webrick:latest
```

参考

https://docs.docker.jp/linux/step_six.html

`.`はカレントディレクトリのDockerファイルを参照するということをやってます

それでは、イメージを作成していきましょう。

```bash
(base) ~/P/practice_docker ❯❯❯ docker image build -t sample/webrick:latest .

[+] Building 67.6s (8/8) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                       0.1s
 => => transferring dockerfile: 131B                                                                                                                                                                       0.0s
 => [internal] load .dockerignore                                                                                                                                                                          0.0s
 => => transferring context: 2B                                                                                                                                                                            0.0s
 => [internal] load metadata for docker.io/library/ruby:2.7                                                                                                                                                3.3s
 => [1/3] FROM docker.io/library/ruby:2.7@sha256:29cb031943ce6279ad88af96a29f2843fc37e33c705b6d511e23326e8cad1592                                                                                         63.1s
 => => resolve docker.io/library/ruby:2.7@sha256:29cb031943ce6279ad88af96a29f2843fc37e33c705b6d511e23326e8cad1592                                                                                          0.0s
 => => sha256:d2d425f2fea63cf7390882a28ba32f877d2e19dd38592e978cc7643ed388afb9 7.29kB / 7.29kB                                                                                                             0.0s
 => => sha256:2756ef5f69a5190f4308619e0f446d95f5515eef4a814dbad0bcebbbbc7b25a8 5.15MB / 5.15MB                                                                                                             3.2s
 => => sha256:29cb031943ce6279ad88af96a29f2843fc37e33c705b6d511e23326e8cad1592 1.86kB / 1.86kB                                                                                                             0.0s
 => => sha256:27602366229f69bdfad44d27db27a85d6da4ae3a2a43dbabe8b0dd9eb9f41267 2.00kB / 2.00kB                                                                                                             0.0s
 => => sha256:955615a668ce169f8a1443fc6b6e6215f43fe0babfb4790712a2d3171f34d366 54.93MB / 54.93MB                                                                                                          17.1s
 => => sha256:911ea9f2bd51e53a455297e0631e18a72a86d7e2c8e1807176e80f991bde5d64 10.87MB / 10.87MB                                                                                                           6.1s
 => => sha256:27b0a22ee906271a6ce9ddd1754fdd7d3b59078e0b57b6cc054c7ed7ac301587 54.57MB / 54.57MB                                                                                                          22.9s
 => => sha256:8584d51a9262f9a3a436dea09ba40fa50f85802018f9bd299eee1bf538481077 196.45MB / 196.45MB                                                                                                        33.6s
 => => sha256:4cc0225b12dba7873a1c73379908bbb2c66514129663f6e5f022ee4dff6ba799 198B / 198B                                                                                                                17.6s
 => => sha256:96ae2b648fae87777d3b8700a23b9bb506fbf0bf8bc7642857a31a3df9898194 14.51MB / 14.51MB                                                                                                          22.7s
 => => extracting sha256:955615a668ce169f8a1443fc6b6e6215f43fe0babfb4790712a2d3171f34d366                                                                                                                 11.6s
 => => sha256:07a5886d0a5ff026d91e07f7670ba6398fe6a266b301a5ebf1a7a40f78bebf76 173B / 173B                                                                                                                23.9s
 => => extracting sha256:2756ef5f69a5190f4308619e0f446d95f5515eef4a814dbad0bcebbbbc7b25a8                                                                                                                  2.1s
 => => extracting sha256:911ea9f2bd51e53a455297e0631e18a72a86d7e2c8e1807176e80f991bde5d64                                                                                                                  0.6s
 => => extracting sha256:27b0a22ee906271a6ce9ddd1754fdd7d3b59078e0b57b6cc054c7ed7ac301587                                                                                                                  6.3s
 => => extracting sha256:8584d51a9262f9a3a436dea09ba40fa50f85802018f9bd299eee1bf538481077                                                                                                                 19.4s
 => => extracting sha256:4cc0225b12dba7873a1c73379908bbb2c66514129663f6e5f022ee4dff6ba799                                                                                                                  0.0s
 => => extracting sha256:96ae2b648fae87777d3b8700a23b9bb506fbf0bf8bc7642857a31a3df9898194                                                                                                                  1.5s
 => => extracting sha256:07a5886d0a5ff026d91e07f7670ba6398fe6a266b301a5ebf1a7a40f78bebf76                                                                                                                  0.0s
 => [internal] load build context                                                                                                                                                                          0.0s
 => => transferring context: 338B                                                                                                                                                                          0.0s
 => [2/3] RUN mkdir /var/www                                                                                                                                                                               0.7s
 => [3/3] COPY main.rb /var/www                                                                                                                                                                            0.1s
 => exporting to image                                                                                                                                                                                     0.1s
 => => exporting layers                                                                                                                                                                                    0.0s
 => => writing image sha256:a1136785b9176e2a25e7a3a206745ce19cdd5d6c97ae7f53884f7fa5181428e6                                                                                                               0.0s
 => => naming to docker.io/sample/webrick:latest
```

イメージが作れたことの確認コマンドは以下

```bash
docker image ls

REPOSITORY       TAG       IMAGE ID       CREATED         SIZE
sample/webrick   latest    a1136785b917   2 minutes ago   864MB
hello-world      latest    d1165f221234   6 months ago    13.3kB
```

今存在しているイメージのリストが出力されました。

ちゃんと名前つけた`sample/webrick`がありましたね。

うまくイメージが作成できたっぽいですね。

### イメージからコンテナを作成し、起動させる

イメージ作成できたので、今度はイメージからコンテナを作成をして、起動させます。

基本的なコマンドは`docker container run`です。

```bash
docker container run -p 8000:8000 --name webrick sample/webrick:latest
```

作成と起動をセットでやりました。

`-p`はportの指定です。

`-p 8000:8000`はローカルの8000番ポートを、dockerの8000番ポートに接続させています。

ポートはアプリケーションの宛先的なやつですね。

dockerは、1つの独立した環境なので、外部のローカルPCから何かする場合は、お互いのポート番号の指定が必要になります。

左側は、なんでもいいのですが、

右側のdockerのポートは`main.rb`でサーバの設定で`port: 8000`を指定したので右側は8000を指定する必要があります。

`--name xxx`コンテナに名前をつけています。コンテナに名前をつけると、後々、操作する時に楽なので名前をつけています。

最後はイメージ名の指定です。

なんのイメージからコンテナを作成するかの指定です。

今回のイメージは`sample/webrick:latest`ですね。

```bash
docker container run -p 8000:8000 --name webrick sample/webrick:latest

[2021-09-23 14:18:48] INFO  WEBrick 1.6.1
[2021-09-23 14:18:48] INFO  ruby 2.7.4 (2021-07-07) [x86_64-linux]
[2021-09-23 14:18:48] INFO  WEBrick::HTTPServer#start: pid=1 port=8000
```

おそらくコンテナが立ち上がった（サーバが立ち上がった）ぽい。

今回は、webサーバ作成したので port: 8000 にアクセスして確かめましょう。

requestのbodyにhello的な文言仕込んだのでそれが出力されればOKです。

```
http://localhost:8000/
```

で、ブラウザから `hello` と出力されればOKです。

:thumbsup:

### コンテナの停止

起動中のコンテナを確認します。

```bash
docker container ls  
                                                                                                                                                    
CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS          PORTS                                       NAMES
1536301bd55d   sample/webrick:latest   "ruby /var/www/main.…"   8 minutes ago   Up 13 seconds   0.0.0.0:8000->8000/tcp, :::8000->8000/tcp   webrick
```

おそらく、`sample/webrick:latest`のサーバが立ち上がってるというか、コンテナ（プロセス）が実行中だと思うので、それを`ctrl + c`で起動中のプロセスを停止できます。

もしくは、以下のコマンドで停止できます。

```bash
docker container stop webrick
```

今度は、`docker container ls`しても具体的なコンテナは出てきませんね。

### コンテナの削除

以下のコマンドでコンテナの削除ができます。

```bash
docker container rm webrick
```

消えましたね。

以上です。

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103