Dockerを使って環境構築をする

# この記事の概要

Dockerを用いた環境構築について記載する

# Dockerのインストール

以下のサイトからDockerをインストールする

https://www.docker.com/get-started/

※自分はM1 Macだったので、Apple Chipのものをインストールしました。

# Dockerの設定とインストール確認

## インストールしたアプリを開いて、規約に同意する

規約に同意する

## Dockerのインストール確認

```
// dockernのバージョン確認
$ docker version
// hello-worldしてみる
$ docker run hello-world

Hello from Docker!と返ってくる
```

# Dockerの勉強1

https://docs.docker.jp/get-started/toc.html

## コマンド実行

```terminal
// docker runコマンド
$ docker run -d -p 80:80 docker/getting-started
```

# Dockerの勉強2

## アプリのダウンロード

zipまたはpull

https://github.com/docker/getting-started

## Dockerfileの記述・実行

```app/Dockerfile.
# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
```

```terminal
$ cd get***/app
// ビルド(コンテナイメージの作成)
$ docker build -t getting-started .
```

## アプリコンテナの起動

```terminal
// コンテナの起動
$ docker run -dp 3000:3000 getting-started
```

http://localhost:3000/

# dockerの勉強3

## ソースコードの変更

```src/static/js/app.js
<p className="text-center">No items yet! Add one above!</p>
→<p className="text-center">You have no todo items yet! Add one above!</p>
```

## 古いコンテナを削除してからdockerのコンテナ作成

```terminal
// コンテナのIDを調べる
$ docker ps
// コンテナを停止する
$ docker stop <コンテナID>
// コンテナ削除
$ docker rm <コンテナID>
// コンテナ作成
app $ docker build -t getting-started .
$ docker run -dp 3000:3000 getting-started

// コンテナの強制削除
$ docker rm -f <コンテナID>
```

# dockerの勉強4

## dockerイメージの共有

https://hub.docker.com/

# dockerの勉強5

## コンテナのファイルシステム

コンテナはそれ自身が「スクラッチ領域」を持っている

```terminal
// ubuntuコンテナを起動して、/data.txtという名前のファイルを作成し、1から10000までのランダムな数を入れる
$ docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
```

dockerDesktopにてubuntuコンテナをCLIで開く

```ubuntu/terminal.
// /data.txtのファイル内容を確認
$ cat /data.txt
```

```terminal
// /data.txtのファイル内容を確認(docker execを使うVer.)
$ docker exec <コンテナID> cat /data.txt
```

確認後、他のubuntuコンテナを起動する

```terminal
// 他のコンテナの起動で、配下の/data.txtを見てみる
$ docker run -it ubuntu ls /
→/data.txtがない
```

## ボリュームを使う

ボリュームを使うことで、
コンテナ内で指定したファイルシステムのパスを、ホストマシン上へと接続できる

このtodoアプリが自身のデータを保存するのは、コンテナ用ファイルシステム内で
/etc/todo/todo.dbにあるSQLite Database野中。

ボリュームを作成し、データを保管するディレクトリに取り付ける（マウントするという）と、
データを保持することができる
つまり、コンテナが書き出すtodo.dbファイルは、ホスト上のボリュームにおいておけば保持できる

名前付きボリュームは、単なる入れ物

```terminal
// ボリューム作成
$ docker volume create todo-db
// コンテナ削除
$ docker rm -f <コンテナID>
// コンテナ起動時にボリュームをマウントする
$ docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
// コンテナ削除
$ docker rm -f <コンテナID>
// コンテナ起動時にボリュームをマウントする
$ docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
```

データは残っている

## ボリュームを深堀り

```terminal
// データをDockerが実際に保存するところを確認する（MountPoint）
$ docker volume inspect todo-db
```

# dockerの勉強6

## 名前付きボリュームとバインドマウントの比較

|  |名前付きボリューム|バインドマウント|
|--|--|--|
|ホスト上の場所|Docker が選択|自分で管理|
|マウント例（ -v を使用）|my-volume:/usr/local/data|/path/to/data:/usr/local/data|
|コンテナの内容に新しいボリュームを加える|はい|いいえ|
|ボリューム ドライバのサポート|はい|いいえ|

# dockerの勉強7

## 複数コンテナのアプリを連携する（コンテナのネットワーク機能）

```terminal
// ネットワークの作成
$ docker network create todo-app
```

## MySQLの起動・接続

```terminal
// MySQLコンテナの起動（Apple　Silliconの場合）
$ docker run -d \
    --network todo-app --network-alias mysql \
    --platform "linux/amd64" \
    -v todo-mysql-data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=secret \
    -e MYSQL_DATABASE=todos \
    mysql:5.7

// MySQLに接続
$ docker exec -it <mysqlのコンテナID> mysql -u root -p
$ passwordは、secret

// MySQLでデータベース一覧を表示
mysql> SHOW DATABASES; 
```

## MySQLとの連携

https://github.com/nicolaka/netshoot

```terminal
// nicolaka/netshootイメージを使う新しいコンテナ起動
＄ docker run -it --network todo-app nicolaka/netshoot

// DNSツールのdigコマンドを使い、MySQLのIPアドレスを調べる
$ dig mysql
```

## MySQLとアプリを動かす

```terminal
```