ゼロから始めるDocker体験記

- [はじめに](#はじめに)
- [Dockerの導入](#dockerの導入)
  - [Dockerとはなんぞや](#dockerとはなんぞや)
  - [Dockerのインストール](#dockerのインストール)
- [Dockerを動かしてみよう](#dockerを動かしてみよう)
  - [Docker公式のイメージの取得](#docker公式のイメージの取得)
  - [コンテナを生成して起動してみよう](#コンテナを生成して起動してみよう)
  - [コンテナ内で作業してみる](#コンテナ内で作業してみる)
  - [コンテナを停止する](#コンテナを停止する)
  - [コンテナをイメージ化](#コンテナをイメージ化)
  - [コンテナを起動する](#コンテナを起動する)
  - [コンテナの削除](#コンテナの削除)
  - [イメージの削除](#イメージの削除)
- [参考サイト](#参考サイト)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983904/cb8023c3-26b7-0602-dd55-b9543b0f0e59.png)


# はじめに

以下のような条件をみたしておくと楽だけど、経験なくても問題なし

- 前提条件
    - Linuxを触ったことがある
    - WSL2を導入済み


Dockerを使えるようになると、仮想マシンと違い軽く実行環境を構築することが可能になる

# Dockerの導入
## Dockerとはなんぞや

かるーく仮想技術について説明

- 仮想技術には3種類存在する
  - `ホスト型`
  - `ハイパーバイザー型`
  - `コンテナ型`  


Dockerは`コンテナ型`を利用していることだけは覚えておく

- コンテナ型を使うメリット
  - 素早く仮想環境を作成、配布、実行できる
  - ほかのプラットフォームと同じ環境を構築しやすい
  - 動作が軽い

Linuxコマンドをがっつり使うため、コマンドを覚えていこう！

## Dockerのインストール

Dockerの公式サイトからダウンロードできる
[公式サイト](https://www.docker.com/products/docker-desktop/)

![公式サイト](https://i.imgur.com/PaW9uKP.png)

また、Windowsの場合、以下条件を満たせば[Docker for Windows](https://www.docker.com/products/docker-desktop/)をインストールするだけ！
- 64bit
- Windows 7以降
- IntelならVT-x, AMDならAMD-vがCPUでサポートされている
- Virtualizationを有効にしている


[Docker toolbox](https://docs.docker.com/desktop/)が使えるようになるはずなので、確認しておこう


なお、`docker`コマンドはDockerが起動していないと使えないため要注意！！

**重要！一部企業ではDocker Desktopは使用できないため、自分でインストールすること！** > [詳しくはこちら](https://studist.tech/how-to-properly-use-docker-in-your-company-d5b3bf901e56)

***

事前準備

- まずはDockerとWSLを用意
    - Docker DesktopがインストールされているならばDocker自体は大丈夫
    - dockerを操作するために、`WSL`を入れておくこと
        - Dcockerインストール方法は[こちら](https://kinsta.com/jp/blog/install-docker-ubuntu/)
    - また、Windows11であればコマンド一つで`WSL2`導入できるよ
        - Windows11でのインストール方法は[こちら](https://chigusa-web.com/blog/wsl2-win11/)

```
# dockerのバージョン確認
$ docker --version
$ docker version
```


また、以下コマンドにて動作状況を確認できる

```
# dockerの動作状況の確認
$ docker info
```

# Dockerを動かしてみよう
## Docker公式のイメージの取得

`search`コマンドでDockerの公式が提供しているイメージを取得できる

- Docker hub からイメージを取得できる([公式サイト](https://hub.docker.com/))

ためしにnginxイメージを検索する

```
# nginxの検索
$ docker search nginx
```


***

検索したら`pull`コマンドでイメージを取得する

```
# イメージの取得
$ docker pull nginx
```


***

イメージを取得出来たら表示してみよう

`images`コマンドで表示できる
```
# 取得したイメージの表示
$ docker images
```


## コンテナを生成して起動してみよう

nginxのログを出力するためのファイルを`mkdir`コマンドでホスト側に作成する

```
# ファイルの作成
$ mkdir -p nginx/log
```

作成したら、コンテナの生成と起動を同時に行う`run`コマンドを使う

```
$ docker run -d -p 80:80 -v $(pwd)/nginx/log:/var/log/nginx --name webserver nginx
```


起動が出来たら(http://localhost:80) にアクセスして確認してみよう

![コンテナ起動の確認](https://i.imgur.com/teipKET.png)

_>オプション解説_

- `-d`はバックグラウンド実行を指定

- `-p 80:80`はホスト側の80番ポートをコンテナ側の80番ポートに転送するように指定
  - p 8080:80 と指定すれば(http://localhost:8080)でアクセスできるようになる

- `-v`で`$(pwd)/nginx/log`をコンテナのディレクトリ`/var/log/nginx`としてマウント
  - なお(pwd)はUnixのシェル機能でカレントディレクトリに置き換えられる

- `--name webserver`は生成するコンテナに名前を付ける

- `nginx`は生成に利用するイメージの名前

- **本当は最後（イメージ名の後）に実行するコマンドを指定する点に注意！**
    - nginxだけ特殊だということを知っておこう

***

起動して、確認できたなら`cat`コマンドでログを確認してみよう

```
cat nginx/log/access.log
```


- なお、コンテナを削除した時にコンテナ内のファイルも消されてしまう点に注意
  - `-v`で保存場所を避難しておけばなんとかなるかも・・・？
  

## コンテナ内で作業してみる

`exec`コマンドでコンテナ内でコマンド実行できる

```
# コンテナのコマンドラインに移動
$ docker exec -it webserver /bin/bash
```


_>オプション解説_

- `exec` は指定したコンテナで指定したコマンドを実行
  - このコマンドで接続した場合、`eixt`してもコンテナは起動したままであることに注意！
  
- `-it`はコンテナ側のコマンドの入出力を手元のターミナルに接続

- `webserver`はコンテナ名

- `/bin/bash`が実行するコマンド


一度`exit`し、コマンドラインから抜ける

![コマンドラインから抜ける](https://i.imgur.com/vKfhemo.png)

***


`ps`コマンドで実行中のコンテナを確認できる

```
# 実行中のコンテナ確認
$ docker ps
```


## コンテナを停止する

`stop`コマンドを使って停止させる

```
# コンテナを停止させる
$ docker stop webserver
```

停止したら`ps`コマンドで確認してみよう


また`ps -a`で停止中のコンテナ含めてすべて表示可能


## コンテナをイメージ化

`commit`コマンドを使ってイメージ化することが可能

※ただし、イメージ化には命名規約が存在するため注意！

```
<Docker Hubのユーザ名>/イメージ名:[タグ名]
```

- なお`push`するとDocker hubに行きます
  - 今回はしない


```
# Docker imageの作成
$ docker commit webserver webserver:0.0
```


作成されたイメージは`images`コマンドで確認可能

```
# イメージの確認
$　docker images
```



**ただし`-v`で作成したボリュームは`commit`でのイメージ化対象外である点に注意！**

## コンテナを起動する

`run`コマンドでは生成と起動を同時に行うため、新しく作られてしまう

`start`コマンドで既存のコンテナを起動させる

```
# コンテナの起動
$ docker start webserver
```


起動できたかどうかは`ps`コマンドで確認する


## コンテナの削除

削除する前にコンテナを停止してあげよう(いきなり削除も可能)

`stop`コマンドで停止可能

```
# コンテナの停止
$ docker stop webserver
```


`rm`コマンドでコンテナを削除できる

```
# コンテナの削除
$ docker rm webserver
```



`ps -a`コマンドで削除されたか確認する


## イメージの削除

`rmi`コマンドでイメージの削除が可能

削除の際にタグを指定しなければならないが、省略した場合`latest`と同じになる

```
$ docker rmi webserver:0.0
$ docker rmi nginx
```


削除されたら`images`コマンドで確認



# 参考サイト

- Docker公式リファレンス
  - https://docs.docker.com/get-started/overview/
  
- Dockerのサーチ検索(実例あり)
  - http://www.memotansu.jp/docker/771/