当サイトではDocker-composeを使用したコンテナ連携記事を掲載していますがコンテナにマウントしているデータボリュームの権限を適切に設定しないとWordpressでメディアファイルをアップロード出来ない、Wordpressの対話式アップデートに失敗する等の課題がありました。簡単な解決策は、ディレクトリのパーミッションを777に設定することです。しかしこれは外部からアクセスの無いローカルのテスト環境でしか推奨できません。今回の記事では上記課題の別解決策を紹介します。
目次
1.別解概要
ホストとDockerコンテナ間で共通のユーザ―IDを持つユーザーを作成します。ユーザーIDが共通のユーザーはホストとコンテナで別空間であってもマウントしたフォルダの権限は相互にユーザーIDを基に管理されるようになります。
例えばホストでユーザ―ID=100を持つユーザーが作成したファイルは別コンテナの ユーザ―ID=100を持つユーザーからも自分が作成したファイルとして扱えるとことになります。この特性を使用すればマウントフォルダの権限を777に変更せずに特定(共通ユーザーID)ユーザ―の所有ファイルとして管理できます。
2.現在のコンテナ概要
ベースとするのは、こちらの記事「Docker-Composeでnginx,php,mysqlの3コンテナを連携する 」になります。
(1)コンテナ構成図
上記のようにホストのWWW/dataフォルダを「Nginxコンテナ」と「php7コンテナ」からデータボリュームコンテナを通してマウントしています。このフォルダにWordpressをはじめとするコンテンツファイルが入りますが当フォルダにホストユーザーの所有権を設定しているとWordpressからファイルがアップロード出来ない等の課題がありました。
(2)フォルダ構成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/home/docker/test/phpsql phpsql │ docker-compose.yml ├─data │ │ │ ├─mysql │ │ │ └─www │ └ index.php │ ├─nginx │ Dockerfile │ server.conf │ └─php7 Dockerfile php.ini |
(3)docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
version: '2' services: sqldata: image: busybox volumes: - ./data/mysql:/var/lib/mysql wwwdata: image: busybox volumes: - ./data/www:/var/www/html nginx: build: ./nginx ports: - "80:80" links: - php7 volumes: - ./nginx/server.conf:/etc/nginx/conf.d/server.conf volumes_from: - wwwdata php7: build: ./php7 links: - db volumes: - ./php7/php.ini:/usr/local/etc/php/php.ini volumes_from: - wwwdata depends_on: - "db" db: image: mysql volumes_from: - sqldata environment: MYSQL_ROOT_PASSWORD: "password" TZ="Asia/Tokyo" |
3.目標とするコンテナ概要
(1)コンテナ構成図
(2)修正点
- ホスト側で、UID=1000,GID=1000のユーザ:nginx_dockerを作成します。マウントディレクトリの所有権はnginx_dockerに設定します。
- nginxコンテナ、php7コンテナでUID=1000,GID=1000のユーザ:nginx_dockerを作成します。
- nginxコンテナでnginxサービスの起動ユーザーをnginx_dockerに変更します。
- php7コンテナでphp-fpmサービスの起動ユーザーをnginx_dockerに変更します。
4.ホスト・コンテナ設定手順
(1)ホストの設定
以下の通りグループ・ユーザーを作成します。
1 2 |
# groupadd -g 1000 nginx_docker # useradd -u 1000 -g nginx_docker nginx_docker |
マウントディレクトリ権限を変更します。
1 |
# chown -R nginx_docker:nginx_docker data/www |
(2)Nginxコンテナ設定
・nginx/Dockerfile
グループ・ユーザーを作成するコマンドとnginxをnginx_dockerで起動する為にnginx.confのnginxをnginx_dockerに置換するsedコマンドを登録します。
1 2 3 4 5 6 7 |
FROM nginx:latest MAINTAINER gtrt7@ ARG AGENT_UID=1000 ARG AGENT_GID=1000 RUN groupadd -g ${AGENT_GID} nginx_docker\ && useradd -d /home/docker -u ${AGENT_UID} -g nginx_docker nginx_docker && sed -ie "s/nginx;/nginx_docker;/" /etc/nginx/nginx.conf |
(3)php7コンテナ設定
・php7/Dockerfile
グループ・ユーザーを作成するコマンドを登録します。
1 2 3 4 5 6 7 |
FROM php:7-fpm MAINTAINER gtrt7@ ARG AGENT_UID=1000 ARG AGENT_GID=1000 RUN apt-get update && docker-php-ext-install pdo_mysql mysqli mbstring\ && groupadd -g ${AGENT_GID} nginx_docker\ && useradd -d /home/docker -u ${AGENT_UID} -g nginx_docker nginx_docker |
・php7/www.conf
php-fpmをnginx_dockerで起動する設定を追加します。
1 2 3 4 5 |
listen.owner = nginx_docker listen.group = nginx_docker listen.mode = 0660 user = nginx_docker group = nginx_docker |
(4)docker-compose.yml
以下の差分を追加します。php7コンテナでwww.confをマウントする設定です。
1 2 3 |
php7 volumes: - ./php7/www.conf:/usr/local/etc/php-fpm.d/zzz-www.conf |
(5)コンテナ再起動
起動中のコンテナを停止し、Buildオプションを付加して再起動します。
1 2 |
# docker-compose stop # docker-compose up -d --build |
既存のイメージは新たにBuildされたイメージで置換され設定ファイルが反映された状態で起動します。
5.参考にさせて頂いたサイト
Concrete5 on Nginx + php7-fpm を docker-compose でやってみた
Dockerコンテナ内のユーザとホストのユーザとの関係について
ありがとうございます。