目次

Docker

初学者のメモ書きなので、適当な理解と誤った記述が大量に含まれる恐れがあります。

できること

仮想環境を作る技術・ツール。

環境構成の設定ファイルさえあれば、それをもとにコマンド一発で、 たとえば「ApacheとMySQLとPHPが入って設定も済んだ仮想サーバ」がすぐできるよ!みたいな。

使用場面

基本的にはこんなところと理解。

従来のツールとの違い

仮想化だけならVirtualBoxなどのツールも以前からあったけど、 Dockerは動作・消費メモリが軽いというところが大きなメリット。

なので、「1つの仮想環境にApacheとPHPを入れる」より、「Apacheだけ入った仮想環境、PHPだけ入った仮想環境を個別に用意して、連携させる」というやり方が主流っぽい? それでも、PCスペック的にそこまで重くない。

このやり方は、「MySQLで開発してたけど、MongoDBの方がいいかな」みたいな時に、 サービスを簡単に入れ替えられるなどのメリットがある。

使用するDockerの選択

Windowsでの使用を想定すると、ややこしいことに「Docker Desktop for Windows」とか「Docker on WSL2」とか、 同じDockerでも複数のツールの名前が出てくる。

基本的にDockerはLinux向けに開発されたツールなので、Windowsでは仮想化されたLinux上から使うことになる。
(つまり、仮想Linuxの中からさらにDockerの仮想環境を立ち上げることになる)

2019年に、WSL2(Windows上で仮想Linuxを走らせるシステムのver.2)がWindowsに標準装備され、 その上でDockerも実行できるようになったので、現在はこれを使っとけば問題ない。(WSL1の頃はできなかった)

WSL2上でDockerを動かすのは各ツールで共通していて、

なお、Docker Desktopは、2021年9月から、ビジネスで使う際には有料化されている。

また、Docker Desktopは、Hyper-Vなど、WSL2以外のDockerが動く仮想環境もサポートしているが、まぁ、WSL2でいいと思う。

事前準備

WSL2の設定

まずはWSL2を有効化する。

Dockerのインストール

WSL2上のLinux(ここではUbuntu)で、dockerをインストール。

$ sudo apt update
$ sudo apt install docker

起動

$ sudo service docker start

毎回手動で起動させるのは手間なので、自動起動させたい。
普通の(WSLでない)Linuxと同様の方法とはいかないが、一応タスクスケジューラなどで設定できる。

Docker Composeのインストール

サービスごとに仮想環境を作成して連携させる、という使い方をするにあたり、 複数の仮想環境間の連携を1つの設定ファイルで管理できるようにするツール。

dockerのプラグイン(という呼び方でいいのかな)としてインストールする方法と、バイナリとしてインストールする方法がある。

コマンドに若干の違いはあるが、大きな違いは無さそう?
Web上の解説記事ではバイナリの方法を紹介している例が多いか。

プラグインの場合
$ docker compose ○○

バイナリの場合
$ docker-compose ○○

基本的に上記サイトのコマンドを実行していけばよい。
バージョン番号だけ、現在有効な最新バージョン(または希望のバージョン)を調べて書き換える。

使い方

docker-compose.yml を書く。

フォルダ構成としては、例えば以下のようになる。

project-root/
 |
 |- src/                  ... プログラムのソースコードなど
 |
 |- docker/               ... docker用の設定ファイルなど
 |   |- httpd/            ... dockerの各サービスごとのファイル
 |   |   |- Dockerfile
 |   |   |- httpd.conf    ... サービスの設定ファイル
 |   |
 |   |- php/
 |   |   |- php.ini       ... サービスの設定ファイル
 |
 |- docker-compose.yml

docker-compose.yml に所定の情報を記述して、その階層をカレントフォルダとして

$ docker-compose up -d

のコマンドで、コンテナたちが起動して利用可能になる。

また、各フォルダの意図は下記の通りとなる。

docker-compose.yml例
version: "3.9"
services:
  apache:
    build: ./docker/httpd
    volumes:
      - ./html:/usr/local/apache2/htdocs
      - ./docker/httpd/httpd.conf:/usr/local/apache2/conf/extra/httpd.conf

トラブルシューティング

実行ユーザによる権限エラー

「マウントしたボリュームに、Dockerユーザも書き込むし、Docker外のLinuxユーザも書き込む」場合などに、発生しうる。

Linux(WSL2)側のユーザと、Dockerのユーザが異なっていることが原因。

通常、WSL2のユーザは、UID:1000 GID:1000 の名無しさんになる。
一方、Dockerのユーザは、そのイメージに依存するが、rootだったり、別ユーザだったりする。

マウントしたボリューム上のファイル権限は基本的にLinux側を引き継ぐため、たいてい 1000:1000 が所有者・所有グループとなる。

個人でしか使わない場合、docker-compose.ymlではそのコンテナを実行するユーザを指定できるので、user: 1000:1000 を指定してDocker側でも同じUIDで実行するようにしてやればよい。が、

などの問題が発生する。(後者は外部注入できるかもしれない)