dockerの下のマルチコンテナはdnmp環境を迅速に構築し、ワンタッチで自動化された導入を実現

8064 ワード

需要
もしこのようなプロジェクトがあれば、家で開発するには環境を構築する必要があり、会社で開発するには環境を構築する必要があり、テストするには環境を構築する必要があり、オンラインでは環境を構築する必要があります.また、環境を構築する際には、さまざまな依存関係をインストールし、ローカルで使用でき、テストが使用できないなど、さまざまな状況が発生する可能性があります.この場合、システムにDockerをインストールし、Dockerfileを書いてdocker-composeを実行するだけです.ymlは自動的に導入を完了し、各プラットフォームでの一貫性を保証し、便利で効率的ではないでしょうか.
複数のコンテナのメリット
PHP環境を構築するには、起動するコンテナ:nginx、phpが必要です.もちろん、これらの容器に加えて、mysql、redis、Memcachedなどの関連拡張にも関与する可能性があります.
単一コンテナ配置(オリジナルインストールlnmp)を採用するよりも、nginxをインストールする際に未知のエラーが発生し、解決できず、再ロードするしかない場合、古いngxinコンテナを削除し、新しいnginxコンテナを起動すればよいなど、phpなどの関連コンテナは、何の影響も受けません.ただし、単一コンテナの導入は、環境全体を削除し、すべてのものを再インストールして導入することに相当します.もちろん、単一のコンテナでも、正常な動作を保証する場合は、このコンテナを新しいミラーに構築することができ、使用するたびに、このミラーでコンテナを起動するだけでよいというメリットがあります.
しげん
今回の構築に関する関連ファイルジャンプについて:リソースdockerのインストールジャンプについて:dockerインストールdockerの使用コマンドジャンプについて:
一、手動構築
  • プルデマンドミラー
    docker pull php:7.2-fpm
    docker pull nginx
    docker pull mysql:5.7
    docker pull redis:3.2
    #            
    
  • redisミラーリングによりredisコンテナ
    docker run --name master-redis -p 6379:6379 -d redis:3.2
    
  • を起動
  • mysqlミラーでmysqlコンテナを起動
    docker run --name master-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
    
    -e MYSQL_ROOT_PASWORDはmysqlに初期パスワード
  • を設定
  • phpミラーリングによりphpコンテナ
    docker run -d -p 9000:9000 --name master-php -v d:/dnmp/www:/var/www/html -v d:/dnmp/php:/usr/local/etc/php --link master-db:master-db --link master-redis:master-redis --privileged=true php:7.2-fpm
    
  • を起動
  • ngxinミラーリングによりnginxコンテナを起動
    	docker run --name master-nginx -d -p 80:80 -v d:/dnmp/www:/usr/share/nginx/html -v d:/dnmp/nginx:/etc/nginx -v d:/dnmp/logs/nginx.logs:/var/log/nginx --link master-php:master-php --privileged=true nginx
    
    パラメータ説明:#--nameコンテナ別名.この名前は、コンテナ間の接続、ngxin構成、PHPコードでの接続構成などを確立するために使用されるため、コンテナ名を変更すると、そのコンテナ名を使用する場所も変更する必要があります.v PHP容器を起動する時、容器内部のいくつかの経路をホストホスト経路にマッピングし、ファイルの同期を保証する必要がある.(空のフォルダをマウントするとコンテナの内容が上書きされるので、プロファイルは事前に準備しておく必要があります.ここでは、現在のプロジェクトのパスに注意し、直接コピーして使用しないでください).linkは、ソースコンテナ(リンクされたコンテナ)と受信コンテナ(アクティブにリンクされたコンテナ)との間で相互通信を可能にし、コンテナ間の通信によるコンテナIPへの依存を解消する.--privileged=trueはコンテナに特権を与え、ディレクトリをマウントした後、コンテナはディレクトリ以下のファイルまたはディレクトリにアクセスできます.–nameコンテナ名を変更した場合は、対応するプロファイルを変更する必要があります.
  • PHP拡張ライブラリインストール
    #  master-php  
    docker exec -it  master-php  /bin/bash  
    #  pdo_mysql  
    docker-php-ext-install pdo pdo_mysql  
    #  php     redis,       redis 
    #  redis   
    curl -L -o /tmp/redis.tar.gz  https://github.com/phpredis/phpredis/archive/4.2.0.tar.gz
    #   
    tar zxvf  /tmp/redis.tar.gz
    #   
    rm -r /tmp/redis.tar.gz
    #      
    mkdir -p /usr/src/php/ext
    #     redis        
    mv phpredis-4.2.0 /usr/src/php/ext/redis
    #  redis
    docker-php-ext-install redis
    #    
    exit
    #    
    docker restart master-php
    
  • 二、自動化構築(docker-compose)
    docker-composeは容器を並べたものです.たとえば、phpミラー、mysqlミラー、nginxミラーがあります.docker-composeがない場合は、起動するたびに、各コンテナの起動パラメータ、環境変数、コンテナの名前付け、異なるコンテナのリンクパラメータの指定など、一連の操作を叩く必要があります.かなり煩雑です.docker-composerを使ったら、これらのコマンドをdocker-composerに一度に書くことができます.ymlファイルでは、この環境全体(3つのコンテナを含む)を起動するたびにdocker-composer upコマンドを叩くだけでOKです.
    1.docker-composeを作成する.ymlファイル
    version: "2"
    services:
      master-db:
        container_name: "master-db"
        restart: always
        ports:
          - "3306:3306"
        volumes:
          - d:/dnmp/mysql/conf.d/:/etc/mysql/conf.d/
        environment:
          MYSQL_ROOT_PASSWORD: 123456
        image: mysql:5.7
      master-redis:
        container_name: "master-redis"
        restart: always
        ports:
          - "6379:6379"
        volumes:
          -  d:/dnmp/redis:/data
        image: redis:3.2
      master-php:
        container_name: "master-php"
        restart: always
        ports:
          - "9000:9000"
        volumes:
          -  d:/dnmp/www:/var/www/html
          -  d:/dnmp/php:/usr/local/etc/php
        links:
          - "master-db"
          - "master-redis"
        image: php:7.2-fpm
      master-nginx:
        container_name: "master-nginx"
        restart: always
        ports:
          - "80:80"
        links:
          - "master-php"
        volumes:
          -  d:/dnmp/www:/usr/share/nginx/html
          -  d:/dnmp/nginx:/etc/nginx
          -  d:/dnmp/logs/nginx.logs:/var/log/nginx
        image: nginx:latest
    
    	#container_name  				           ,          。
        #restart: always				        ,always:        
        #ports:  				              
        #volumes: 						       。          (HOST:CONTAINER)         (HOST:CONTAINER:ro),             (rw),    ro     
        #environment:					      
        #MYSQL_ROOT_PASSWORD: 			         
        #image:							    
    

    2.docker-composeを実行する.yml
    docker-composeに入ります.ymlファイルディレクトリは、コマンドdocker-compose up-dを実行して対応するコンテナを作成しますが、PHP拡張は手動でインストールする必要があります.
    三、完全な構築
    上のdocker-composeはワンタッチ操作を実現していますが、問題はPHPの拡張ライブラリは自分でここにインストールするかDockerfileでカスタムコンテナミラーを構築して本当のワンタッチで完成させるかです.
    mysql/Dockerfile
    FROM mysql:5.7
    MAINTAINER qyh "[email protected]"
    
    # set timezome
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    

    redis/Dockerfile
    FROM redis:4.2
    MAINTAINER qyh "[email protected]"
    
    # set timezome
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    

    nginx/Dockerfile
    FROM nginx
    MAINTAINER qyh "[email protected]"
    
    # set timezome
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    

    php/Dockerfile
    FROM php:7.2-fpm
    MAINTAINER qyh "[email protected]"
    
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    RUN apt-get update && apt-get install -y \
            libfreetype6-dev \
            libjpeg62-turbo-dev \
            libpng-dev \
        && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
        && docker-php-ext-install -j$(nproc) gd \
            && docker-php-ext-install zip \
            && docker-php-ext-install pdo_mysql \
            && docker-php-ext-install opcache \
            && docker-php-ext-install mysqli
    
    RUN pecl install redis && docker-php-ext-enable redis \
    	&& pecl install xdebug && docker-php-ext-enable xdebug
    
    RUN echo "" >> /usr/local/etc/php/php.ini
    RUN usermod -u 1000 www-data
    
    

    docker-compose.yml
    version: "2"
    services:
      master-db:
        build: ./mysql
        container_name: "master-db"
        restart: always
        ports:
          - "3306:3306"
        volumes:
          - d:/dnmp/mysql/conf.d/:/etc/mysql/conf.d/
        environment:
          MYSQL_ROOT_PASSWORD: 123456
      master-redis:
        build: ./redis
        container_name: "master-redis"
        restart: always
        ports:
          - "6379:6379"
        volumes:
          -  d:/dnmp/redis:/data
      master-php:
        build: ./php
        container_name: "master-php"
        restart: always
        ports:
          - "9000:9000"
        volumes:
          -  d:/dnmp/www:/var/www/html
          -  d:/dnmp/php:/usr/local/etc/php
        links:
          - "master-db"
          - "master-redis"
      master-nginx:
        build: ./nginx
        container_name: "master-nginx"
        restart: always
        ports:
          - "80:80"
        links:
          - "master-php"
        volumes:
          -  d:/dnmp/www:/usr/share/nginx/html
          -  d:/dnmp/nginx:/etc/nginx
          -  d:/dnmp/logs/nginx.logs:/var/log/nginx
    
    

    docker-compose.ymlファイルの配置と各Dockerfileディレクトリの同級でこのディレクトリに入り、コマンドdocker-compose up-dを実行します.
    docker-compose.ymlは、Dockerfileで作成する場合は、公式ミラーイメージを指定する必要はありません.直接build:./ディレクトリは、ディレクトリで構成されているDockerfileを参照して、新しいミラーを作成します.注意:作成すると、次のdocker-composeはbuild作成せずに既存のミラーを直接取り出します.Dockerfile構成を変更した場合は、削除する前にミラーを削除してください.
    ホスト上でshellスケジューリングphp実行スクリプトが必要な場合は、次のコマンドを実行できます.
    docker exec -it master /bin/bash -c '/usr/local/bin/php /var/www/html/blog/public/index.php