Dockerを利用してWebサイトの開発環境を構築する方法

24922 ワード

準備作業
前の章では、WindowsにDockerをインストールする方法と、一般的なコマンドについて説明しました.
これらの準備ができていない場合は、まず参考にしてください. https://blog.csdn.net/lamp_yang_3533/article/details/77801992 .
以下では、Dockerを使用してWebサイトの開発環境を構築する方法について具体的に説明します.
ThinkPHP 5.1を例に、Windowsでdockerを利用してtp 5プロジェクトの開発環境を構築する方法を紹介します.
  • nginx 1.13.7

  • php 7.1.12(php-fpm)
    mysql 5.7.22
    redis 4.0.9
    docker-compose.ymlファイルの作成
    Windowsのユーザーホームディレクトリ(C:UsersHP、略記~)にフォルダdocker_を作成data,そして~/docker_dataでdocker-compose.ymlファイルを作成します.
    内容は次のとおりです.
    version: '3.6'
    
    services:
      web:
        image: richarvey/nginx-php-fpm:latest
        restart: always
        container_name: dr-web
        ports:
          - "80:80"
          - "9000:9000"
        networks:
          - dockerinnernet
        depends_on:
          - mysql
          - redis
        volumes:
          - ~/docker_data/wwwroot:/var/www/html
    
      mysql:
        image: mysql:5.7.22
        restart: always
        container_name: dr-mysql
        ports:
          - 3306:3306
        networks: 
          - dockerinnernet
        volumes:
          - mydata:/var/lib/mysql
          - ~/docker_data/dbdump:/root
        environment:
          - MYSQL_ROOT_PASSWORD=123456
          - MYSQL_DATABASE=test_db
      redis:
        image: redis
        container_name: dr-redis
        ports:
          - "6379:6379"
        networks: 
          - dockerinnernet
        volumes:
          - ~/docker_data/redis:/data
    networks: 
      dockerinnernet:
    volumes:
      mydata:

    上記のコードでは、nginxとphp-fpmを同時に含むnginx-php-fpmミラーを使用しています.ミラーを別々に引くこともできます.
    スターティングコンテナ
    まずdockerを実行する必要があります.デスクトップのショートカットDocker Quickstart Terminalをクリックすると、Linux仮想マシンとdockerが起動します.
    開いている端末に、次のコマンドを入力します.
    #          docker_data    
    $ cd  ~/docker_data
    
    #          
    $ docker-compose up -d

    上記のコマンドは、docker-compose.ymlプロファイルに基づいて、リモート・ウェアハウスからミラーを自動的に引き出し、対応するコンテナ・インスタンスを作成および実行します.
    次の印刷情報が表示されます.
    ...
    Creating dr-redis ... done
    Creating dr-mysql ... done
    Creating dr-web   ... done

    コンテナの起動に成功したことを示します.
    ローカルのすべてのミラーを表示
    $ docker images
    REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
    mysql                     5.7.22              0164c13b662c        2 days ago          372MB
    redis                     latest              c5355f8853e4        3 weeks ago         107MB
    richarvey/nginx-php-fpm   latest              cea38a28b888        4 months ago        281MB

    実行中のコンテナの表示
    $ docker ps
    CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                                                 NAMES
    94168b153bcf        richarvey/nginx-php-fpm:latest   "docker-php-entrypoi…"   47 seconds ago      Up 48 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:9000->9000/tcp, 443/tcp   dr-web
    326d294a80c1        mysql:5.7.22                     "docker-entrypoint.s…"   47 seconds ago      Up 49 seconds       0.0.0.0:3306->3306/tcp                                dr-mysql
    6ce9fae6c1a2        redis                            "docker-entrypoint.s…"   47 seconds ago      Up 49 seconds       0.0.0.0:6379->6379/tcp                                dr-redis

    VMリストの表示
    $ docker-machine ls
    NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
    default   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.04.0-ce

    これにより,Linux仮想マシンのIPアドレスが192.168.99.100であることが分かった.
    Windowsのブラウザでのアクセス http://192.168.99.100/ ,得られた結果は403 Forbiddenであった.これは、Webサイトのルートディレクトリにファイルがないためです.
    WindowsシステムのC:UsersHPdocker_ではDatawwwrootディレクトリでphpinfo.phpファイルを新規作成します.コードは次のとおりです.
    
    
    phpinfo();

    Webサーバのルートディレクトリのマッピングを行いました
    volumes:
          - ~/docker_data/wwwroot:/var/www/html

    だから、~/docker_Data/wwwrootディレクトリで変更が発生するとdockerサービスのdr-webコンテナインスタンスの/var/www/htmlディレクトリに自動的に同期します.
    注意:このディレクトリのマッピングはコンテナベースで、コンテナに入ってから、対応するファイルを見ることができます.Linux仮想マシンには/var/www/htmlディレクトリがない可能性があります.ディレクトリのマッピングは双方向であることも覚えておいてください.
    Windowsの端末から、次のコマンドでコンテナに入ることができます.
    $ docker exec -it dr-web /bin/bash
    bash-4.3#

    ここで私が使っているのは容器の名前で、容器のIDも使えます.
    dr-webコンテナに入ると、コマンドプロンプトはbash-4.3#に変わり、コンテナのbash shellでLinuxのコマンドを実行できることを示します.
    このコンテナの/var/www/htmlディレクトリにphpinfo.phpファイルが自動的に存在するかどうかを確認します.
    bash-4.3# ls -a /var/www/html
    .            ..           phpinfo.php

    検証結果は確かに私たちの予想通りです.
    ブラウザからのアクセス http://192.168.99.100/phpinfo.php ,phpinfo()の印刷情報が表示されます.
    Windowsシステムでnginxプロセスのプロファイルを変更できるようにします.docker-compose.ymlファイルに、対応するディレクトリマッピングを追加することもできます.
    コンテナ内のnginxプロファイルがどこに保存されているのか、フォーマットがどうなっているのか、まだ分かりません.したがって,dr−webコンテナにおけるnginx構成を先に見ることができる.
    bash-4.3# ls -al /etc/nginx
    total 92
    drwxr-xr-x    9 root     root          4096 Dec  2 18:48 .
    drwxr-xr-x   37 root     root          4096 Apr 22 14:14 ..
    drwxr-xr-x    2 root     root          4096 Dec  2 18:39 conf.d
    -rw-r--r--    1 root     root          1077 Dec  2 18:39 fastcgi.conf
    -rw-r--r--    1 root     root          1077 Dec  2 18:39 fastcgi.conf.default
    -rw-r--r--    1 root     root          1007 Dec  2 18:39 fastcgi_params
    -rw-r--r--    1 root     root          1007 Dec  2 18:39 fastcgi_params.default
    -rw-r--r--    1 root     root          2837 Dec  2 18:39 koi-utf
    -rw-r--r--    1 root     root          2223 Dec  2 18:39 koi-win
    -rw-r--r--    1 root     root          5170 Dec  2 18:39 mime.types
    -rw-r--r--    1 root     root          5170 Dec  2 18:39 mime.types.default
    lrwxrwxrwx    1 root     root            27 Dec  2 18:39 modules -> ../../usr/lib/nginx/modules
    -rw-r--r--    1 root     root           774 Dec  2 18:29 nginx.conf
    -rw-r--r--    1 root     root          2656 Dec  2 18:39 nginx.conf.default
    -rw-r--r--    1 root     root           636 Dec  2 18:39 scgi_params
    -rw-r--r--    1 root     root           636 Dec  2 18:39 scgi_params.default
    drwxr-xr-x    2 root     root          4096 Dec  2 18:48 sites-available
    drwxr-xr-x    2 root     root          4096 Dec  2 18:48 sites-enabled
    drwxr-xr-x    2 root     root          4096 Dec  2 18:48 ssl
    -rw-r--r--    1 root     root           664 Dec  2 18:39 uwsgi_params
    -rw-r--r--    1 root     root           664 Dec  2 18:39 uwsgi_params.default
    -rw-r--r--    1 root     root          3610 Dec  2 18:39 win-utf

    /etc/nginx/nginx.confプロファイルをよく観察すると、ソフトリンクに役立ち、最終的な仮想ホストプロファイルは/etc/nginx/sites-availableディレクトリにあります.
    コンテナからWindowsシステムにコピーする必要があります.
    まずexitコマンドを入力し、コンテナのshellを終了してWindowsの端末に戻ります.
    次に、コピーを行います.
    HP@LAPTOP-ND0NRET5 MINGW64 ~/docker_data
    $ docker cp dr-web:/etc/nginx/sites-available ./nginx

    これにより、dr-webコンテナの/etc/nginx/sites-availableディレクトリの内容が、WindowsのC:UsersHPdocker_にコピーされますDataginxディレクトリにあります.
    次にdocker-compose.ymlファイルを変更し、webサービスコードブロックのvolumesを次のように変更します.
    volumes:
          - ~/docker_data/wwwroot:/var/www/html
          - ~/docker_data/nginx:/etc/nginx/sites-available

    そして、変更~/docker_Data/nginxディレクトリのdefault.confプロファイルに、tp 5プロジェクトにアクセスするための仮想ホストserverを追加します.
    server {
    	listen   80; 
    
    	root /var/www/html/tp5/public;
    	index index.php index.html index.htm;
    
    	server_name tp5.test;
    	
    	# Disable sendfile as per https://docs.vagrantup.com/v2/synced-folders/virtualbox.html
    	sendfile off;
    
    	# Add stdout logging
    	error_log /dev/stdout info;
    	access_log /dev/stdout;
    
    	location / {
    		# First attempt to serve request as file, then
    		# as directory, then fall back to index.html
    		try_files $uri $uri/ =404;
    	}
    
    	error_page 404 /404.html;
            location = /404.html {
                    root /var/www/errors;
                    internal;
            }
    
            location ^~ /ngd-style.css {
                alias /var/www/errors/style.css;
                access_log off;
            }
    
            location ^~ /ngd-sad.svg {
                alias /var/www/errors/sad.svg;
                access_log off;
            }
    
    	location ~ \.php$ {
                    try_files $uri =404;
    		fastcgi_split_path_info ^(.+\.php)(/.+)$;
    		fastcgi_pass unix:/var/run/php-fpm.sock;
    		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        		fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    		fastcgi_index index.php;
    		include fastcgi_params;
    	}
    
        location ~* \.(jpg|jpeg|gif|png|css|js|ico|webp|tiff|ttf|svg)$ {
                expires           5d;
        }
    
    	# deny access to . files, for security
    	#
    	location ~ /\. {
        		log_not_found off; 
        		deny all;
    	}
            
    	location ^~ /.well-known {
                    allow all;
                    auth_basic off;
         }
    
    }

    docker-compose.ymlを変更したので、前のコンテナを削除し、新しいコンテナインスタンスを作成する必要があります.
    コンテナを削除する前に、コンテナを閉じる必要があります.
    #     
    $ docker-compose stop
    Stopping dr-web   ... done
    Stopping dr-redis ... done
    Stopping dr-mysql ... done

    閉じたコンテナを削除します.
    #     ,     y     
    $ docker-compose rm

    次に、コンテナを再作成します.
    $ docker-compose up -d

    Webサイトのルートディレクトリには、tp 5のプロジェクトソースコードがまだありません.そのため、tp 5をインストールする必要があります.
    前述したように、ディレクトリのマッピングは双方向で、WindowsのC:UsersHPdocker_datawwwrootディレクトリにtp 5をインストールするか、dr-webコンテナの/var/www/htmlディレクトリにインストールすることもできます.
    Linux仮想マシンにcomposerがインストールされていないため、私のWindowsにはcomposerがインストールされているので、Windowsでcomposerを使用してtp 5をインストールすることにしました.
    #     ~/docker_data/wwwroot    
    $ cd /c/Users/HP/docker_data/wwwroot
    
    #     
    $ composer create-project topthink/think tp5  --prefer-dist

    そして、ブラウザでアクセス http://192.168.99.100/tp5/public/ ,tp 5のウェルカムインタフェースが見えます.
    アクセスする場合 http://tp5.test/ ,ブラウザは、tp 5.testのサーバIPアドレスが見つかりません.
    これは、Windowsのhostsファイルをまだ修正していないからです.
    次に、C:WindowsSystem 32driversetchostsファイルを編集し、ファイルの最後にコードを1行追加します.
    192.168.99.100  tp5.test

    保存後、更新 http://tp5.test/ ,正常にアクセスできます.
    これにより、Dockerを利用して、tp 5プロジェクトの開発環境を完全に構築しました.
    docker-composeは非常に一般的なツールで、ヘルプコマンドを参照できる他のコマンドとオプションもあります.
    $ docker-compose help