Dockerに基づくLNMP環境をすばやく構築

TOC
https://docs.docker.com/

序文

Dockerとは何ですか?

Dockerは、アプリケーションを自動化されるソフトウェアコンテナーの下に展開できるようにするオープンソースソフトウェアプロジェクトです。これにより、Linuxオペレーティングシステムでのソフトウェア抽象化の追加レイヤーと、オペレーティングシステムレイヤーの仮想化のための自動管理メカニズムが提供されます。 。Dockerは、cgroupsやLinuxコア名前空間などのLinuxコアのリソース分離メカニズムを使用して、独立したソフトウェアコンテナーを確立します。これは単一のLinuxエンティティーの下で動作できるため、仮想マシンを起動するという余分な負担を回避できます。

Docker VS VM

Dockerデーモンは、メインオペレーティングシステムと直接通信し、各Dockerコンテナーにリソースを割り当てることができます。また、コンテナーをメインオペレーティングシステムから分離し、各コンテナーを互いに分離することもできます。仮想マシンVMは、ハードウェアリソースを仮想化して独立したサブオペレーティングシステムを作成するメインオペレーティングシステムハイパーバイザーであり、リソースは共有されません。

Dockerを使用する理由

1.オフラインの開発環境、テスト環境、オンラインの本番環境に整合性があることを確認します。
2. VMと比較して、起動速度が速く、リソース使用率が高く、パフォーマンスのオーバーヘッドが低い
3. DevOps
4. マイクロサービス。1つのサービスが行うことは1つだけです
。5 . 開発を容易にするために、開発環境の設定と構成の繰り返しタスクを自動的に実行します。人々は重要なことに集中できます。それは優れたソフトウェアを構築することです。

Docker関連の概念

镜像Image

Dockerイメージは読み取り専用のテンプレートです。イメージを使用してDockerコンテナーを作成できます。
Dockerは、イメージを作成したり、既存のイメージを更新したりするための非常にシンプルなメカニズムを提供します。ユーザーは、既に準備されているイメージを他のユーザーから直接ダウンロードして直接使用することもできます。
ユーザプログラムのミラー= OS + +ソフトウェアの動作環境は
、例えば:ミラーは、Apacheまたはユーザーによって必要とされる他のアプリケーションのみがインストールされている完全なUbuntuのオペレーティングシステム環境を含むことができます。

Dockerfileを作成してイメージを作成できます。

コンテナ

Dockerはコンテナーを使用してアプリケーションを実行します。
コンテナは、イメージから作成された実行中のインスタンスです。開始、開始、停止、削除できます。各コンテナは、安全を保証する独立したプラットフォームです。
コンテナーは、Linux環境の単純なバージョン(ルートユーザーのアクセス許可、プロセススペース、ユーザースペース、ネットワークスペースなどを含む)およびその中で実行されているアプリケーションと考えることができます。
注:画像は読み取り専用です。コンテナは、開始時に書き込み可能なレイヤーを最上位レイヤーとして作成します

データ量

データボリュームを使用すると、コンテナーのライフサイクルの影響を受けずにデータを保持できます。
dockerを使用するときに行う必要がある考え方の変化:コンテナーは短期間で1回限りである必要があります。

コンテナーが起動すると、ランダムなプライベートIPが割り当てられ、他のコンテナーはこのIPアドレスを使用してコンテナーと通信できます。これは2つの理由で重要です。1つはRong中に相互通信するためのチャネルを提供すること、もう1つはコンテナがローカルネットワークを共有することです。
コンテナ間通信を有効にするために、Dockerでは新しいコンテナを作成するときに他の既存のコンテナを参照できます。作成したコンテナで参照されているコンテナには、エイリアス(指定したもの)が割り当てられます。2つのコンテナーはリンクされていると言いました。
したがって、DBコンテナーが既に実行されている場合は、Webサーバーコンテナーを作成し、作成時にDBコンテナーを参照して、dbappなどのエイリアスを与えることができます。この新しく作成されたWebサーバーコンテナーでは、ホスト名dbappを使用して、いつでもDBコンテナーと通信できます。

リポジトリ

ウェアハウスは、画像ファイルが一元的に保存される場所です。場合によっては、倉庫と倉庫登録サーバー(Registry)が混同され、厳密に区別されないことがあります。実際、複数の倉庫が倉庫登録サーバーに格納されることが多く、各倉庫には複数のミラーが含まれており、各ミラーには異なるタグが付いています。
倉庫は2つの形態に分けられます:公共倉庫(公共)と民間倉庫(私有)。
最大の公共倉庫はDocker Hubで、ユーザーがダウンロードするための膨大な数の画像が保存されています。国内の公共倉庫にはDockerプールなどがあり、本土のユーザーにより安定した高速アクセスを提供できます。
もちろん、ユーザーはローカルネットワークにプライベートウェアハウスを作成することもできます。
ユーザーは独自のイメージを作成した後、pushコマンドを使用してそれをパブリックまたはプライベートウェアハウスにアップロードできるため、次回このイメージを別のマシンで使用するときは、ウェアハウスからイメージをプルするだけで済みます。
注:Dockerウェアハウスの概念はGitに似ており、登録サーバーはGitHubのようなホスティングサービスとして理解できます。

Dockerに基づいてLNMP環境を作成する

ミラーをダウンロード

https://hub.docker.com/

docker pull bitnami/php-fpm    #下载最新php-fpm镜像,里面自带了最新版的php
docker pull nginx                      #下载最新nginx镜像
docker pull mysql                     #下载最新mysql镜像

データディスクを作成する

https://docs.docker.com/storage/volumes/

画像

注:
1.直接作成する場合、ファイルはコンテナによって管理されます。それ以外の場合は、指定したディレクトリをマウントする必要があります
。2. macを使用する学生は注意を払う必要があります。macdockerが実際には仮想で実行されているため、このパスがマシン上で見つからないことがわかります。マシン上で、あなたは、仮想マシンのドッキングウィンドウのビューを入力する必要があり
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
、この時点でcd /var/lib/docker/volumes/learn/_data/ボリュームが作成されます。
問題がある場合は、Macでこの手順をスキップできます

docker volume create learn
ここではデータディスクを直接作成します。実際のパスはdocker関連ディレクトリにあります。

~/Documents/code/learn » docker volume inspect learn 
[
    {
        "CreatedAt": "2020-04-15T11:07:22Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/learn/_data",
        "Name": "learn",
        "Options": {},
        "Scope": "local"
    }
]

ネットワークを作成する

https://docs.docker.com/engine/reference/commandline/network_create/

Dockerには次のネットワークタイプがあります:
ブリッジ:独立したコンテナー
ホスト間の通信に使用:ホストのネットワークを直接使用し、ポートもホストの
オーバーレイを使用:複数のドッカーホストがある場合、クロスホストコンテナー通信
macvlan:それぞれコンテナは仮想MACアドレスがありません
なし:無効ネットワーク
デフォルトでは、ドッキングウィンドウを使用すると、実行するための新しいコンテナの作成時に、ブリッジネットワークを作成しdocker run、ブリッジは自動的にネットワークに接続されたときに、デフォルトのネットワークを削除することはできませんただし、新しいものを作成できます。
デフォルトでは、Dockerはブリッジ、ホスト、およびnoneネットワークを確立します。

~ » docker network ls
NETWORK ID NAME DRIVER SCOPE
a0bf815f3cb0 bridge bridge local
836b8a7368f8 host host local
8f2915cdc31a none null local


docker network create --subnet=172.54.0.0/24 lnmp #创建B类划分子网络,方便配置文件中直接使用容器名称

php-fpm、nginx、mysqlミラーを作成する

https://docs.docker.com/engine/reference/commandline/run/

docker run -d --name php -v learn:/var/www --net lnmp --restart=always bitnami/php-fpm
docker run -d --name nginx -p 80:80 -v learn:/var/www --net lnmp --restart=always nginx
docker run -d --name mysql --restart=always -p3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --net lnmp mysql

Macの場合:

docker run -d --name php -v /Users/lixin/Documents/code/learn:/var/www --net lnmp --restart=always bitnami/php-fpm
docker run -d --name nginx -p 80:80 -v /Users/lixin/Documents/code/learn:/var/www --net lnmp --restart=always nginx
docker run -d --name mysql --restart=always -p3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --net lnmp mysql

構成ファイルを変更する

#导出文件
docker cp default.conf nginx:/etc/nginx/conf.d/default.conf
#导入文件
docker cp nginx:/etc/nginx/conf.d/default.conf default.conf

変更例は以下の通りです。

server {
    listen 80;
    server_name localhost;


    location / {
        root /var/www;
        index index.html index.htm index.php;
    }


    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }


    location ~ \.php$ {
        root /var/www;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

次にnginxを再起動します
docker restart nginx

テストページを作成する

<?php
phpinfo();
?>

Linuxの場合:
ファイルをデータボリュームディレクトリに移動します(Webルートディレクトリはこのディレクトリの下にあります)
mv index.php /var/lib/docker/volumes/webpage/_data/

Macの場合:
マウントディレクトリに直接ファイルを作成します。

次にlocalhostにアクセスします

MySQLに接続

テストファイルを作成する

<?php
$link = mysqli_connect('mysql', 'root', '123456');
if (!$link) {
 die('Could not connect: ' . mysqli_connect_error());
}
echo 'Connected successfully';
mysqli_close($link);
?>

訪問後にはエラーがあります:[サーバは認証要求接続できなかったクライアントにメソッドの不明を]
これはMySQL8.0の後にあるため、認証暗号化プラグイン調整ですが、(PHPリンクライブラリをサポートしていませんここで参照しそしてここに)。

解決策:
1.コンテナーを入力します
2. mysqlにログインし
ます3. ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY '123456';元のプラグインを使用して、パスワードのリセットを1回実行します。

~ » docker exec -it mysql /bin/sh;exit
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.19 MySQL Community Server - GPL


Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)


mysql>

刷新:接続に成功しました

Docker-ComposeはLNMP環境を作成します

Docker-ComposeプロジェクトはDockerの公式のオープンソースプロジェクトであり、Dockerコンテナクラスタの迅速なオーケストレーションを担当しています。
Docker-Composeは、マネージドコンテナーを3つのレイヤー(プロジェクト、サービス、コンテナー)に分割します。Docker-Compose実行ディレクトリ内のすべてのファイル(docker-compose.yml、拡張ファイルまたは環境変数ファイルなど)はプロジェクトを構成し、特別な指定がない場合、プロジェクト名は現在のディレクトリ名です。プロジェクトには複数のサービスを含めることができます。各サービスは、コンテナー操作のイメージ、パラメーター、および依存関係を定義します。サービスには複数のコンテナインスタンスを含めることができます。Docker-Composeは負荷分散の問題を解決しないため、他のツールを使用してサービスの検出と負荷分散を行う必要があります。
Docker-Composeプロジェクト構成ファイルのデフォルトはdocker-compose.ymlであり、構成ファイルは環境変数COMPOSE_FILEまたは-fパラメーターを使用してカスタマイズできます。これは、複数の依存サービスと各サービスが実行するコンテナーを定義します。
Dockerfileテンプレートファイルを使用すると、ユーザーは個別のアプリケーションコンテナーを簡単に定義できます。仕事では、特定のタスクを完了するために複数のコンテナが互いに連携する必要がある状況に遭遇することがよくあります。たとえば、Webプロジェクトを実装するには、Webサービスコンテナー自体に加えて、バックエンドデータベースサービスコンテナーを追加し、さらに負荷分散コンテナーを含める必要があることがよくあります。
Composeを使用すると、ユーザーは個別のdocker-compose.ymlテンプレートファイル(YAML形式)を使用して、関連するアプリケーションコンテナーのセットをプロジェクトとして定義できます。
Docker-ComposeプロジェクトはPythonで記述されており、Dockerサービスが提供するAPIを呼び出してコンテナーを管理します。したがって、操作するプラットフォームがDocker APIをサポートしている限り、オーケストレーション管理にComposeを使用できます。

https://docs.docker.com/compose/
https://docs.docker.com/compose/install/
https://docs.docker.com/compose/gettingstarted/
https://docs.docker.com/ compose / compose-file /
注:
1. Mac用Dockerのデスクトップバージョンにはcomposeが付属しているため、インストールする必要はありません。

2.また、使用を検討することができますdocker stack

新しいマシンで環境を構築する必要があることが多い場合、上記のように毎回1つずつ作成するのは非常に面倒です。現時点では、docker-composeを使用してYAML経由でソフトウェアサービスを定義でき、最後に作成するコマンドは1つだけです定義されたすべてのサービスを許可します。
Compseは通常、次の3つのステップに基づいて使用されます。

  • dockerfileに基づいてプログラムの実行環境を定義し、どのような状況でも再利用できるようにします。(ビルドする必要がない場合、このステップは無視できます。既製のイメージを直接使用してください)
  • docker-compose.ymlに基づいてサービスを定義し、分離された環境で同時に実行できるようにします。
  • docker-compose upを実行して、プログラム全体を作成して実行します。
    開発環境、自動テスト、スタンドアロン展開で使用できます。

サンプルファイルは次のとおりです。

version: '3'
services:
  php:
    container_name: php
    image: "bitnami/php-fpm"
    networks:
      - lnmp
    volumes:
       - /Users/lixin/Documents/code/learn:/var/www
    restart: always
  nginx:
    container_name: nginx
    image: "nginx"
    ports:
      - "80:80"
    volumes:
       - /Users/lixin/Documents/code/learn:/var/www
    networks:
      - lnmp
    restart: always
  mysql:
    container_name: mysql
    image: "mysql"
    ports:
      - "3306:3306"
    networks:
      - lnmp
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
networks:
  lnmp:
    ipam:
      driver: default
      config:
        - subnet: "172.54.0.0/24"

次に、それを保存してdocker-compose.yml、特別に格納された構成関連ディレクトリにファイル置き、コマンドを実行します

~/Documents/code/learn » docker-compose up -d
Starting php ... done
Starting nginx ... done
Starting mysql ... done

注:作成に基づいて作成されdocker-compose.ymlたコンテナは、ディレクトリにちなんで名付けられたコンテナグループの下に配置されます

nginxがコンテナにログインしない問題

使用中に、nginx confにアクセスログとエラーログが設定されていても、対応するファイルには書き込まれません。
これは、公式のnginxデフォルトがDockerログコレクターに直接出力するように設定されているためです。

FROM debian:jessie


MAINTAINER NGINX Docker Maintainers "[email protected]"


ENV NGINX_VERSION 1.11.5-1~jessie


RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 \
 && echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.list \
 && apt-get update \
 && apt-get install --no-install-recommends --no-install-suggests -y \
      ca-certificates \
      nginx=${NGINX_VERSION} \
      nginx-module-xslt \
      nginx-module-geoip \
      nginx-module-image-filter \
      nginx-module-perl \
      nginx-module-njs \
      gettext-base \
 && rm -rf /var/lib/apt/lists/*


# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
 && ln -sf /dev/stderr /var/log/nginx/error.log


EXPOSE 80 443


CMD ["nginx", "-g", "daemon off;"]

注:公式のnginxイメージは、/ var / log / nginx / access.logから/ dev / stdoutへのシンボリックリンクを作成し、/ var / log / nginx / error.logから/ dev / stderrへの別のシンボリックリンクを作成し、上書きします代わりに、ログファイルとログを関連する特別なデバイスに送信します。Dockerfileを参照してください。

おすすめ

転載: www.cnblogs.com/leestar54/p/12707648.html