すべての良い一日。 港湾労働者の環境を高めるというトピックに関する一連の記事に触発されて、私はこの問題に関する私の経験を共有することにしました。
すぐに予約します。この記事は「初心者から初心者まで」なので、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
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
すべての準備作業が完了しました。次に、コンテナがどのように相互作用するかを説明する必要があります。 すでに書いたように、これは
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を使用して環境をセットアップするための理想的なアプローチであると主張するものではないことに注意してください。