Dockerで色々やってみる（Containerいじくり編）２

# 概要
今までで、Windows10でDockerが使える状態を作り、DockerHubからImageを取得し、Containerを起動する流れを「自己整理」してきました。

今回は、Apache HttpdとMariaDBを触ってみようと思います。
（毎度ですが、Dockerfileは出てきません。）

まとめは下記

https://qiita.com/TAKANEKOMACHI/items/a890fc4f3a132828f62b

# 前提条件
+ Windows10にDocker Desktopがインストールされている状態

# httpd（Apache httpd）
Webサーバーのアプリとしては代表的な「Apache HTTPD」です。

https://hub.docker.com/_/httpd

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/68ec8cad-a030-7e15-b893-f63685127811.png)

提供されているタグ情報を見ると、「2.2系」は、とっくにサポート終了しているので提供は「2.4系」だけですね。
ベースになるOSは、「bullseye（つまりDebian11）」か「alpine（Alpine Linux）」の2系統のようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/ec38c963-97fb-f41e-8cf3-a0643b1cd327.png)

毎度ですが、「latest」が「bullseye」側になっているので、DebianベースのImageを使いましょう。

## Imageの取得
pullコマンドを使って、httpdのImageを取得します。

```powershell:powershell
PS C:\> docker pull httpd:latest
latest: Pulling from library/httpd
42c077c10790: Pull complete
77a357ba66a8: Pull complete
e9e2f87fc2ce: Pull complete
0b3c9bceb738: Pull complete
de91965861a5: Pull complete
Digest: sha256:f899e432292e4ee92772d35e43b2e3dcf30042b1c6385d33f00a9300c69ee729
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
```

Imageの一覧を確認します。
```powershell:powershell
PS C:\> docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
httpd         latest    b260a49eebf9   4 days ago     145MB ←←←←
ubuntu        latest    27941809078c   11 days ago    77.8MB
hello-world   latest    feb5d9fea6a5   8 months ago   13.3kB
```

## Containerの生成と起動
それでは、Containerを生成して起動してみます。
```powershell:powershell
PS C:\> docker run -d -p 8080:80 httpd
4581c939aae3c339d52477a344ad634f32af80fc7acfb560c0013d32d731b8b9
```

見慣れないオプションが出てきましたね。

https://docs.docker.jp/engine/reference/run.html

まず「-d」はデタッチドモードです。
要は「バックグラウンドで動いておいてね」というオプションです。

そして「-p 8080:80」は、Containerのポート番号を指定するオプションです。
この場合、外部から8080へアクセスしてきたものを、Containerの80へ渡してね。ということです。

実行されると、下記のようなダイアログが出るので「アクセスを許可する」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/ae38dbcf-b67f-d597-a31e-92fae571c0b9.png)

さて、それではWebブラウザを開いて、「http://localhost:8080 」へアクセスしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/ffd8d150-91ee-c04c-340e-381e3d20e33e.png)

動作してますね。

Docker Desktop側も見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/94d04e61-b24d-62e7-78a8-94b938d77bcf.png)

デタッチドモードで動作してるので、ずーっと起動しっぱなしです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/6c4706fe-e78c-0e6a-d546-484ce890bdd8.png)

ここをクリックすることで、ブラウザで表示確認も可能です。

## Containerを停止する
デタッチドモードで動作しっぱなしなので、停止するにはContainerの状況を確認します。

```powershell:powershell
PS C:\> docker container ls
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS          PORTS                  NAMES
4581c939aae3   httpd     "httpd-foreground"   10 minutes ago   Up 10 minutes   0.0.0.0:8080->80/tcp   bold_ritchie
PS C:\> docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS          PORTS                  NAMES
4581c939aae3   httpd     "httpd-foreground"   10 minutes ago   Up 10 minutes   0.0.0.0:8080->80/tcp   bold_ritchie
```

「container ls」でも「ps」でもどちらでもOKです。
「--all」を付けなくても、稼働中なので表示されます。

Containerの停止は「stop」コマンドを使います。
```powershell:powershell
PS C:\> docker stop 4581c939aae3
4581c939aae3
```

停止しました。
Docker Desktop側も見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/803a350a-e177-3aad-c72a-3db60e83dbc2.png)

ちゃんと停止してますね。

## Containerを起動する
前回学びましたね。
再度「run」すると、もう一個Containerができちゃうぞ。と・・・・

なので「start」を使います。
```powershell:powershell
PS C:\> docker start 4581c939aae3
4581c939aae3
PS C:\> docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS         PORTS                  NAMES
4581c939aae3   httpd     "httpd-foreground"   15 minutes ago   Up 3 seconds   0.0.0.0:8080->80/tcp   bold_ritchie
```

ポイントは、startの時は「デタッチドモード」や「ポート指定」などはもう不要だということです。
Containerを生成するときのオプションなので、生成済みのContainerの起動には付けなくていいということですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/0db04582-ed7b-bf4f-7e32-daf627057bee.png)

ちゃんと動いてますね。

# MariaDB
ご存じのMySQLではなく、MariaDBです。

https://hub.docker.com/_/mariadb

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/89815d01-6cc1-8077-8034-aea424992393.png)

MariaDBの提供タグは、結構多いですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/e2e2c41a-526b-04bb-eaac-a9943dc7db20.png)

「latest」になってるのは「10.8.3-jammy」ですね。

## Imageの取得
pullコマンドを使って、MariaDBのImageを取得します。

```powershell:powershell
PS C:\> docker pull mariadb:latest
latest: Pulling from library/mariadb
405f018f9d1d: Already exists
7a85079b8234: Pull complete
579c7ff691b1: Pull complete
4976663b5d6d: Pull complete
169024b1fb13: Pull complete
c0ffe8ce897f: Pull complete
b583c09d23c3: Pull complete
9b9f0c08d08f: Pull complete
9cd51f984586: Pull complete
d9f506bb8aca: Pull complete
24d689f79ba4: Pull complete
Digest: sha256:88fcb7d92c7f61cd885c4d309c98461f3607aa6dbd57a2474be86e1956b36d13
Status: Downloaded newer image for mariadb:latest
docker.io/library/mariadb:latest
```

Imageの一覧を確認します。
```powershell:powershell
PS C:\> docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
httpd         latest    b260a49eebf9   4 days ago     145MB
mariadb       latest    ea81af801379   11 days ago    383MB
ubuntu        latest    27941809078c   11 days ago    77.8MB
hello-world   latest    feb5d9fea6a5   8 months ago   13.3kB
```

## Containerの生成と起動
早速、「run」で起動します。

:::note warn
どれかはオプションで指定しろや。って・・・
One of MARIADB_ROOT_PASSWORD, MARIADB_ALLOW_EMPTY_ROOT_PASSWORD, or MARIADB_RANDOM_ROOT_PASSWORD (or equivalents, including *_FILE), is required. The other environment variables are optional.
:::

```powershell:powershell
PS C:\> docker run -p 3306:3306 -e MARIADB_ROOT_PASSWORD=my-secret-pw -d mariadb
0f9346bd7598d80349bce4cc83eb17df0225ab124fe178d1945df6911c453127
docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
```

む？
MariaDB/MySQLの標準ポート番号3306が有効にできないだと？

、、、、あ、このPCにMySQLをインストールして動かしてるわ・・・ポート競合か・・・

Docker Desktopで見ると、Containerを作ったところまでで終わってるのね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/2334459f-a7c1-9264-257e-76278d95d531.png)

失敗作なんで削除して、ポート番号を「3306 → 3808（適当）」に変更して、Containerを作りなおすことにしよう。

```powershell:powershell
PS C:\> docker run -p 3808:3306 -e MARIADB_ROOT_PASSWORD=my-secret-pw -d mariadb
759f00f551ff09067ebf088407e2ad7de88aae01a71356d3d579eb79e2dc9757
PS C:\> docker ps --all
CONTAINER ID   IMAGE           COMMAND                  CREATED              STATUS                    PORTS                    NAMES
759f00f551ff   mariadb         "docker-entrypoint.s…"   About a minute ago   Up About a minute         0.0.0.0:3808->3306/tcp   crazy_ritchie
4581c939aae3   httpd           "httpd-foreground"       14 hours ago         Up 14 hours               0.0.0.0:8080->80/tcp     bold_ritchie
89b3f9ec5f9b   ubuntu:latest   "bash"                   34 hours ago         Exited (0) 34 hours ago                            magical_hellman
```

起動しましたね。
Docker Desktop側を見るとこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/ee9af406-0b37-b7ba-3ba4-8e680f6dd4ab.png)

MariaDBはVolumeも作成されるみたいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/5ff8099b-60ad-75ce-836e-e2c908e2e9d9.png)

さて、どうやって確認してみようか・・・
せっかく「MySQLがすでに入っていてポートが競合した」ので、MySQLのツールを使って接続してみますか・・・

まず、MySQL Workbenchを起動します。

:::note info
MySQL Workbenchは、グラフィカルにMySQLを操作できるツールです。
https://dev.mysql.com/downloads/workbench/
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/c960aad9-d4e2-34a9-8c7f-89b844116eda.png)

まず「MySQL Connections」の右側にある「+」マークをクリックしてコネクションを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/766e6edb-2d92-6585-580c-354eaf15b961.png)

+ Connection Name：適当でいいです。今回は「MariaDB Test」にしてみました
+ Port：標準の「3306」を「3808」に変更したので、書き換えます

「OK」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/9b758271-8473-8534-b0a6-5f34a67580e9.png)

コネクションができたので、選択して実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/c809d946-31c3-cbf4-008b-fdc4971db468.png)

Containerを作成するときに設定したパスワードを入力します。（MARIADB_ROOT_PASSWORD=my-secret-pwの「my-secret-pw」です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/41fad1aa-e0e1-cf78-6a47-10bbafee5427.png)

なんか警告でますが、スルーします。（Ver10.8.3を検知したけど、このWorkbenchにはちゃんと適合はしてねーぞ。ってやつ）
「Continue Anyway」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/36c3ca0f-9de2-d04c-3bef-1f95ee8a6ab2.png)
無事、MariaDBに接続しましたね・・・

「いや、私は、MySQLインスコしてないんで標準の3306でContainer作ったんだけど、確認させてよ・・・・」

その場合は、こんな感じで進めます。
（というか、「-p 3808:3306」を使わなかった人。つまり、外部からの使用はしないよ。という人も含めます）

一番簡単なのは、Docker DesktopからTerminalを開いてアクセスする方法。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/f143bbe6-ea2c-80d0-a1ee-8da67a57d5cf.png)

開いたTerminalで「mysql -u root -p」と入力してEnter。Passwordを入力するとMariaDBのコンソールになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222251/249900af-f48d-6e23-d961-8f586ee7be87.png)

同じようなものですが、「exec」コマンドを使ってやるのもありです。
execコマンドは最低2つ以上の引数を記載しないといけないので、「mysql」コマンド書いてますが、Docker Desktop側みると「/bin/sh」でもいいみたいですね。

```powershell:powershell
PS C:\> docker exec -it 759f00f551ff mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 17
Server version: 10.8.3-MariaDB-1:10.8.3+maria~jammy mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
```

余談ですが、MySQLと同じなので、終了は「\q」です。
```sh:sh
MariaDB [(none)]> \q
Bye
```

## Containerを停止する / Containerを起動する

Containerの停止や起動は、httpdのときと同じです。


だんだんDockerの「自己整理」が出来てきました。
次回は、とうとう「Dockerfile」を使ったり、「Docker-compose」を使ったりしはじめようと思います。