VM
UTM
Control
Capture
デフォルトだと、Control-Tabなど、一部のMac本体のホットキーが有効になっている。例えば、Windows側でc-tabを入力できなくて困る。
4番のボタンまたは、control-optionで、カーソルとキーボードをVMでキャプチャーする。これで入力可能になる。
Docker
Network
docker network ls
上記コマンドでコンテナーごとのネットワーク識別子を確認できる。コンテナー同士で同一ネットワークにするには、片方のservices.networks:でこのネットワーク識別子を指定する。
Compose
phpのアプリサーバー、DBサーバーを一つのイメージで作ることもできるが、別のイメージにして連動させることもできる。別のイメージ・コンテナーにしたほうが、管理しやすい模様。
docker composeで複数のイメージ・コンテナーを一体に管理できる。その際に、特有の事項がある。
PHPのPDOをDockerコンテナ内で使おうとしたところ、"No such file or directory" エラーが発生した話 #docker-compose - Qiita
docker composeで一体管理しているコンテナー群は、同一ネットワークに参加する。ホスト名はservice名になる。したがって、例えばアプリサーバーからDBサーバーへのアクセス時には、ホスト名に注意する。
How-tos
Use environment variables
Use environment variables | Docker Docs
Set environment variables within your container's environment
Set environment variables | Docker Docs
Interpolation
.envファイルで環境変数を渡せる。
Dockerfileにも渡すことができる。
https://chatgpt.com/c/673bedde-f5d0-800b-b604-fbb93c2dffe4
docker-compose.ymlのargsで引数として.envの環境変数を設定。
version: '3.8' services: app: build: context: . dockerfile: Dockerfile args: APP_ENV: ${APP_ENV} ports: - "${APP_PORT}:80"
Dockerfileで受け取って参照。
FROM php:8.1-cli # ビルド引数を定義 ARG APP_ENV # ビルド時の環境変数を設定 ENV APP_ENV=${APP_ENV} # 確認用 RUN echo "App Environment: $APP_ENV" WORKDIR /app
Image
PHP
Ref: php - Official Image | Docker Hub.
Dockerの公式PHPイメージを使う場合、いくつかPHP関係のライブラリーや拡張モジュールをインストール・設定するための専用コマンドが用意されている。
RUN pecl install memcached-3.2.0 \ && docker-php-ext-enable memcached
peclの拡張機能インストール時はバージョン指定が推奨される。
docker-php-ext-install
Docker で PHP 拡張モジュールをインストールする | QUARTETCOM TECH BLOG
PHP拡張モジュールのインストールと設定を行うヘルパーコマンドが用意されている。--helpで対象拡張モジュール一覧を確認できる。
$ docker run php:latest docker-php-ext-install --help # ..... Possible values for ext-name: bcmath bz2 calendar ctype curl dba dl_test dom enchant exif ffi fileinfo filter ftp gd gettext gmp hash iconv imap intl json ldap mbstring mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell random readline reflection session shmop simplexml snmp soap sockets sodium spl standard sysvmsg sysvsem sysvshm tidy tokenizer xml xmlreader xmlwriter xsl zend_test zip # .....
PECL以外は一通り使用可能。
error
docker-php-ext-installでインストールする際には、必要な依存関係もセットで指定しないとエラーが出る。
FROM php:7.3.23-apache RUN apt update RUN docker-php-ext-install pdo_mysql RUN apt install -y libbz2-dev && docker-php-ext-install bz2 RUN apt install -y libpng-dev && docker-php-ext-install gd RUN apt install -y libzip-dev && docker-php-ext-install zip RUN apt install -y ssl-cert && a2enmod rewrite ssl && a2ensite default-ssl COPY --from=composer /usr/bin/composer /usr/bin/composer
ヘッダーのあるlib*-devもセットでインストールしておく。
phpmyadmin
Ref: phpmyadmin - Official Image | Docker Hub.
以下のdocker-compose.ymlを格納しておいて、networksのところをつなげたいやつにあわせる。
services:
phpmyadmin:
image: phpmyadmin
restart: always
ports:
- 8080:80
environment:
- PMA_ARBITARY=1
networks:
- development_default
# - wordpress_default
networks:
wordpress_default:
external: true
development_default:
external: false
特に重要な環境変数。
PMA_ARBITRARY
- when set to 1 connection to the arbitrary server will be allowed- PMA_HOST: デフォルトはdb。servicesがdb以外なら指定必要。
- PMA_USER/PMA_PASSWORD=phpmyadminのデフォルトユーザー。これを指定しておくと、自動ログインする。
MySQL
import
Ref: Import data.sql MySQL Docker Container - Stack Overflow.
docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql
上記のようなコマンドで取り込む。
Error
connect ENOENT \\.\pipe\errorReporter
https://github.com/docker/for-win/issues/14080
再起動で直るらしい?
インストール時のアカウントの権限があるので、アカウント権限がある状態で再インストールするとOK。
`version` is obsolete
【docker compose】警告`version` is obsoleteの解決法
$ docker compose up time="2024-07-02T09:54:45+09:00" level=warning msg="C:\\Users\\senoo_0901\\project\\main\\GASProj\\docker\\docker-compose.yml: `version` is obsolete"
docker compose v2からversion指令は廃止になった。単純に削除すればいい。
Other
RUN/CMD/ENTRYPOINTの違い
Dockerfileでコマンドを実行する指令が複数ある。違いを整理する。
- RUN: イメージ作成時=docker build字に実行。ソフトウェアのパッケージインストール、ファイルコピー変更などを行う。
- CMD: コンテナ開始時=docker start、作成時=docker run時に実行される。docker run時のコマンドのデフォルト値。引数があればそちら優先。VolumeのバインドはRUN後になるのでCMD/ENTRYPOINTで行う必要がある。
- ENTRYPOINT: コンテナ開始時=docker start、作成時=docker run時に実行される。docker run時に強制実行。上書き不能。ただし、CMDや実行時に引数を後ろに追加できる。
CMD/ENTRYPOINTはDockerfile内でそれぞれ1回しか指定できない。一番最後の指定で上書きされる。
「The shell form of ENTRYPOINT
prevents any CMD
command line arguments from being used.」とあるように、 ENTRYPOINTとCMDを併用する場合、exec形式で指定しないとCMDが無視される。
「How to combine CMD and ENTRYPOINT - Open Source Projects / Compose - Docker Community Forums」
ENTRYPOINTにコマンドを追記したい場合、entrypoint.shのようなスクリプトを実行する形にして、スクリプト内で引数処理するのがいいらしい。
権限設定
Apache HTTP Serverの/var/wwwの権限設定 | GNU social JP Web
Why does chown not work in RUN command in Docker? - DevOps Stack Exchange
バインドボリュームする場合、RUNの後にバインドされるからCMDで設定が必要。
DockerfileにENTRYPOINTもCMDも無い?? | へるぷログ
CMD/ENTRYPOINTを指定しない場合、元イメージのCMD/ENTRYPOINTが実行される模様。apacheだとapache2-foregroundコマンド。
docker-composeでコンテナの初回起動時に特定の処理を行う方法 #Docker - Qiita
初回起動時に処理をする方法もあるが、一時ファイルを生成するなどするもの。権限設定は毎回実行してもOKなものなので、毎回実行する。
umask for non-root users not as expected · Issue #1142 · docker-library/php
/root/.bashrcにumaskを指定する。これがないと、コマンドラインでdocker exec -i で実行した際デフォルトのumask 022でのファイル生成になり、この作業コマンドでログが発生したら、サーバープロセスから追記できない。
FROM php:7.3.23-apache RUN apt update && apt install -y \ ssl-cert RUN docker-php-ext-install pdo_mysql RUN a2enmod rewrite ssl RUN a2ensite default-ssl COPY --from=composer /usr/bin/composer /usr/bin/composer ENV BASH_ENV /root/.bashrc RUN usermod -aG www-data root \ && echo "umask 002" >>/root/.bashrc CMD chgrp -R www-data /var/www && chmod 2775 /var/www \ && find /var/www -type d -exec chmod 2775 {} \; \ && find /var/www -type f -exec chmod 0664 {} \; \ && apache2-foreground
docker exec実行時は、デフォルト実行されるコマンドはない。[Bash Startup Files (Bash Reference Manual)] にあるように、BASH_ENVに指定したファイルを非対話実行でも読み込むのでこれを指定して、常にbash -cで実行する。
あるいは、BASH_ENVを指定せずに、bash -c 'umask 002; 'で実行する。
- docker - Why is umask setting in dockerfile not working? - Stack Overflow
- Libertyコンテナでumaskを変える #Docker - Qiita
他に上記にあるように、ENTRYPOINTでumaskを指定する方法がある。が、これは関係ない気がする。chomd 2775 /var/wwwでスティッキーを指定しているから、後続の作成時は自動で2775になっているはずだから。
docker runとexec
docker runとdocker execの違いの解説 | めもたんす
run: イメージ作成・実行。
exec: 起動中のイメージで実行。
Japanese input/日本語入力
OSに日本語のロケールが入っていないのが原因。
Debian系の場合。
## For Japanese input. RUN apt install -y locales RUN (rm /etc/locale.gen && sed '/# ja_JP.UTF-8 UTF-8/s/# //' >/etc/locale.gen) </etc/locale.gen RUN locale-gen ENV LANG=ja_JP.UTF-8
/etc/locale.genのファイルの修正が必要。
これで日本語が使用可能になる。
cron
How to run a cron job inside a docker container? - Stack Overflow
Docker内でcronを実行する方法がいくつかある。
## For cron. RUN apt install -y cron RUN (crontab -l ; echo '* * * * * /usr/local/bin/php /var/www/artisan schedule:run >/dev/null 2>&1') | crontab CMD cron # CMDは最後の1個しか有効じゃないので、最後にまとめて指定することに注意する。
動作確認
crontab -l # crontabの確認 pgrep cron # cronプロセスの確認
認証情報
composerでプライベートリポジトリーをinstallしようとすると少々厄介。
https://chatgpt.com/c/673bedde-f5d0-800b-b604-fbb93c2dffe4
いくつか方法がある。.envに認証情報を記入して、それを参照するのがシンプル。
docker-compose.yml
version: '3.8' services: app: build: context: . environment: COMPOSER_AUTH: '{"github-oauth":{"github.com":"YOUR_PERSONAL_ACCESS_TOKEN"}}' volumes: - .:/app