VM

提供:senooken JP Wiki
2024年11月19日 (火) 11:21時点におけるSenooken (トーク | 投稿記録)による版 (OS から VM に分離。)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

UTM

Control

Capture

Controls | UTM Documentation

デフォルトだと、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

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

dockerfile - Is it possible to set the default command when the `docker exec` command is run on an already running container? - Stack Overflow

docker exec実行時は、デフォルト実行されるコマンドはない。[Bash Startup Files (Bash Reference Manual)] にあるように、BASH_ENVに指定したファイルを非対話実行でも読み込むのでこれを指定して、常にbash -cで実行する。

あるいは、BASH_ENVを指定せずに、bash -c 'umask 002; 'で実行する。

他に上記にあるように、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プロセスの確認