初心者向けの別のDocker記事[nginx + php-fpm + postgresql + mongodb]

画像






すべての良い一日。 港湾労働者の環境を高めるというトピックに関する一連の記事に触発されて、私はこの問題に関する私の経験を共有することにしました。



すぐに予約します。この記事は「初心者から初心者まで」なので、Dockerで環境を設定する過程で抱えていたすべての困難と問題について詳しく説明しようと思います。



猫へようこそ!



以下で説明することはすべて、有名な「果物会社」のラップトップで行いますが、以前にCentos 7でVDSで同じことを行ったので、VDSでどのようにそれをしたかについて少し説明します。 。



docker hubに登録することから自然に開始します。これは、バージョン管理システムとして機能しますが、これはコンテナー専用です。 無料で使用できるDockerハブでは、プライベートリポジトリを1つだけ使用できるため、個々の画像に適切なタグ(nginx、php7-fpm)を付けます。 リポジトリの作成については説明しませんが、だれもこれに問題はないと思います。



これで、ワークステーションにdocker自体をインストールできます 。私の場合、この説明はこちらです。



MacにDockerをインストールすると、すぐに必要なdocker-composeツールを含むdocker toolboxがインストールされます。 これを使用して、共通の環境に関するコンテナを結合します。



Centos 7にdocker-composeをインストールする
残念ながら、VDSでは、 pipを使用して個別にインストールする必要がありました。

yum -y install python-pip pip install docker-compose
      
      





次に、Dockerにログインします。



 docker login
      
      





これで私たちのプライベートリポジトリが利用可能になりました(真実は空ですが)、真実は空になりましたが、すぐに修正します:)



私のプロジェクトでは、次のファイル構造を作成しました。



 ├── contaners #      docker │  ├── fpm │  │  ├── Dockerfile │  │  └── conf │  │  └── fpm.conf #   fpm,    :) │  └── nginx │  ├── Dockerfile │  └── conf │  └── nginx.conf ├── database #      ├── docker-compose.yml ├── logs #     └── php-code #   php  ├── html └── index.php
      
      





php-code / htmlが必要な理由
htmlディレクトリがない場合、nginxコンテナのイメージは起動しません。DockerfileでWORKDIRを指定することで問題が解決することがわかりましたが、このディレクトリはまだ必要です。


プロジェクトでは、nginxとfpmにカスタムイメージを使用するため、それらを別々のディレクトリに配置します。 カスタム画像はDockerfileを使用して記述されます。 ここに私のものがあります:



./contaners/fpm/Dockerfile
 FROM php:fpm MAINTAINER nickname <my-email@domain> RUN apt-get update && apt-get install -y \ libmcrypt-dev \ && apt-get install -y libpq-dev \ && docker-php-ext-install -j$(nproc) mcrypt \ && pecl install mongodb && docker-php-ext-enable mongodb RUN docker-php-ext-install mbstring RUN docker-php-ext-install exif RUN docker-php-ext-install opcache RUN docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \ && docker-php-ext-install pgsql pdo_pgsql COPY conf/ /usr/local/etc/php-fpm.d/ CMD ["php-fpm"]
      
      







./contaners/nginx/Dockerfile
 FROM nginx:latest MAINTAINER nickname <my-email@domain> COPY ./conf /etc/nginx/conf.d/
      
      







./contaners/nginx/conf/nginx.conf
 server { listen 80; index index.php index.html; server_name localhost; error_log /etc/logs/nginx/nginx_error.log; access_log /etc/logs/nginx/nginx_access.log; root /var/www; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass fpm:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }
      
      





Docker Hubの公式PHPイメージのスクリプトを使用すると、必要な拡張機能を簡単にインストールできます。

 docker-php-ext-install
      
      





または



 docker-php-ext-enable #  ,     (    pecl)
      
      





すべての準備作業が完了しました。次に、コンテナがどのように相互作用するかを説明する必要があります。 すでに書いたように、これはdocker-composeを介して行います 。相互作用ルールはdocker-compose.ymlファイルで説明する必要があります 。 これが私のものです:



./docker-compose.yml
 nginx: dockerfile: ./Dockerfile #         build build: ./contaners/nginx ports: - 80:80 volumes: - ./logs:/etc/logs/nginx volumes_from: - fpm:rw environment: - NGINX_HOST=localhost - NGINX_PORT=80 command: nginx -g "daemon off;" #     -,    ) links: - fpm fpm: dockerfile: ./Dockerfile build: ./contaners/fpm volumes: - ./php-code:/var/www:rw
      
      





相対パスの指定に関する注意
ファイルとディレクトリへの相対パスを指定する場合、それらは必ずピリオドで始まる必要があります(現在のディレクトリの指示として)。つまり、たとえば、このようなパスcontaners / nginx / Dockerfile誤って解釈されます。



これでコンテナを実行できます:



 docker-compose up -d
      
      





引数-d
-d引数は、コンソールからコンテナの操作を解放するために指定されます。 デーモンモードで実行する



これですべてです。コンテナは機能し、リンクしますが、何か間違ったことをしました。つまり、コンテナを起動するために常にDockerfileを参照します。これはあまり便利ではありません。 これをやってみましょう:



 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d6263b52380 test_nginx "nginx -g 'daemon off" 8 minutes ago Up 8 minutes 443/tcp, 0.0.0.0:8080->80/tcp test_nginx_1 04370a9e1c73 test_fpm "php-fpm" 8 minutes ago Up 8 minutes 9000/tcp test_fpm_1 docker tag 2d6263b52380 my-login/repo:nginx docker tag 2d6263b52380 my-login/repo:fpm docker push my-login/repo:nginx docker push my-login/repo:php7-fpm
      
      





コンテナは、ドッカーハブと不要になったDockerfileを介して管理されるようになりました。

docker-compose.ymlを修正します。



./docker-compose.yml
 nginx: image: my-login/repo:nginx ports: - 80:80 volumes: - ./logs:/etc/logs/nginx volumes_from: - fpm:rw environment: - NGINX_HOST=localhost - NGINX_PORT=80 command: nginx -g "daemon off;" #     -,    ) links: - fpm fpm: image: my-login/repo:php7-fpm volumes: - ./php-code:/var/www:rw
      
      





そして今、私はphp用のpcntl拡張機能を追加するのを忘れたことに気付きました。 しかし、これは簡単に修正できます。

まず、目的のコンテナに接続します。



 docker exec -it 04370a9e1c73 bash
      
      





そして、必要な拡張子を追加します。



 docker-php-ext-install pcntl
      
      





コンテナに追加しましたが、ドッカーハブをVCSとして使用したいので変更をコミットする必要があります。



 docker commit -m "added pcntl ext" 04370a9e1c73 my-login/repo:php7-fpm
      
      





リポジトリにプッシュします:



 docker push my-login/repo:php7-fpm
      
      





データベースコンテナー(postgresqlおよびmongodb)を追加します。



./docker-compose.yml
 nginx: image: my-login/repo:nginx ports: - 80:80 volumes: - ./logs:/etc/logs/nginx volumes_from: - fpm:rw environment: - NGINX_HOST=localhost - NGINX_PORT=80 command: nginx -g "daemon off;" links: - fpm fpm: image: my-login/repo:php7-fpm volumes: - ./php-code:/var/www:rw links: - mongo - postgres mongo: image: mongo ports: - 27017:27017 #      volumes: - ./database/mongo:/data/db postgres: image: postgres:latest ports: - 5432:5432 #      volumes: - ./database/postgres:/data/postgres environment: POSTGRES_PASSWORD: <myPassword> POSTGRES_USER: postgres PGDATA : /data/postgres
      
      





そして、次を実行します。



 docker-compose up -d
      
      





Dockerは、既に起動されているコンテナに新しいコンテナを追加します。 しかし、外部アクセス用にポートを開きましたが、PostgreSqlに対してのみパスワードを指定しました。mongodbに対しても同じことを行う必要があります。その方法(だけでなく)をここで詳しく説明します



MongoDBの初期管理用途を追加します
 docker exec -it some-mongo mongo admin connecting to: admin > db.createUser({ user: 'jsmith', pwd: 'some-initial-password', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }); Successfully added user: { "user" : "jsmith", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
      
      







PHPのデータベースは、それぞれpostgresおよびmongoホストで利用可能になりました。 たとえば、mongodbに接続するには、次のように記述する必要があります。



 $manager = new MongoDB\Driver\Manager("mongodb://mongo:27017");
      
      





それだけです、ご清聴ありがとうございました。 説明されていることはすべて私自身の経験であり、Dockerを使用して環境をセットアップするための理想的なアプローチであると主張するものではないことに注意してください。



All Articles