コマンド | 説明 |
---|---|
$ 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 for Windowsの設定注意
$ 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
- ルート(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_mysqlFROMの部分にはイメージ名を指定する。
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のURLhttp://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のコマンドでコンテナ一覧を確認できる。各コンテナは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(画像処理関連ライブラリ)はインストールされていないのでインストールする。手順
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
wsl --set-default Ubuntuバージョンが1になっている場合
wsl --set-version Ubuntu 2
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
docker --version以下のような出力がされればOKです。
Docker version 24.0.6, build ed223bc
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
docker-compose --version以下のような出力がされればOKです。
docker-compose version 1.29.2, build 5becea4c
sudo service docker startちなみにDockerサービスを停止させる場合は以下のコマンドを実行します。
version: '3'
services:
web:
image: nginx:latest
ports:
- "8080:80"
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
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.
permissionの設定: Windowsの場合のみ
この段階でもある程度Dockerは動きますが、2023年時点のWindowsの場合、ボリュームのマウントで不具合が起きます。この不具合はMySQLの関連では致命的になります。 ディレクトリへのアクセス権、つまりpermissionまわりの問題のようですあり、エラーログを見ると以下のようなエラーメッセージが確認されます。mysqld: Cannot change permissions of the file 'private_key.pem' (OS errno 1 - Operation not permitted)
sudo -i
sudo touch /etc/wsl.conf
vi /etc/wsl.conf
[automount] options = "metadata"
exti
exti
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があったこそスムーズに解決できた問題です。