初めてのDocker

# 初めてのDocker

### Dockerの機能と用語説明
|  |    |
| :--: | :--: |
| Dockerコンテナ | システムの他の部分に影響を与えることなく、アプリケーションを実行できる仮想空間のような隔離された環境で、すべてのコードと依存関係がパッケージ化されている。|					
| Dockerイメージ | アプリケーションの実行に必要なソースコード、依存関係、ツールを含んだパッケージで、コンテナ作成時に指示を出す読み取り専用のファイル。 |
| Dockerfile | Dockerイメージを構成するテキストデータで、Dockerfileを読み込むことでDockerイメージが構築される。 |
| Docker Compose | 複数のコンテナを１度に操作することができるツール。Docker Composeの設定ファイルであるdocker-compose.ymlファイルは複数のコンテナ間の関係や環境変数などを記述する。|
| Docker Hub | Dockerイメージの共有サービス。Dockerイメージ（Dockerfile）が公開されており、Docker Hubから任意のイメージ（Dockerfile）を取得できる。自身で作成したイメージ（Dockerfile）をリポジトリにアップし、他ユーザーと共有することも可能。 |

### Dockerコマンド（基本）
|  |  | |
| :--: | :--: | :--: |
| build | DockerfileからDockerイメージを作成する | ```bash docker image build [オプション] Dockerfileのパス ``` |
| run | Dockerイメージを使いDockerコンテナを起動（作成）する | ```bashdocker container run [オプション] imagename ``` |
| start | 作成済（停止中）のコンテナを起動する | ```bash docker container start [オプション] containername``` |
| stop | Dockerコンテナを停止する | ```bash docker container stop [オプション] containername ```
| rm | 停止中のコンテナを削除する | ```bash docker container rm [オプション] containername``` |
| restart | コンテナを再起動する | ```bash docker container restart [オプション] containername``` | 
| exec | 起動中のコンテナ内でコマンドを実行する | ```bash docker container exec [オプション] containername コマンド ``` |				

実際にDockerを起動してみましょう。よく使われるdocker-compose.ymlから起動します。
#### Docker Compose とは
複数コンテナのアプリケーションを定義・共有するために役立つように、開発されたツールです。 
Compose があれば、サービスを定義する YAML ファイルを作成し、コマンドを１つ実行するだけで、
瞬時にすべて立ち上げたり、すべてを削除したりできます


#### 1. 任意のディレクトリを作成し、その中に/web/Dockerfileを作成してください。

```Dockerfile			
	# Dockerベースイメージの指定		
	FROM nginx		
			
	# ビルド時に実行するシェルコマンド		
	# RUN apt update 		
			
	# ホスト（ローカル）のファイルやディレクトリをDockerイメージにコピー		
	# ：　COPY [コピー元][コピー先] 		
	COPY ./src /usr/share/nginx/html		
			
	# コマンドを実行する作業ディレクトリ		
	# WORKDIR [ディレクトリのパス] 		
	# WORKDIR /app		
			
	# コンテナが実行されたとき実行するコマンド		
	# CMD ["apachectl","-D","FOREGROUND"]		
```
作成ついでにコメントアウトで説明書いてます。

#### 2. 次に、/src/index.htmlを作成します。
``` index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Docker</title>
</head>
<body>
<p>hello Docker!</p>
</body>
</html>
```

#### 3.次にルートディレクトリにdocker-compose.ymlを作成します。
```docker-compose.yml
services:
  web: #サービス名
    build: # Dockerfileからビルドする際の相対パスを設定
      context: . # 親ディレクトリをコンテキストに
      dockerfile: ./web/Dockerfile # webフォルダ内のDockerfileを使用
    ports:  # ホストマシンのポート番号:コンテナのポート番号
      - "80:80"
```

最終的なディレクトリ構成は以下です。
```
.	
├── docker-compose.yml	
├── src	
│   └── index.html	
└── web	
    └── Dockerfile	
```

実際にコマンドで起動してみましょう。

```bash
docker compose up -d
```

http://localhost/

hello Docker!が表示されたかと思います。

先ほどはnginxのイメージを作成しました。
続いてMySQLのイメージを作成しましょう。

```diff_docker:docker-compose.yml
	services:	
	  web: #サービス名	
	    build: # Dockerfileからビルドする際の相対パスを設定	
	      context: . # 親ディレクトリをコンテキストに	
	      dockerfile: ./web/Dockerfile # webフォルダ内のDockerfileを使用	
	    ports:  # ホストマシンのポート番号:コンテナのポート番号	
	      - "80:80"	
		
+	  db: #サービス名	
+	    # build: Dockerfileからビルドする際の相対パスを設定	
+	    image: mysql:5.7 # イメージ名:タグ	
+	    volumes: # データをコンテナの外に保存するための設定	
+	      - ./mysql/data:/var/lib/mysql #　ホストディレクトリ : コンテナ内ディレクトリ	
+	    environment: # 環境変数	
+	      MYSQL_ROOT_PASSWORD: password	
+	      MYSQL_DATABASE: sample_db	
+	      MYSQL_USER: user	
+	      MYSQL_PASSWORD: password	
+	    ports: 	
+	      - "3306:3306" # ホストマシンのポート番号:コンテナのポート番号	
+	    # depends_on: サービス間の依存関係を定義	
+	    # command: サービスコンテナが起動したときに実行するコマンド	
		
```

こちらもついでにコメントアウトで説明書いてます。

MySQLのコンテナが作成されましたね。このように簡単なイメージについては、ymlファイルのみで作成可能です。
また、簡単にコンテナを追加できるのも強みですね

動作確認もかねてphpMyAdminのイメージを作成して、確認しましょう。

```diff_docker:docker-compose.yml
	services:	
	  web: #サービス名	
	    build: # Dockerfileからビルドする際の相対パスを設定	
	      context: . # 親ディレクトリをコンテキストに	
	      dockerfile: ./web/Dockerfile # webフォルダ内のDockerfileを使用	
	    ports:  # ホストマシンのポート番号:コンテナのポート番号	
	      - "80:80"	
		
	  db: #サービス名	
	    # build: Dockerfileからビルドする際の相対パスを設定	
	    image: mysql:5.7 # イメージ名:タグ	
	    volumes: # データをコンテナの外に保存するための設定	
	      - ./mysql/data:/var/lib/mysql #　ホストディレクトリ : コンテナ内ディレクトリ	
	    environment: # 環境変数	
	      MYSQL_ROOT_PASSWORD: password	
	      MYSQL_DATABASE: sample_db	
	      MYSQL_USER: user	
	      MYSQL_PASSWORD: password	
	    ports: 	
	      - "3306:3306" # ホストマシンのポート番号:コンテナのポート番号	
	    # depends_on: サービス間の依存関係を定義	
	    # command: サービスコンテナが起動したときに実行するコマンド	
		
+	  phpmyadmin:	
+	    image: phpmyadmin	
+	    depends_on:	
+	      - db	
+	    environment:	
+	      - PMA_ARBITRARY=1	
+	      - PMA_HOSTS=db	
+	      - PMA_USER=root	
+	      - PMA_PASSWORD=password	
+	    ports:	
+	      - "3001:80"	

```
```bash
docker compose up -d
```

3001番にマッピングしたので、

http://localhost:3001/

しっかり、sample_dbが作成されて動作しています。