Docker for WindowsでPHPでプロゞェクトを䜜成する方法

蚘事ずは



この蚘事は、Docker for Windowsのナヌザヌ向けのシンプルで明確な指瀺ずヒントのセットです。 この蚘事は、PHP開発者がプロ​​ゞェクトを迅速に遞択するのに圹立ちたす。 問題ずその解決策に぀いお説明したす。 この蚘事は、WindowsでのDockerの問題を深く掘り䞋げるための無限の時間的リ゜ヌスがない人に圹立ちたす。 著者が以前に同様の蚘事に出くわした堎合、著者は無限に感謝し、著者は倚くの時間ず劎力を節玄できただろう。 テキストにぱラヌや䞍正確さが含たれおいる堎合がありたす。







蚘事ではないもの



この蚘事は、Docker for Windowsの完党で包括的なガむドではありたせん。 この蚘事では、新しいこずや以前は知られおいない事実が開瀺されおいないこずに぀いおは説明しおいたせん。これらはすべお、さたざたな゜ヌスで確認できたす。 蚘事はたた質問に答えたせん-鶏は道路を暪断したしたか










最初のステップは、システムに新しい管理者を远加するこずです



これは重芁なステップです。スキップするか埓わない堎合、おそらく次の指瀺はたったく意味をなさないでしょう。 Windows + Rを実行するず、lusrmgr.msc、「ロヌカルナヌザヌずグルヌプ」が開きたす。 さらなるナヌザヌ、コンテキストメニュヌ、その䞭の「新芏ナヌザヌ...」。 必芁なパスワヌドで新しいナヌザヌdockerhostなどを远加したす。 パスワヌドが必芁です 管理者グルヌプにメンバヌシップを远加したす。 他のグルヌプを远加しないでください。







次に、Docker蚭定の[共有ドラむバヌ]で、必芁なドラむブを遞択し、新しいナヌザヌのデヌタナヌザヌ名ずパスワヌドを入力したす。 蚭定を保存したす。 以前に䜜業䞭のナヌザヌのナヌザヌ名ずパスワヌドを入力した堎合は、新しいナヌザヌのデヌタを入力したす。 予期しない堎所で問題を修正する堎合は、仕事甚アカりントを䜿甚し、蚘事をこれ以䞊読みたせん。










どの構成から始めたすか



むンタヌネット䞊には、PHP Webサヌバヌ甚のあらゆる皮類の構成docker-compose.ymlがありたす。 それらのいく぀かは、Windowsで起動したせん。 docker-compose.ymlゞェネレヌタヌを芋るこずをお勧めしたす。 ゞェネレヌタヌから構成をすぐに取埗したので、埌で構成を線集したした。 最終結果はgithubにアップロヌドされたした。 ゞェネレヌタヌオプションは、いく぀かの点で䞍適切です。 問題の説明ずその解決策を以䞋に瀺したす。










氞続的なデヌタベヌスストレヌゞのセットアップ



問題デヌタベヌスファむルをロヌカルディスクに保存するこずはできたせん。 これは、Windowsでの公理ずしおずらえ、デヌタがコンテナの倖郚に保存されるように、蚱容可胜な解決策を芋぀けようずしたす。 Windowsの堎合、これはボリュヌムずいう名前です。 ほんの数行でこの問題を解決できたす。







postgres: volumes: - db:/var/lib/postgresql/data volumes: db:
      
      





名前付きボリュヌムは、MobiLinuxVMドッカヌ仮想マシンの/ var / lib / docker / volumes /フォルダヌにありたす。 これらのファむルぞの盎接アクセスはなく、䞭間コンテナヌを介しおのみアクセスできたす。 このフォルダヌをWindowsで䜿甚可胜にする方法を決定するのかわかりたせん。 名前付きボリュヌムを管理するには、docker volumeコマンドを䜿甚したす。 たずえば、未䜿甚のdockerボリュヌムを削陀しおボリュヌムを敎理したす。







名前付きボリュヌム内のファむルの暩利ずナヌザヌを増やす必芁はありたせん。Dockerがすべおを凊理しおくれたす。 䞀郚のマニュアルでは、Dockerに氞続的なデヌタベヌスストレヌゞを蚭定するず、暩利の割り圓おに合わせお螊りたす。 Windowsでは、名前付きボリュヌムがないず成功したせん。 たあ、最初に起動するかもしれたせんが、再起動するず曲がりたす。 名前付きボリュヌムを備えた氞続ストレヌゞが機胜し始めたずきのこずを想像するこずさえできたせん。










SSHキヌの远加



たた、名前付きボリュヌムを介しおSShキヌを远加したす。 その理由は、秘密鍵には特別な暩利が必芁であり、通垞のWindowsボリュヌムではこの倚重床が䞎えられないからです。必芁な郚分をdocker-compose.ymlから匕甚したす







 services: php: volumes: - ssh:/root/.ssh volumes: ssh:
      
      





これが機胜するには、指定されたボリュヌムのキヌをコピヌし、秘密キヌぞの暩限を倉曎し、接続をテストする必芁がありたす。 これらすべおのアクションは、単䞀のbatファむルずしお発行できたす。







 docker run -v first_ssh:/root/.ssh --name helper busybox true docker cp ./.ssh/. helper:/root/.ssh/ docker rm helper docker-compose exec php ls /root/.ssh docker-compose exec php chmod 600 /root/.ssh/id_rsa docker-compose exec php ssh git@github.com
      
      





もちろん、スクリプトでは、first_sshの代わりにボリュヌム名を眮き換えたす。 ボリュヌムずいう名前は、ドッカヌによっおCOMPOSE_PROJECT NAME + + sshずしお圢成されるこずを思い出させおください。 ./.sshの代わりに、キヌぞのパスを入力したすたたは、このスクリプトを実行する堎所にキヌを含むフォルダヌを䞀時的にコピヌしたす。 キヌをgithubに远加した堎合、最埌にgithubが挚拶したす。 スクリプトは1回限りであり、コンテナの最初の起動が成功した盎埌に実行する必芁がありたすdocker-compose up -d。 名前付きボリュヌムを削陀した堎合を陀き、繰り返し起動しおも意味がありたせん。










コンテナ間のネットワヌク



1぀のdocker-compose.ymlファむルで説明されおいるコンテナ間を接続するには、䜕も必芁ありたせん。 ホスト名ずしおサヌビス名たたはコンテナ名を指定するだけで十分です。 ポヌト番号を倉曎する必芁はありたせん-デフォルトのポヌトが機胜したす。 これは、別のdocker-compose.ymlからコンテナヌにリク゚ストを送受信する必芁がない堎合に完了できたす。 これにも問題はありたせん。ネットワヌクの名前ずネットワヌク䞊のコンテナを指定するだけです。 目的のセクションdocker-compose.ymlを匕甚したす







 services: php: networks: # this network - default # external network - second_default external_links: - ${EXTERNAL_NGINX} networks: default: driver: bridge second_default: external: true
      
      





グロヌバルネットワヌクセクションでは原則ずしお倉数の䜿甚が蚱可されおいないため、ネットワヌク名second_defaultは環境倉数に配眮されないこずに泚意しおください。 可胜な堎合、phpセクションで倉数を䜿甚するこずは意味がありたせん。 たずえば、そこに倖郚ネットワヌクからコンテナ名を入れたす。 .envファむルでEXTERNAL_NGINX = second_nginxを蚭定した堎合、PHPコヌドでは、ホスト名second_nginxを䜿甚しおhttpリク゚ストを䜜成するだけで十分です。 ポヌトはただ80であり、特別に登録する必芁はありたせん。 githubリポゞトリに、異なるdocker-compose.ymlのコンテナヌ間の接続を確認するためのスクリプトを远加したした。 docker-compose exec php php get.phpを実行しお、機胜しおいるこずを確認するだけで十分です。







コンテナを初めお起動するず、Dockerが誓う堎合がありたす。 ゚ラヌネットワヌクsecond_networkが倖郚ずしお宣蚀されたしたが、芋぀かりたせんでした。 docker network create second_default



を䜿甚しおネットワヌクを手動で䜜成し、再詊行しおください。 実際、そうです、dockerプロンプトを䜿甚しお、手動でネットワヌクを䜜成したす。










ログ蚭定



すべおのサヌビスからのログを、ロヌカルでアクセス可胜な1぀のフォルダヌに入れたいです。 これは、通垞のボリュヌムの助けを借りお行われたす。 䞻なこずは、サヌビス自䜓のロギングを有効にするこずです。 phpの堎合、これらはphp.iniファむル、nginx、その蚭定、postgresのオプションです。 phpずnginxを䜿甚するず、すべおが簡単になりたす-蚭定に察応するファむルがありたす。 postgresの堎合、コマンドラむンオプションを䜿甚する必芁がありたすpostgresql.confファむルにはただパスがありたすが、もう少し耇雑になりたす







 services: postgres: command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs -c client_min_messages=notice -c log_min_messages=warning -c log_min_error_statement=warning -c log_min_duration_statement=0 -c log_statement=all -c log_error_verbosity=default volumes: - ${LOGS_DIR}:/logs
      
      





カブず蚘事の最埌にあるdocker-compose.ymlの党文。 私はただログの蚭定に満足しおいないず蚀わなければなりたせん。 そのたた満足しながら。 ロギングを埮調敎する堎合は、察応するサヌビスのドキュメントを䜿甚できたす。










.envの倉数



docker-compose.ymlをほが普遍的な構成にするための優れたオプションは、.envファむルです。 環境倉数を指定するこずが䞍可胜なグロヌバルネットワヌクセクションのため、完党な汎甚性は機胜したせん。 私のファむルの機胜のうち、postgressの倉数は、docker-compose.yml自䜓に蚘述する必芁はありたせん。 PHPでは、デヌタベヌス接続を䜿甚できたす







 'dsn' => sprintf('pgsql:host=%s;dbname=%s', getenv('POSTGRES_HOST'), getenv('POSTGRES_DB')),
      
      








コンテナ画像



気づいたら、phpずnginxに自分の画像を䜿甚したした。 これにより、テスト䞭の時間を節玄できたした。 他のコンテナむメヌゞの䜿甚を劚げるものは䜕もありたせん。私の構成は単なるデモです。 独自のむメヌゞを簡単に䜜成できたす。カブの䜿甚枈みむメヌゞが䜜成されるビルドフォルダヌを確認したす。










おわりに



誰かがあたりにも面倒で担圓者になれない堎合、docker-compose.ymlの最終バヌゞョンをここで提䟛したす。







 version: "3.5" services: php: image: litepubl/php70:latest container_name: ${FPM_CONTAINER_NAME} env_file: .env working_dir: /var/www/html volumes: - ..:/var/www/html - ./php/php-ini-overrides.ini:/etc/php/7.2/fpm/conf.d/99-overrides.ini - ${LOGS_DIR}:/logs - ssh:/root/.ssh depends_on: - postgres - mongo networks: # this network - default # external network - second_default external_links: - ${EXTERNAL_NGINX} postgres: image: postgres:9.5 container_name: ${POSTGRES_CONTAINER_NAME} env_file: .env ports: - ${POSTGRES_EXT_PORT}:5432 working_dir: /var/www/html command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs -c client_min_messages=notice -c log_min_messages=warning -c log_min_error_statement=warning -c log_min_duration_statement=0 -c log_statement=all -c log_error_verbosity=default volumes: - ..:/var/www/html - db:/var/lib/postgresql/data - ${LOGS_DIR}:/logs mongo: image: mongo:latest container_name: ${MONGO_CONTAINER_NAME} ports: - ${MONGO_EXTERNAL_PORT}:27017 volumes: - mongo:/data/db webserver: image: litepubl/nginx container_name: ${NGINX_CONTAINER_NAME} working_dir: /var/www/html volumes: - ..:/var/www/html - ${LOGS_DIR}:/var/log/nginx/ - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf ports: - ${NGINX_EXT_PORT}:80 depends_on: - php volumes: ssh: db: mongo: networks: default: driver: bridge second_default: external: true
      
      





ご芧のずおり、耇雑なものはなく、すべおが機胜したす。 たた、batファむルの圢匏で蚭蚈したいく぀かの䟿利なコマンドも提䟛したす。 codeceptionテストの実行







 del tests\_output\*.* /f /q del tests\_output\debug\*.* /f /q del logs\debug.log cd docker @cls docker-compose exec php bash test.sh cd ..
      
      





およびtest.sh自䜓







 vendor/bin/codecept run unit --steps --html --debug>testlog.txt
      
      





この蚘事の埌、ドッカヌたたはその他の䜿甚枈みコンポヌネントに関する公匏ドキュメントで、発生した問題を解決できたす。 それがすべお、開発の幞運です。








All Articles