Code for final

ふぁいなる向けのコード置き場です。すでにコードじゃないこともいっぱい。

Docker Desktopで複数のコンテナが連携したアプリ(WordPress)を構築するポイント

先日、Dockerを使ったコマンドだけでコンテナを構築する記事をまとめましたが、今回はファイルからコンテナを構築するポイントをまとめたいと思います。

複数のコンテナを同時に構築するのは"docker-compose"コマンドを使う

Dockerを調べたらよく見かける、"docker-compose.yml"や"Dockerfile"ですが、ファイルでコンテナを構築する場合はこれらのファイルと"docker-compose"というコマンドを使用します。
このコマンドはDockerDesktopをインストールしたら入っているので別途なにかを入れる必要はありません。

DockerでWordpressを構築してみる

WEBアプリはwebサーバー + php + mysqlで構築されているものも多いですが、 その代表的なアプリとしてブログのWordPressがあります。
そのWordPressをDockerで構築し、ポイントをまとめたいと思います。

以下の手順に沿って行えば構築できますが、ファイルを作成する時間もとれないひとは完成形のベースフォルダをGithubにあげましたので、 wordpressのダウンロードしてファイルを配置して"docker compose up -d"コマンドをたたけば構築できます。
apache + php + mysqlのベース環境としても使用していただけると思います。

github.com

ベースフォルダを作成

どこでもいいのでベースフォルダを作成します。 このフォルダ名は作成されるコンテナのプレフィックスとなります。 今回は"wordpress"という名称にします。

docker-compose.ymlを作成

ベースフォルダの中に"docker-compose.yml"ファイルを作成します。 中身は以下を貼り付けてください。

version: '3.7'

services:
  mysql: # MySQLサービス名
    image: mysql:5.7 # dockerhubのイメージ名
    volumes:
      - mysql_data:/var/lib/mysql # mysql_dataというボリューム名でMySQLのデータを保存
      - .\mysql\initdb.d:/docker-entrypoint-initdb.d # 構築後に実行するSQLを配置(オプション)
      #- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf # MySQLの設定ファイル(オプション)
    restart: always # コンテナに連動して自動起動
    ports:
      - "3306:3306" # Windows側ポート:Linux側ポート
    environment:
      MYSQL_ROOT_PASSWORD: "password" # MySQLのrootユーザのパスワード

  php-apache: # phpのサービス名
    build: .\php # phpフォルダにあるDockerfileでビルド
    volumes:
      - .\htdocs:/var/www/html # htdocsフォルダをapacheのルートディレクトリにマッピング
    restart: always
    ports:
      - "80:80"
    depends_on:
      - mysql

  phpmyadmin: # phpmyadminサービス名
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: mysql # MySQLのサービス名を指定
    restart: always
    ports:
      - "8080:80"
    depends_on:
      - mysql # MySQLが起動終わってから起動

volumes:
    mysql_data: {}  # mysql_dataという名前でボリュームを作成。{}は空って意味かな。

yaml形式というあまり見慣れない記述だと思いますが、xmljsonと同様でデータ構造を記述する言語です。
jsonに近い感じですが、インデントで階層を表現するため、括弧がないのとコメント(#)が記述できるのが異なる点ですかね。ちなみに先頭の"-"は配列を表します。

内容をさっくり説明すると、dbサーバ(mysql)とphpmyadminサーバとwebサーバ(apache+php)の3つコンテナを同時に作成する内容になっています。
wordpress構築にあたってphpmyadminは必須ではないですが、phpmysqlを扱うならほぼ必須なものなのでついでに追加しています。 servicesでそれぞれに名前をつけてコンテナを定義しています。
個々の定義でイメージ、ホストフォルダとのマッピング、ポートマッピング、依存関係などを設定します。
volumesで”mysql_data”を定義しているのはこれは外付けhddみたいなもので、コンテナ内にデータを置いておくとコンテナを削除したときにデータが消えるので、ボリュームとして保存しています。
今回はmysqlのデータファイルをマッピングしてその部分だけを保存する設定としています。

最低限これだけ知っていれば問題ないと思いますが、ほかにもいろんな設定ができるので、気になるひとは以下のドキュメントを参照してください。

docs.docker.jp

mysqlのコンテナ作成時にデータベースを構築する

mysqlのコンテナ構築後はデータベースが作成されていないのでそのままだとアプリで使用できません。
構築したmysqlに接続し、データベースを作成後にテーブルを作成、その後データをインポートするSQLを実行すればよいのですが、そのSQLを構築時に実行する設定ができます。
コンテナ内の"/docker-entrypoint-initdb.d"にsqlを格納することで構築後に実行されるという仕組みです。

sqlファイルを格納するため、"wordpress"フォルダの中に"mysql"フォルダを作成します。
mysql"フォルダの中に"initdb.d"フォルダを作成して、その中に"init_db.sql"を作成します。 中身は以下を貼り付けます。

CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8;

wordpressに使用するデータベースを作成するSQLを記述しています。テーブルやデータはwordpressが作成してくれるので。

dockerfileでコンテナ構築後にコマンドを実行する

コンテナ構築後にコマンドを実行するには構築後にコンテナ内に入ってコマンドを叩けばOKなのですが、これも構築時にコマンドを実行することができます。
上記の"php-apache"コンテナだけ"image"の指定がないですが、代わりに"build"を指定しています。ここでDockerfileを使用します。Dockerfileはイメージをカスタマイズする際に使用する感じですかね。

"wordpress"フォルダの中に"php"フォルダを作成し、その中に"Dockerfile"を作成します。
中身は以下を貼り付けます。

# イメージを"php"でタグ"7.4-apache"で使う
FROM php:7.4-apache
# php.iniを置き換える(オプション)
# COPY ./php.ini /usr/local/etc/php/

# ライブラリをインストール(必要に応じて変更)
RUN apt-get update && apt-get install -y \
 libfreetype6-dev \
 libjpeg62-turbo-dev \
 libpng-dev \ 
 libonig-dev \
 && apt-get clean

# PHP拡張モジュールをインストール(必要に応じて変更)
RUN docker-php-ext-install pdo_mysql mysqli gd iconv

phpapacheがいっしょになったイメージを使っていますが、phpは外部のモジュールを入れて使うことが多いです。
そのため、apt-getコマンドで必要なライブラリをインストールしています。apt-getはcentosでいうとyumコマンドでパッケージを管理するコマンドです。
docker-php-ext-installコマンドはPHP拡張モジュールをインストールするコマンドです。

wordpressをダウンロードして配置する

wordpressは以下からダウンロードできます。

ja.wordpress.org

wordpressフォルダの中にhtdocsフォルダを作成し、そこに解凍してできた"wordpress"フォルダの中身をすべて移動します。
htdocsフォルダの中にindex.phpがある配置になります。

最終的に以下のようなフォルダ構成になっていればOKです。

wordpress
│  docker-compose.yml
│
├─htdocs
├─mysql
│  └─initdb.d
│          init_db.sql
│
└─php
        Dockerfile

docker-composeコマンドを実行して構築する

PowerShellで"wordpress"フォルダに移動して以下のコマンドを実行します。

>docker-compose up -d

上記のコマンドだけで構築が完了すると思います。
ちなみに以下のコマンドがでたら構築は終わっていますが、内部でサービスの起動とか走っているのでしばらくまったらつながるようになります。30sくらいまてばOKです。

Creating wordpress_mysql_1 ... done                                                                                     
Creating wordpress_phpmyadmin_1 ... done                                                                                
Creating wordpress_php-apache_1 ... done

ダッシュボードを開くと"wordpress"でグループ化されたコンポーネントが確認できると思います。

f:id:finalstream:20200520113802p:plain

最初にも記載しましたが、このグループ化された名称は"docker-compose.yml"があるフォルダ名で決まるのでフォルダ名はわかりやすく、重複しないようにつけたほうがいいです。

ログを確認する

以下のコマンドでログの確認ができます。

>docker-compose logs

ただ、ダッシュボードで確認したほうが、検索できるので便利です。

f:id:finalstream:20200520121534p:plain

たとえば、"entry"で検索すると、以下のような出力がされていればデータベース作成用のSQLが実行されていることが確認できます。

mysql_1 | 2020-05-17 15:10:43+00:00 [Note] [Entrypoint]: /usr/local/bin/docker-Entrypoint.sh: running /docker-Entrypoint-initdb.d/init_db.sql

wordpressにアクセスする

http://localhost/ にアクセスすると以下のwordpressへようこそ。という画面が表示されます。

f:id:finalstream:20200518164448p:plain

さあ、始めましょう!をクリックします。

データベースの接続情報を入力します。 以下のように入力します。 ポイントはホスト名は"localhost"でなく、コンテナのサービス名"mysql"を指定します。

f:id:finalstream:20200518164701p:plain

送信ボタンをクリックして以下の画面になればOKです。

f:id:finalstream:20200518164853p:plain

インストール実行をクリックする。

必要な情報をいれます。中身は自由でOKです。

f:id:finalstream:20200518170639p:plain

Wordpressをインストールをクリックする。

あとはそのまま続けてログインできれば構築完了です。

f:id:finalstream:20200518170855p:plain

よく使うdocker-composeコマンド

停止する。

>docker-compose stop

削除する。停止もされます。コンテナ内のデータが消えるので注意!(volumesでマッピングしている場合はコンテナ外にデータがあるので大丈夫です)

>docker-compose down

中に入ってコマンドをたたく。以下の"mysql”はサービス名を指定します。

>docker-compose exec mysql /bin/bash

まぁコマンド覚えなくてもぜんぶダッシュボードからなんとかなります。

あとファイルのコピーとかはdockerコマンドでできます。docker-composeは複数のコンテナをまとめて操作するコマンドで 個々のコンテナの操作はdockerコマンドという感じですかね。

nginx + MariaDBに載せ替える

今作った環境をMariaDBとnginxに載せ替えたいと思います。
"wordpress"フォルダをそのまま変更してもいいですし、コピーしてもいいです。
docker-compose.ymlを以下に編集します。

ersion: '3.7'

services:
  mysql: # MySQLサービス名
    image: mariadb # dockerhubのイメージ名
    volumes:
      - mysql_data:/var/lib/mysql # mysql_dataというボリューム名でMySQLのデータを保存
      - .\mysql\initdb.d:/docker-entrypoint-initdb.d # 構築後に実行するSQLを配置(オプション)
      #- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf # MySQLの設定ファイル(オプション)
    restart: always # コンテナに連動して自動起動
    ports:
      - "3306:3306" # Windows側ポート:Linux側ポート
    environment:
      MYSQL_ROOT_PASSWORD: "password" # MySQLのrootユーザのパスワード

  web: # nginxのサービス名
    image: nginx
    volumes:
      - .\web\default.conf:/etc/nginx/conf.d/default.conf
      - .\htdocs:/var/www/html # htdocsフォルダをnginxのルートディレクトリにマッピング
    restart: always
    ports:
      - "80:80"
    depends_on:
      - mysql
      - app

  app: # phpのサービス名
    build: .\php # phpフォルダにあるDockerfileでビルド
    volumes:
      - .\htdocs:/var/www/html
    restart: always
    depends_on:
      - mysql

  phpmyadmin: # phpmyadminサービス名
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: mysql # MySQLのサービス名を指定
    restart: always
    ports:
      - "8080:80"
    depends_on:
      - mysql # MySQLが起動終わってから起動

volumes:
    mysql_data: {}  # mysql_dataという名前でボリュームを作成。{}は空って意味かな。

apache + mysql版と変えたところは以下な感じです。

  • mysqlサービスのイメージ名を"mariadb"に変更(MariaDBMySQL互換なのでこれだけでOK)
  • php-apacheサービスを"web"と"app”に分割
  • nginx用の設定ファイルを追加

nginx用の設定ファイルは"wordpress"フォルダに"web"フォルダを作成し、"default.conf"を作成します。
中身は以下を貼り付けます。

server {
    listen 80;
    server_name _;
    root  /var/www/html;
    index index.php;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(\.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

これで"docker-compose up -d"で起動すれば、nginx + MariaDBwordpressを構築完了です。

最後に

docker-composeを使うことでサーバ構築が楽になってアプリ開発に専念できそうです。
最後にnginx + MariaDBに変更しましたが、手軽にサーバ載せ替えとかできるんでこりゃ便利です。
XAMPPで構築するより融通がいろいろと効きそうですね。 Dockerについてこれで一通り知識がインプットできた気がします。
ほかにも便利な機能はあるかもなのであったらまた記録してきたいと思います。

Windows10にDocker Desktop for WindowsをいれてLinuxコンテナで動かす手順(実践編)

Dockerの導入について以下の記事で書きましたが、ただwebサーバーを立てただけで、コンテンツを更新したりする手順とかわからなく、 このままだと実務で使うときに苦労すると思ったので実務を想定して必要そうな知識をまとめたいと思います。
ここでいう実務は開発、テストを想定しています。本番で運用するためにはもっといろいろと知識が必要ですのでご注意を。

final.hateblo.jp

コンテンツを適用する方法は2つある

基本編ではwebサーバーを立てて"It Works!"が出て満足していましたが、実務ではコンテンツをサーバに配置する必要があります。
Dockerではその手順として2つあります。

  • コンテナ内のファイルを差し替える
  • ホストのフォルダをコンテナ内のフォルダとリンクする

後者だけ覚えておけばなんとかなりそうな気もしますが、テストとかだとコンテンツを配るのが面倒なときとかに使えそうな気はしますので両方説明します。

コンテナ内のファイルを差し替える

試しにapache webサーバーのindex.htmlを書き換えてみます。

まずコンテナ同士が別々に動作していることがわかるようにもう一個apacheのサーバを立てます。 名前とポートを変えれば何個でも作成可能です。

> docker run -d -p 8080:80 --name httpd2 httpd

"localhost:8080"でアクセスしたら"It works!"と表示されると思います。

ではこのhttpd2の方のLinux環境に入るには"docker exec"コマンドをたたいてください。 httpd2のところは入りたいコンテナ名を指定するだけであとはおまじないみたいなものです。

>docker exec -it httpd2 bash

すると以下のようになると思います。(@の右はコンテナIDでコンテナ作成時にランダムで生成されるので環境によって異なります)
sshでつないだときと同様にLinuxコマンドが実行できます。

root@4d11a0179bc4:/usr/local/apache2#

なのでapacheのindex.htmlファイルはhtdocsの下にあるので以下のコマンドで確認できます。

root@4d11a0179bc4:/usr/local/apache2# cd htdocs
root@4d11a0179bc4:/usr/local/apache2/htdocs# ls
index.html
root@4d11a0179bc4:/usr/local/apache2/htdocs# cat index.html
<html><body><h1>It works! </h1></body></html>

これを書き換えればいいのですが、viとかvimとか入っていないので、Windows環境から転送するしかないです。
Windows環境に戻るために"exit"をたたきます。そうするとWindowsに戻ります。

以下のコマンドを実行してワークディレクトリを作っておきます。

>cd c:\
>mkdir docker_work
>cd docker_work

まずは書き換えるためにコンテナ(Linux)内からWindowsにindex.htmlを持ってきます。 以下のコマンドを叩いて取得します。 "4d11a0179bc4"は各自のものに変えてください。先程のdocker execのとこからコピーすると確実かと思います。

>docker cp 4d11a0179bc4:/usr/local/apache2/htdocs .\htdocs

"docker cp"コマンドでホスト(Windows)とコンテナ(Linux)間のファイルやり取りができます。
cpコマンド同様、コピー元 コピー先で指定します。 コピー元のコンテナは"コンテナid:Linuxファイルパス"で指定します。
注意すべきところはコンテナ側のパスを指定するときはコンテナ名(httpd2)ではなく、コンテナIDを指定します。 コンテナIDは"docker exec"で接続するか"docker ps"で確認できます。

これで"c:\docker_work"にhtdocsフォルダができ、index.htmlが取得されたと思います。
index.htmlを自由に編集してください。

編集が終わったら次は以下のコマンドでコンテナ側にコピーします。
さっきと逆でコピー先がコンテナになります。

>docker cp .\htdocs 4d11a0179bc4:/usr/local/apache2

これで"localhost:8080"にアクセスすると表示される内容が変わったと思います。
"localhost"にアクセスしても"It works!"のままだと思います。
これでコンテナが別々の環境で動作していることがわかったと思います。 "localhost"を変えたい場合はhttpdのコンテナを同様に書き換えてみてください。

コンテナの状態をイメージとして保存する

コンテナをイメージとして保存することでいつでも"docker run"コマンドでコンテナを生成することができるようになります。
さきほどの"localhost:8080"の環境をイメージとして保存したいと思います。

httpd2の環境を保存するために以下の"docker commit"コマンドで状態を保存します。

>docker commit httpd2 httpdex:1.0

このコマンドの意味はhttpd2環境をhttpdexというイメージ名のタグ1.0で保存するという意味です。
以下のコマンドを実行して3台目のサーバを立てます。イメージにはいまほど作成した"httpdex:1.0"を指定します。

>docker run -d -p 8088:80 --name httpd3 httpdex:1.0

これで"localhost:8088"にアクセスするとhttpd2のコンテナ("localhost:8080")と同じ内容が表示されると思います。
これで"localhost:8080"の内容がイメージとして保存されてたということが確認できました。

ホストのフォルダをコンテナ内のフォルダとリンクする

さきほどのでコンテナ内のファイルを書き換えることができたと思いますが、これだと更新する度に書き換える必要があって、開発中は現実的ではないと思います。
コンテナ(Linux)がホスト(Windows)のフォルダを参照してくれるように設定することができます。

次に以下のコマンドを実行してさきほど保存したイメージ"httpdex:1.0"をベースに4台目のサーバを立てます。 ※実行時に共有フォルダに追加するかと聞かれると思いますが、”Share it”を選択してください。(キャンセルすると失敗します)

>docker run -v c:\docker_work\htdocs:/usr/local/apache2/htdocs  -d -p 8888:80 --name httpd4 httpdex:1.0

"localhost:8888"でアクセスするとhttpd3と同じ結果になると思いますが、ここで"c:\docker_work\htdocs"にあるindex.htmlを編集してください。
再度アクセスすると変更した内容が反映されていると思います。ほかのサーバーは変更されてないのも確認できると思います。
このように"docker run"実行時に"-v ホストのフォルダ(Windows):コンテナのパス(Linux)"を指定することでリンクできます。
ちなみに-vを複数個指定することもできるみたいです。

これで開発に耐えうる環境が構築できますね。

カスタマイズしたコンテナイメージを配布する

上記でカスタマイズしたコンテナイメージをほかの人にテストしてもらう場合、渡す必要があります。
その場合はファイルとして出力できます。

まず以下のコマンドを実行してコンテナイメージを確認しましょう。

>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpdex             1.0                 379506f88e8f        21 hours ago        166MB
httpd               latest              b2c2ab6dcf2e        11 days ago         166MB

保存したイメージをファイルに出力するには"docker save"コマンドを実行します。 以下のコマンドで"httpdex:1.0"のイメージを出力します。

>docker save -o httpdex-1.0.tar httpdex:1.0

"httpdex-1.0.tar"が出力されますのでこのファイルをほかの人に渡して"docker load"コマンドを実行してイメージファイルを取り込んでもらいます。

>docker load -i httpdex-1.0.tar

あとはdocker runコマンドでイメージ名"httpdex:1.0"を指定してもらえばほかの人の端末にも同じ環境が構築されます。

複数のコンテナを連携したサービスを構築する

以下にまとめました。

final.hateblo.jp

最後に

ここに書いたのは基本的なことなので詳細は必要に応じて調べてみてください。
でわ、素敵なDockerライフを。

Windows10にDocker Desktop for WindowsをいれてLinuxコンテナで動かす手順(基本編)

Dockerについて以前調べたときに以下の記事を書いたのですが、その後時代は進んだようで、2020年5月現在でもっと簡単に構築できるようになっていたのでメモしておきます。

final.hateblo.jp

Dockerに関する誤解(Windows版だとLinuxのインストールが必要?)

まずわたしだけかもですが、Windows版のDockerを入れるとWindowsで動くので、Linux環境で動かすにはdockerでLinuxOSを入れて、LinuxOS内にdockerをいれてみたいな手順が必要で手間がかかると思っており、 Windows版を敬遠していましたが、それは大きな誤解でした。
その答えはWindows版をインストールしたらわかりました。Windows版のインストールはHyper-Vを有効にしておくことが必須なのですが、それはなぜかというとWindows版のインストール時にHyper-Vに"DockerDesktopVM"というDockerを動かすためだけのLinux環境が作成されます。
なのでWindowsコマンドプロンプトからdockerコマンドをたたいたら、実際は内部で動いてるLinuxの環境で実行されるというわけです。
というわけなのでLinux環境で動かしたい方も安心してWindows版を使ってください。(VirtualBoxCentOSを入れるより簡単で便利です)

Hyper-VはHomeエディションでは使えないのでWindows版は使えない?

Hyper-VはHomeエディションでは使えないことは有名な話だと思いますが、次のWindows10 2004(2020/05/04時点では未リリース)から"WSL2(Windows Subsystem for Linux(WSL) 2)"という機能(Hyper-Vと似たようなもの)がリリースされ、これを使うことでDocker Desktopを動作させることができるみたいです。気になる方はググってみてください。

Dockerとは?

Dockerに興味があるひとがこの記事にたどり着いていると思うので説明不要だと思いますが、簡単に言えば仮想サーバ構築ツールです。
VMと異なるのはサーバごとにOSのインストールは不要で、1つのサーバ上に複数のサーバの構築ができます。
構築したサーバはイメージ化して配布できるので誰がやっても同じ環境が構築できます。
また、各種サーバアプリ(ApacheMySQLなど)のイメージが公開されており、コマンド1つで構築可能です。
僕はインフラ周りはあまりやらないのですが、開発環境やテスト環境構築とかで使えると思います。

www.docker.com

それでは以下に手順を記載します。

Hyper-Vを有効化

Hyper-Vはデフォルトでは有効になっていません。
なのでPowerShellを管理者権限で起動して以下のコマンドを実行します。

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

インストールが終わったら再起動が促されます。手順に不安がある方は以下を参照してください。

docs.microsoft.com

Docker Desktop for Windowsをダウンロード

Docker公式サイトからDockerDesktop for Windowsをダウンロードします。
以下のサイトの"Docker Desktop"の"Download for Windows"をクリックするとダウンロードが始まります。 ファイルサイズは1GB近くあります。

www.docker.com

Docker Desktop for Windowsをインストール

ダウンロードした"Docker Desktop Installer.exe"を実行して、OKを押して次へ進むだけでOKです。
途中、"Use Windows containers instead of Linux containers (this can be changed after installation)"の チェックがOFFであることを確認してください。(デフォルトでOFFなので何もしなくてよいですが) これは訳すと"Linuxコンテナーの代わりにWindowsコンテナーを使用する"なのでチェックがOFFの場合Linuxコンテナで動作します。インストール後に切り替えも可能です。
インストールが終わると再起動が促されます。

Docker用の仮想環境がはいってることを確認 (この手順は省略可)

Windowsの再起動後、検索ボックスに"hyper-v"といれて"Hyper-V マネージャー"を立ち上げると以下のように "DockerDesktopVM"という仮想環境が構築されていることが確認できます。これがDockerを動かすためのLinux環境の正体です。

f:id:finalstream:20200503181903p:plain

Dockerコマンドを実行する

PowerShellを立ち上げて"docker version"をたたいて、バージョンが表示されればインストール成功です。
コマンドプロンプトでもOKですが、PowerShellのほうがシャットダウンしてもコマンドの履歴が残るので便利です。

> docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:23:10 2020
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:29:16 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

DockerでWEBサーバを構築

上記までの手順ではDockerのエンジンだけインストールされているのでこっから本領発揮のとこです。
試しにapache webサーバを構築してみます。 Dockerは各種アプリのイメージが公式的に公開されており、そのイメージをダウンロードしてローカルサーバで動かす仕組みとなってます。
どんなイメージがあるかは以下のサイトで確認できると思いますが、RedminePostgreSQL、Jenkinsなどわりとなんでもあります。

hub.docker.com

なので以下の"docker run"コマンドを流すだけで、apche webサーバーの構築ができてしまいます。
構築した環境はコンテナと呼びます。

> docker run -d -p 80:80 --name httpd httpd

オプションの意味を簡単に解説すると以下になります。

  • "-d"はバックグラウンドで動作させる(指定しないとコンソールが持っていかれる)
  • "-p 80:80"(ホスト:コンテナ)はポート転送設定(試しに8080:80にするとlocalhost:8080でアクセスできる)
  • "--name http"は名前を"httpd"にする。(指定しないとランダムでヘンテコな名前が命名される)
  • 最後の"httpd"はDocker Hubで公開されているイメージ名

起動したかは以下の"docker ps"コマンドで、httpdがいればOKです。

>docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                NAMES
1b38ad530ec1        httpd               "httpd-foreground"   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp   httpd

WEBサーバの起動を確認

Windowsからブラウザを起動して、"localhost"をアドレスバーにいれてたたくと さみしいapacheの初期画面がでれば起動しているということです。

f:id:finalstream:20200503183816p:plain

DockerをGUIで操作

Windows版ではDockerアプリのDashboardを開けば画面で確認できます。(タスクトレイのクジラのアイコンを右クリックでDashboardを選択)
緑になっていれば動いています。ここから停止とか削除もできます。便利ですね。

f:id:finalstream:20200503183452p:plain

さらにhttpdを選択すれば詳細が確認でき、アプリごとのログを確認できます。超便利。

f:id:finalstream:20200503190510p:plain

最後に

以前VirtualBoxを使った構築に比べたらだいぶ簡単に構築できました。マシンのスペックによりますが、30min以内でできるんじゃないでしょうか。
まだまだ奥が深いDockerですが、ここまでなんとなくDockerについてさらに手軽になった感じが伝わったかと思います。
ただ、実際の業務で使用するにはまだまだ必要な知識が足りないので、あと実践編としてまとめたいと思います。
では素敵なDockerライフを。