dockerでapache-mariaDBの環境を作る ~とりあえず一緒に動かしたよ~


dockerコンテナでapacheとmariaDBが動く環境を作ってみる。
とりあえずお手軽に、apacheとmariaDBのコンテナをくっつけて動かしてみるよ。

1.httpdを動かす

まずはhttpdを動かしてみる。
httpdのoffical imageのHow to use this imageの通り、Dockerfileを作ってみる。

Dockerfile
FROM httpd
copy ./public-html /usr/local/apache2/htdocs

How to use this imageとちょっと変えて、バージョンは指定しなかった。
Dockerfileを置いたディレクトリにpublic-htmlというフォルダを置く。その中に置いたファイルが一式/usr/local/apache2/htdocsにコピーされる。ていうことは、public-htmlに置いたWebページがDockerコンテナのhttpdで照会できるようになるってことだ。
でも、今は面倒なのでとりあえず空のディレクトリだけ作っておく。
でもって、How to use this imageに書いてある通り、docker buildとdocker runをしてみる。

# docker build -t my-apache2 .
Sending build context to Docker daemon   2.56kB
Step 1/2 : FROM httpd
 ---> b2c2ab6dcf2e
Step 2/2 : copy ./public-html /usr/local/apache2/htdocs/
 ---> Using cache
 ---> add9ae831e3f
Successfully built add9ae831e3f
Successfully tagged my-apache2:latest

最後のドット(.)も忘れないように。

# docker run -dit --name my-running-app -p 8080:80 my-apache2
6104875a4074cb1700ee4e0b7d3ad7ba56031d14f4aabf52333c56491149586f

--nameの後ろはコンテナの名前なので、好きにつけていい。docker psなどでコンテナを参照すると、つけた名前が表示される。rmで消す時も、コンテナIDだけでなく、この名前を指定することもできる。

# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
6104875a4074        my-apache2          "httpd-foreground"   2 minutes ago       Up 2 minutes        0.0.0.0:8080->80/tcp   my-running-app

-pの後ろはport番号で、前がホストサーバーのポート、後ろがコンテナのポートになります。apacheてばデフォルトのポートが80番なので、そこにホストサーバーのどのポートをつなぐか、っていう設定をします。
その後ろがイメージの名称です。

これでもうapache立ち上がってます。試しにcurlで接続してみる。

curl http://localhost:8080
<html><body><h1>It works!</h1></body></html>

ブラウザじゃないから、It works!って言われてもインパクトが今一つ。
でも動いています。

2.mariaDBを動かす

今度はmariaDBのoffical imageを動かしてみる。
これも、mariadbのofficial imageのHow to use this imageの通りにやってみる。

# docker run --name some-mariadb -e MYSQL_ROOT_PASSWORD=p@ssw0rd -d mariadb:latest
dbd435416b056b9b0f207ec0d36e60a0bc7fb8eacd9670bc88be2f1ac25f6c6e

立ち上がりました。
・MYSQL_ROOT_PASSWORDはrootに設定するパスワードを指定するものなので、適当なパスワード(忘れないやつ)を指定してください。忘れると後でDBにアクセスできません。
・mariadb:tagの「tag」は、使いたいmariadbのバージョンを指定してください。バージョンはoffical imageのページのSupported tags and respective Dockerfile linksに書いてあるもののいずれかを指定してください。tagのままじゃだめだよ。
ちなみに--nameは好きな名前を付ければいいので、サンプルのsome-mariadbのままでもOK.

さて、上がったけれど、このままではなんだかよくわからない。
試しにコンテナの中に入ってみる。
official imageのContainer shell access and viewing MySQL logsにあるdocker execコマンドを打ってみる。

# docker exec -it some-mariadb bash
root@dbd435416b05:/#

mariadbのコンテナのコマンドプロンプトが表示されるので、mariadbにログインしてみる。

# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.12-MariaDB-1:10.4.12+maria~bionic 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)]>

パスワードはdocker runの時指定したやつ(ここの例ではp@ssw0rd)です。
ちゃんとmariaDBの中に入れました。

3.ふたつ合わせてみる

さて、じゃあhttpd(いわゆるwebサーバー)からmariaDB(いわゆるDBサーバー)へアクセスできるようにするには、どうしましょうか。
サーバーとしてそれぞれ立ち上がっているわけだから、ネットワークがつながってくれればいいんだろうけど、そういう話かdocker?

ここで登場するのがdocker-compose。なんとなくコマンドだけ打ってた人も多いことでしょう。だって動けばdockerでもdocker-composeでもどっちでもいいし。
しかーし!そういう心根が呪文だらけの謎システムを生んでしまうのだ!そうなのだ!
と、気持ちを新たにしてdocker-composeに取り組みます。

docker-composeを使うには、まずdocker-compose.ymlを作成します。
ぐぐればサンプルはいろいろ出ますが、具体的な呪文がよくわからないですよね。
そんな時参考にさせていただきましたDocker Compose - docker-compose.yml リファレンス。ありがとうございます。
これを踏まえて、今回やりたいdocker-compose.ymlを作ってみるよ。
ちなみにディレクトリ構成はこんな感じ。

── dockerfiles ┬─ docker-compose.yml
               └─ httpd ┬─ Dockerfiles
                        └─ public-html ─(サイトデータ)

見よう見まねでdocker-compose.ymlを作ってみる。

docker-compose.yml
version: "3"
services:
  web:
    build: ./httpd
    ports:
      - "8080:80"

  db:
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: p@ssw0rd
    ports:
      - "3306:3306"
    volumes:
      - /usr/local/mariadb:/var/lib/mysql

【解説】
version: docker-composeのバージョン
services: コンテナの設定などを記述する塊。
web: 勝手につけた名前1。ここにhttpdのコンテナの設定を記述することにした。
build: 動かしたいコンテナのDockerfileの場所を指定する。
ports: ポートを公開します。ホスト:コンテナで設定、ホストで設定したポートでコンテナにアクセスすると、コンテナ内ではコンテナの方で指定したポート経由で接続します。
db: 勝手につけた名前2。ここにmariaDBのコンテナを記述します。
image: mariaDBはDockerfileを作らず、imageから直接起動しているので、buildでなくimageを指定する。
environment: 設定などのパラメータを入れておくところ。mariaDBのコンテナを立ち上げる時、rootのパスワードを設定しなければならないので、とりあえずその設定だけ入れてみる。
volumes: 指定したパスをボリュームとしてマウントします。ホスト:コンテナで指定すると、ホスト側のパスにデータを書き出す。いわゆる永続化ができる。
※volumesを設定すると、ホスト側にデータが保存され、毎回立ち上げ時に指定されたディレクトリをマウントして使用することになる。データが消えないのはいいのだが、docker downなどしてコンテナを消そうがイメージを消そうが、ディレクトリをマウントしている限りそのデータを使用し続ける。運用し始めたらそのほうがいいが、初期設定時に「あー、間違っちまったからもう一回」ってするとき、ホスト側のデータを消さないと古いデータが延々マウントし続けられてしまうので、注意が必要。結構嵌ったよ。

とりあえずこれだけ書いて動かしてみる。
動かす時はdocker-compose.ymlが入っているディレクトリで実行してね。

# docker-compose up -d
Creating network "dockerfiles_default" with the default driver
Building web
Step 1/2 : FROM httpd
latest: Pulling from library/httpd
54fec2fa59d0: Pull complete
8219e18ac429: Pull complete
3ae1b816f5e1: Pull complete
a5aa59ad8b5e: Pull complete
4f6febfae8db: Pull complete
Digest: sha256:c9e4386ebcdf0583204e7a54d7a827577b5ff98b932c498e9ee603f7050db1c1
Status: Downloaded newer image for httpd:latest
 ---> b2c2ab6dcf2e
Step 2/2 : copy ./public-html /usr/local/apache2/htdocs/
 ---> d09171cc2002
Successfully built d09171cc2002
Successfully tagged dockerfiles_web:latest
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Pulling db (mariadb:latest)...
latest: Pulling from library/mariadb
23884877105a: Pull complete
bc38caa0f5b9: Pull complete
2910811b6c42: Pull complete
36505266dcc6: Pull complete
e69dcc78e96e: Pull complete
222f44c5392d: Pull complete
efc64ea97b9c: Pull complete
9912a149de6b: Pull complete
7ef6cf5b5697: Pull complete
8a05be3688e0: Pull complete
c09ffdc1b660: Pull complete
2eb7fe288fc8: Pull complete
b41d1cc4d40f: Pull complete
a92376500910: Pull complete
Digest: sha256:379f3689cfcd53fd561c1aa2aea0a336a2362c9d31306528228321344a9cf979
Status: Downloaded newer image for mariadb:latest
Creating dockerfiles_web_1 ... done
Creating dockerfiles_db_1  ... done

なんか動いたっぽい。
それぞれの環境にdocker execで入ってみる。

mariadb
# docker exec -it dockerfiles_db_1 bash
root@c067115a3e06:/# mysql -root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.12-MariaDB-1:10.4.12+maria~bionic 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)]>
httpd
# curl http://localhost:8080
<html><body><h1>It works!</h1></body></html>

とりあえず動いた。でも全然設定が入っていないので、このままではまだつなげたとは言い難いな。
ここまでで一旦公開しますよ。今後実際にwebサーバーに何か入れて、DBアクセスしてみるようなことをしてみたいなぁ(遠い目)。
それまで、しばしさらば!友よ!!