まずはdockerコンテナを上げる_docker入門

よく聞くけどdockerって何?

あくまで初学者向けということで細かいことは省略しますが、ひとことでdockerというと今動いてるOSの上で仮想的にもうひとつどころか複数のOSをかんたんに軽く動作させるためのソフトウェアです。Windowsの上でLinuxが動くと考えて良いです。昔はVMWareとかVirtualBoxとかいうソフトがとても流行ったのですが、いかんせんホストOSのリソース(CPUやメモリ当然ハードディスクも)が必要になりますのでどうしても動作がもっさりしてしまいます。Dockerの場合はそういうことはありませんし、しかもコンテナはどんな環境でも動かすことができます。(ポータブル性があります)

しかもこのdocker、便利なことに。動かすホストOSはどんなものでも大丈夫です。通常ソフトウェア開発はチームで開発しますのでdocker-compose.yml(あとで説明します)を渡せばチーム人数が増えてもすぐにそしてかんたんに同じ環境を構築することができます。つまり、Dockerを使うと他の人と同じ環境でアプリケーションを簡単に共有できるし、自分のコンピューターでも複雑な設定をせずにアプリケーションを実行できるというわけです。

近頃ではAWSやGCPなどのクラウドサービスでdockerコンテナを動かすことができますので、ローカルPCでテストした状態のものをそのままプロダクション環境にコンテナとして配置(デプロイ)することができます。より安全なソフトウェア開発が進められるということで今やdockerを使わない理由がありません。

やってみようHelloworld

windowsにおけるdockerのインストール

https://docs.docker.com/desktop/install/windows-install/

このページから「Docker Desktop for Windows」をダウンロードしてインストールするだけなのですが、インストールする前に少し手順が必要です。

まず、Windows10でも11でも最新のWindowsUpdateを適用してください。そうでないと動かないことがあります。そしてWSLを有効にしてください。WSLの有効の仕方はMicrosoftのページに書いてありますのでその通りやっていただければできると思います。

そしてBIOSのVirtualizationをONにしてください。ここは初学者には少しむずかしいと思いますが、おそらく最近のパソコンだとデフォルトでONになってると思うので読み飛ばしてもらっても大丈夫です。ONになっていないと自分でBIOSを立ち上げてONにしないと動かないです・・・各社BIOSの上げ方が微妙に違うのでお手元のPCのメーカのページをくまなく読んでいただければと思います・・・。(たぶん基本ONなはずなので大丈夫とは思うのですが・・・)

macにおけるdockerのインストール

https://docs.docker.com/desktop/install/mac-install/

macの場合はインストールするだけで大丈夫ですが、ご自身が使っているmacがintelなのかapple siliconなのかによってインストールするものが変わりますのでご注意ください。

ターミナルにてhello worldを

windowsのターミナルは若干使いにくいのでgit bashをインストールすると良いと思います。

macは標準でついてるターミナル.appで今は大丈夫です。ターミナルにて

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
docker -v
docker -v
docker -v

と実行してみて、dockerのバージョンが表示されたらdockerは正常にインストールされています。

インストールされていることが確認できれば、同じくターミナルで

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
docker run --rm hello-world
docker run --rm hello-world
docker run --rm hello-world

と実行してみると、dockerが用意してくれているhello-worldという名前のイメージが実行されて画面にいろいろ表示されると思います。

いまいちピンとこないかもしれませんがこれでdockerでのhello worldが終わりました。なんというかあっけなく終わった感がありますよね。一つのコンテナで一瞬で終了するので本当に動いたのかどうか怪しいですが、ちゃんと動きました。

dockerイメージって何?

dockerはつくったコンテナをイメージ化して配布することができます。たとえばapache httpd serverのdockerイメージがありますのでそれをとってくるだけでかんたんにすぐにdocker上でhttpサーバが立ち上がります。MySQLもdockerイメージをつくってくれていますので同じです。基本的には世で広く使われているソフトウェアに関してdockerイメージをオフィシャルにつくってくれているのでそれを利用するほうが良いです。自分でほしいコンテナをつくろうと思うとDockerfileを書かなければなりませんので少し手間です。

Dockerfileとは

Dockerfileは、Dockerコンテナを構築するためのテキストファイルです。イメージと呼ばれるDockerコンテナの設計図と考えることができます。このファイルには、アプリケーションの実行に必要な手順や設定が記述されています。

例えば、アプリケーションを実行するために必要なソフトウェアのインストールや設定、ファイルのコピー、特定のポートの開放などの作業を記述することができます。Dockerfileを作成することで、同じ手順で何度もコンテナを作成したり、他の人と環境を共有したりすることができます。

簡単に言えば、Dockerfileは、Dockerコンテナを作成する際の手順書のようなものです。この手順書を元にDockerがコンテナを自動的に構築してくれます。

docker-composeとは

複数のコンテナを簡単に管理するためのツールです。dockerを使う場合docker-composeはだいたい使われていると思います。docker-compose.ymlを書くことで、httpサーバ用のコンテナ・MySQL用のコンテナ・Redis用のコンテナ・アプリケーションサーバ用のコンテナを一度に立ち上げることができます。それぞれのカスタマイズもできますので大変便利です。

docker-compose.ymlの例をあげます。この例ではnginx(httpサーバ)とMySQLがdockerコンテナとして同時に立ち上がることになります。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
services:
nginx:
image: nginx:latest
container_name: myapp-nginx
ports:
- 8080:80
mysql:
image: mysql:latest
container_name: myapp-mysql
ports:
- 13306:3306
environment:
MYSQL_DATABASE: myapp
MYSQL_ROOT_PASSWORD: root
TZ: Asia/Tokyo
services: nginx: image: nginx:latest container_name: myapp-nginx ports: - 8080:80 mysql: image: mysql:latest container_name: myapp-mysql ports: - 13306:3306 environment: MYSQL_DATABASE: myapp MYSQL_ROOT_PASSWORD: root TZ: Asia/Tokyo
services:
  nginx:
    image: nginx:latest
    container_name: myapp-nginx
    ports:
      - 8080:80

  mysql:
     image: mysql:latest
     container_name: myapp-mysql
     ports:
       - 13306:3306
     environment:
       MYSQL_DATABASE: myapp
       MYSQL_ROOT_PASSWORD: root
       TZ: Asia/Tokyo

servicesのところに立ち上げたいコンテナの情報を書いていきます。imageは用意されているimageの名前とバージョンを書きます。portsのところはローカルのポートとコンテナのポートのマッピングを指示しています。これを指定することでポートフォワーディングできるようになり、この例だとローカルの8080ポートはnginxコンテナの80番ポートにポートフォワーディングされてコンテナが返すデータにローカルのブラウザからアクセスすることができます。

立ち上げるにはこのファイルを置いた場所で

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
docker compose up -d
docker compose up -d
docker compose up -d

と実行すればあとは自動でコンテナの立ち上げまでやってくれます

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
docker compose down
docker compose down
docker compose down

と実行するとdocker composeで立ち上げたコンテナすべてを落としてくれます。ひとつひとつ落とすのはちょっとめんどくさいので便利ですね。

dockerを使わない現場はなくなればいいのに

たとえばまだ未だにmampとかvagrantとか言ってるところ正直あると思うのです。技術者のレベルにあわせてそれにしてるんですというところもあるでしょう。ただdocker(compose)を使いだしたら、もう戻れない。mampとかvagrantのベストプラクティスはよく知らないのですが、おそらくプロジェクトごとに設定が大変で毎回環境構築だけですごく時間かかるというのが多いのではないかと想像されます。

dockerならdocker-compose.ymlを共有すれば終わりです。一度つくってしまえばプロジェクトのメンバーが増えてもすぐ対応できます。インフラ構成やっぱりこっちにという場合もファイルを共有して変えるのでと通知すれば終わりです。人の環境ごとの不具合や動作しないなどの問題も発生しません。

ですので未だに複数人のプロジェクトや複数同時並行のプロジェクトでdockerをつかっていない現場はなくなれば良いのにと思います。(もちろんWEBアプリに関してです、それ以外のアプリケーションだとdockerはむずかしい場合もあります)

ぜひ皆さんdockerつかってください。