よく使うコマンド一覧

docker-composeコマンドは基本的に、docker-compose.ymlが配置されているディレクトリにcdコマンドで移動してから実行すること。

コマンド説明
$ docker-compose up -d --build docker-composeで最も基本的なコマンド。
docker-compose.ymlの情報を元にDockerイメージのインストールやDockerコンテナの起動を行う。
Dockerコンテナの起動はstartコマンドでもできるが、 docker-compose.ymlを書き換えたときはこちらのupコマンドを実行すること。

$ docker-compose stop Dockerコンテナを停止状態にする。
「$ docker-compose start」コマンドで再開することができる。
$ docker-compose start 停止中のDockerコンテナを再開する。
$ docker exec -it コンテナ名 bash コンテナにアタッチしてコンテナ内にアクセスする。
$ winpty docker exec -it xxx_php_1 bash

docker-composeのインストール

Docker for Windowsの設定注意

Windows10のインジケーター(右下の常駐アプリアイコン)のDockerアイコンを右クリックし、「Switch to Linux containers」をクリックしてLinuxコンテナとして動作させること。

ターミナルのCURLコマンドでdocker-composeをダウンロードおよびインストールすることができる。

ターミナル(Git for Bash, power shell)などを起動し、下記のコマンドを実行する。
	$ cd ~/bin/docker-compose
	$ curl -L https://github.com/docker/compose/releases/download/1.25.0-rc4/docker-compose-`uname -s`-`uname -m` -o bin/docker-compose chmod +x bin/docker-compose
	

インストールできたか確認する。(バージョンを確認)
$ docker-compose --version




参考サイト

docker-compose.yml 環境構築→PHP+Apatche+MySQL DB接続例

ディレクトリ構造の例。
- ルート(C:\Users\ユーザー名)
	- git ← マウントするディレクトリ(apacheで言うhtdocsに相当する場所)
		- docker_demo ← docker制御用のプロジェクト
			- docker-compose.yml
			- php.ini
			- php
				- Dockerfile
		- animal ←その他プロジェクト
			- neko.html ←サンプルHTML
	

docker-compose.yml

version: '3'

services:
  php:
    build: ./php
    volumes:
      - ../:/var/www/html
      - ./php.ini:/usr/local/etc/php/php.ini
    ports:
      - 80:80
  mysql:
    image: mysql:5.7
    volumes:
      - ./mysql:/var/lib/mysql
    ports: 
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - DB_SOCKET=/var/run/mysqld/mysqld.sock
      - MYSQL_DATABASE=cake_demo
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 8088:80
    volumes:
      - ./phpmyadmin/sessions:/sessions
	

Dockerfile

FROM php:7.4.13-apache-buster

RUN apt-get update \
    && docker-php-ext-install pdo_mysql
	
FROMの部分にはイメージ名を指定する。
pdo_mysqlはPDOを使えるようにするモジュール(PDOはDBアクセスに必要)。 Dockerコンテナが立ち上がった状態から、各種モジュールをインストールすることも可能。下に記述している「GDをインストール」を参考。

php.ini

memory_limit = 256M
post_max_size = 256M
upload_max_filesize = 64M
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
	

起動

docker-compose.ymlを元にイメージのインストールおよびコンテナを起動する。
	$ cd ~/git/docker_demo
	$ docker-compose up -d --build
	

サンプルWEBページを動かす

以下のようなURLでDockerコンテナ内のWEBページにアクセス可能
http://localhost/animal/neko.php

phpmyadminを動かす

phpmyadminのURL
http://localhost:8088

DB管理ツールへの設定例→HeidiSQLの場合



PHPでDB接続設定する例(PDOの例)


$host = 'docker_demo_mysql_1'; // Dockerコンテナ名を指定
$dbname = 'cake_demo';
$port = '3306';
$charset = 'utf8mb4';
$dsn = "mysql:dbname={$dbname};host={$host};port={$port};charset={$charset};";
$user = 'root';
$password = 'root';

global $dao;
try {
	$dao = new PDO($dsn, $user, $password);
	echo "DB接続成功<br>";
} catch (PDOException $e) {
	echo "DB接続失敗<br> " . $e->getMessage() . "¥n";
	exit();
}
	

php.iniを変更した場合

php.iniを変更した場合、 「docker-compose stop」コマンドでコンテナ群を一旦停止させたあと、 「docker-compose up -d --build」コマンドでコンテナを再起動すること。
コンテナを停止させずに「「docker-compose up -d --build」」を実行してもphp.iniの変更は反映されないので注意。

コンテナ一覧を確認する

dockerのコマンドでコンテナ一覧を確認できる。各コンテナはdockerコマンドで操作可能。
$ docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED        STATUS          PORTS                  NAMES
576943301b4d   php:7.4.13-apache-buster   "docker-php-entrypoi…"   12 hours ago   Up 54 minutes   0.0.0.0:80->80/tcp     docker_demo_php_1
e7aaa1afb467   phpmyadmin/phpmyadmin      "/docker-entrypoint.…"   35 hours ago   Up 54 minutes   0.0.0.0:3306->80/tcp   docker_demo_phpmyadmin_1
7cbf3ac6b56f   mysql:5.7                  "docker-entrypoint.s…"   35 hours ago   Up 54 minutes   3306/tcp, 33060/tcp    docker_demo_mysql_1
	

GDをインストール

PHPのGD(画像処理関連ライブラリ)はインストールされていないのでインストールする。
参考:DockerコンテナにてGDを使えるようにする | PHP7.4



Docker desktopを使わずWSL上で動作するUbuntuでDockerとdocker-composeを動かす

「Docker desktop」は不具合がとても多い。Docker desktopをアップデートするたびに何らかの不具合が発生する。 しかし、WindowsでDockerを使うのに「Docker desktop」は必要ではない。
WSL(Windows Subsystem for Linux)が正常に動作しているのであれば、WSL上でUbuntuを動かし、Ubuntuを通してDocker環境を構築することが可能である。


手順

  1. wslを有効化されていることを確認、および有効化します。
    【有効化する方法】
    Windowsのコントロールパネルから[プログラムと機能]をクリックします。 [Windows の機能の有効化または無効化]をクリックします。 [Windows Subsystem for Linux]にチェックを入れ、[OK]をクリックします。
  2. Microsft Storeから Ubuntu アプリをインストールします。
    いくつかバージョンがあるようですが、インストール件数が多いバージョンを選べばよいと思います。私は無印のUbuntuを選択しました。
  3. Ubuntuを管理者権限で実行します。
    管理者権限で実行するにはWindows上のUbuntuのアイコンを右クリックし、"その他" → ”管理者として実行"を選択すると、管理者権限でUbuntuが起動します。
    初回アクセス時に、アカウントやパスワード作成が求められますのでその通りにします。パスワードは初回以降のUbuntu起動の際、入力を求めれます。

    管理者権限で実行しないとC:\ドライブ以下にあるファイルやディレクトリにアクセスできないです。

  4. wsl上でUbuntuが動いているか Windows PowerShell で確認します。 Windows PowerShellを管理者権限で開き(Windows PowerShellのアイコンを右クリックし、”管理者として実行する"を選択)、 以下のコマンドを実行します。
    wsl -l -v
    以下の感じで出力されればOKです。下記の例では私が試行錯誤したせいで、Debianやdocker-desctopも存在してしまっています。
    PS C:\Windows\system32> wsl -l -v
      NAME                   STATE           VERSION
    * Ubuntu                 Running         2
      docker-desktop-data    Stopped         2
      Debian                 Stopped         2
      docker-desktop         Stopped         2
    			


    以下の状態になっている場合、コマンドで修正してください。

    「*」がUbuntuについていない場合、
    wsl --set-default Ubuntu
    バージョンが1になっている場合
    wsl --set-version Ubuntu 2
  5. Dockerをインストールします。
    再び、Ubuntuに戻り、Ubuntuで以下のコマンドを一つずつ実行します。
    sudo apt update
    sudo apt install apt-transport-https ca-certificates curl software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    sudo apt update
    sudo apt install docker-ce
    			
  6. Dockerの動作確認をします。
    docker --version
    以下のような出力がされればOKです。
    Docker version 24.0.6, build ed223bc
  7. 続いてdocker-composeもインストールします。以下のコマンドを一つずつ実行します。
    sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    			
  8. docker-composeの動作確認をします。
    docker-compose --version
    以下のような出力がされればOKです。
    docker-compose version 1.29.2, build 5becea4c
  9. Dockerサービスを動かします。(Dockerを稼働状態にする)
    sudo service docker start
    ちなみにDockerサービスを停止させる場合は以下のコマンドを実行します。
    sudo service docker stop

  10. 最低限な「docker-compose.yml」を作成し、Dockerで開発環境を構築してみます。
    任意のディレクトリに「docker-compose.yml」ファイルをテキストエディタなどで作成し、以下を記述します。

    私は「C:\Users\user\git\docker_demo2」のディレクトリにdocker-compose.ymlを作成しました。この例で以下の手順を説明します。

    docker-compose.ymlの内容
    
    version: '3'
    
    services:
      web:
        image: nginx:latest
        ports:
          - "8080:80"
    			
  11. Ubuntuでdocker-compose.ymlを配置したディレクトリへ移動し、docker-compose.ymlをdocker-composeで動かします。
    cd /mnt/c/Users/user/git/docker_demo2
    docker-compose up -d --build
    			

    「docker-compose up -d --build」の実行例

    amaraimusi@DESKTOP-PE1E9IO:/mnt/c/Users/user/git/docker_demo2$ docker-compose up -d --build
    Creating network "docker_demo2_default" with the default driver
    Pulling web (nginx:latest)...
    latest: Pulling from library/nginx
    a803e7c4b030: Pull complete
    8b625c47d697: Pull complete
    4d3239651a63: Pull complete
    0f816efa513d: Pull complete
    01d159b8db2f: Pull complete
    5fb9a81470f3: Pull complete
    9b1e1e7164db: Pull complete
    Digest: sha256:32da30332506740a2f7c34d5dc70467b7f14ec67d912703568daff790ab3f755
    Status: Downloaded newer image for nginx:latest
    Creating docker_demo2_web_1 ... done
    			
  12. ブラウザで「http://localhost:8080/」にアクセスし、以下のようなサイトが表示されれば成功です。
    			Welcome to nginx!
    			If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
    			
    			For online documentation and support please refer to nginx.org.
    			Commercial support is available at nginx.com.
    			
    			Thank you for using nginx.
    		
  13. 追記:

    permissionの設定: Windowsの場合のみ

    この段階でもある程度Dockerは動きますが、2023年時点のWindowsの場合、ボリュームのマウントで不具合が起きます。この不具合はMySQLの関連では致命的になります。 ディレクトリへのアクセス権、つまりpermissionまわりの問題のようですあり、エラーログを見ると以下のようなエラーメッセージが確認されます。
    mysqld: Cannot change permissions of the file 'private_key.pem' (OS errno 1 - Operation not permitted)

    以下にディレクトリのpermissionの設定をwslで行う手順を示します。 (参考サイト)
    1. Ubuntuを起動します。
    2. root権限でログインする。
      sudo -i
    3. wslの設定ファイルwsl.confが存在しなければ作成する。
      sudo touch /etc/wsl.conf
    4. viでwsl.confを開き、iキーを押して挿入モードにする。
      vi /etc/wsl.conf
    5. wsl.confに下記を記述する。
      [automount]
      options = "metadata"
      					
    6. root権限を抜ける
      exti
    7. user権限を抜ける
      exti
    8. 管理者権限でPowerShellを起動します。
      →Powrshellアイコンで右クリックして「管理者として起動する」を選択
    9. wslを再起動するため、一旦シャットダウンして再スタートする。PowerShellで以下のコマンドを実行する。
      wsl --shutdown
      wsl
      					

エラーが出た場合どうするか?

エラーログをしらべて、エラーメッセージを探してください。 そのエラーメッセージをChat GPTで解説してもらうと良いです。 エラーログを表示するコマンド
$ sudo cat /var/log/docker.log
正常にdockerを動かせること稀です。私もdockerを動かすのに試行錯誤しました。

例として以下のようなエラーがあるようです。
iptablesのバージョンとモード:

エラーメッセージには iptables v1.8.7 (nf_tables) と表示されています。これは、iptables が nftables モードで動作していることを示しています。
Dockerは、以前の iptables モードである legacy モードとの互換性がより高いです。nftables モードと legacy モードの間で競合が発生することがあります。
対処法: iptables を legacy モードに切り替えてみることをおすすめします。

bash
Copy code
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
	
	
こんなこと全然知りませんでしたし、Chat GPTがあったこそスムーズに解決できた問題です。