Dockerノート-コンテナー通信とデータマウント

コンテナ間の一方向通信

Docker環境では、多くの場合、コンテナー間で通信が必要になります。たとえば、TomcatコンテナはWebサービスをデプロイします。このWebサービスはmysqlサービスにアクセスする必要があり、mysqlは別のコンテナにデプロイされます。このとき、コンテナ間の通信が必要です。この例は、コンテナ間の一方向通信です。

では、一方向通信とは何ですか?つまり、tomcatコンテナはデータアクセスのために一方的にMySQLサービスにアクセスし、MySQLはTomcatの存在を知る必要はありません。つまり、TomcatにはMySQLの認識があり、MySQLにはTomcatの認識がありません。これは一方向と呼ばれます。

Docker環境では、コンテナーが作成されるたびに、コンテナーに仮想IPが割り当てられます。このIPは、Docker環境内でのみ有効であり、外部からアクセスすることはできません。Docker環境内では、各コンテナーはを介して相互に通信できます。仮想IP。通信。

コンテナの仮想IPアドレスを確認する方法

docker insepct 容器id

次の図は、Tomcatコンテナの仮想IPです。

画像-20200523211822372

# 进入tomcat容器
docker exec -it 容器id /bin/bash
# 进去后
ping 172.17.0.3  # 172.17.0.3 是mysql容器的ip
# 发现能够ping通

ただし、コンテナー間の通信をコンテナーの仮想IPに依存することはできません。(通信に仮想IPを使用する場合、つまりTomcatコンテナーに、MySQLコンテナーの仮想IPアドレスを保存します。MySQLコンテナーにアクセスする必要がある場合は、この仮想IPに基づいて直接アクセスできます)。ただし、dockerがコンテナーを作成するときに、コンテナーの仮想IPが動的に割り当てられるためです。MySQLコンテナを再起動すると、仮想IPが変更される可能性があるため、TomcatコンテナでアクセスするMySQLコンテナのIPアドレスを変更する必要があり、非常に面倒です。

より良い方法は、コンテナに名前を付け、アクセスするコンテナの名前を指定して、コンテナ間の一方向通信を完了することです。このように、コンテナー名が変更されない限り、コンテナーの仮想IPがどのように変更されても、dockerは対応する名前のコンテナーを自動的に見つけるのに役立ちます。

コンテナを起動するときに、--nameパラメータを使用してコンテナの名前を指定できます。指定しない場合は、ランダムに自動的に生成されます。

docker run -d --name database mysql
# 通过 --link 命令,指定mysql容器的名称,将tomcat和mysql进行关联
docker run -p 7000:8080 -d --link database --name web tomcat

このようにして、databaseこの名前でmysqlコンテナにアクセスできます。

注意

#若直接使用如下命令创建一个centos容器,容器运行后会自动退出
docker run centos
#若要centos容器一直保持运行,可以用如下命令
# 用交互模式运行/bin/bash,并让他在后台运行
docker run -d -it centos /bin/bash

まとめ

コンテナを起動するときに各コンテナに名前を付け、コンテナAがコンテナBと一方向で通信する場合は、コンテナAを起動するときにパラメータを追加します--link 容器B的名字

コンテナ間の双方向通信

2つのコンテナ--link起動するときに2回使用して、コンテナの双方向通信を完了することができますただし、これに加えて、ブリッジブリッジを使用してコンテナをより簡単にグループ化することもでき、同じグループ内のコンテナ間で双方向通信を実行できます。

=>橋とは何ですか?

ブリッジは、外界と通信するためのDocker環境のコンポーネントであり、仮想ブリッジです。その主な目的は、Docker環境と外部ホスト環境を接続して、Docker環境が外部と通信できるようにすることです。特定のコンテナ内のBaiduのアドレスにpingを実行して、pingを実行することができます。このプロセスには、Dockerのブリッジブリッジが含まれます。ブリッジは、Docker内のデータパケットをホストマシンの物理ネットワークカードに送信するか、ホストマシンの物理ネットワークカードからデータパケットを受信して​​、Dockerに転送することができます。
画像-20200524003642767

Dockerブリッジは、ネットワークレベルでコンテナをグループ化することもできます。同じグループに属するコンテナは、2つの方向で相互に通信できます。つまり、各コンテナは特定のブリッジにバインドでき、同じブリッジにバインドされたすべてのコンテナは2つの方向で通信できます。

まずdocker network ls、Dockerネットワーク構成を表示するために使用します

画像-20200523220930880
上の図によると、dockerはデフォルトのブリッジを提供し、dockerと外界との間の通信を担当します。

特定のコンテナー間の双方向通信を実現するために、次のコマンドを使用してmy_bridgeという名前の新しいブリッジを作成できます。

docker network create -d bridge my_bridge

画像-20200523221137373

次に、このブリッジと通信する必要があるコンテナをバインドします

docker network connect my_bridge web
docker network connect my_bridge database

このWebとデータベースとmy_bridgeバインド二つの容器の実現
が、私は、コマンドを取得できるようにしたい、複数のコンテナの増加の背後にある名前は、テストされており、ないようです
見てdocker network connect --help、構文によると、あなたができるだけでコンテナとブリッジが接続されているコマンドを見つける
画像-20200523222232729

このように、2つのコンテナwebとデータベースはグループmy_bridgeに属し、相互に通信できます。

まとめ

新しいブリッジタイプのネットワーク接続を作成し、相互接続する必要のあるコンテナをこのブリッジ接続で順番にバインドします。同じブリッジ接続にバインドされたコンテナは、同じネットワークグループに属していると見なすことができます。

コンテナ間のデータ共有

2つのTomcatコンテナーが同じWebファイルのセットでデプロイされている場合、Webファイルが変更されると、2つのコンテナーを順番に変更する必要があり、これは非常に面倒です。

画像-20200523223023655

したがって、ホスト上にボリュームスペースを作成し、複数のコンテナでこのボリュームを共有できます。コンテナは特定のWebファイルを保持しなくなり、代わりにホスト上のこのボリュームにWebファイルが保存されます。ホスト上のボリュームが更新されている限り、すべてのコンテナーが有効になります。

画像-20200523224149832

ボリュームの設定方法は?

二つの方法

  1. -vホストディレクトリをマウントします

    docker run --name 容器名 -v 宿主机路径:容器内挂载路径 镜像名
    # 例子如下
    docker run --name web -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat
    

    このように、パスの書き込みを間違えると、マウントが失敗します。また、複数のコンテナが同じホストディレクトリをマウントする必要がある場合、各コンテナは起動時にマウントする必要のあるディレクトリを書き込む必要があり、これは面倒でエラーが発生しやすくなります。では、マウントするホストディレクトリを共有変数として宣言でき、他のコンテナはこの変数を参照してマウントを完了できますか?方法を見てください2 ==>

  2. --volumes-from共有コンテナを介したマウントポイント

    # 1. 先创建共享容器
    # 这个容器只是为了声明要挂载的宿主机目录,从而能够被其他容器引用
    docker create --name webpage -v /webapps:/tomcat/webapps tomcat
    # 2. 共享容器挂载点
    # 通过 --volumes-from 指定从webpage容器读取挂载点
    docker run --volumes-from webpage --name web -d tomcat
    
    

    いわゆるウェブページコンテナはマウントポイントを定義するだけで、他のコンテナはこのマウントポイントを再利用できます。
    これにより、すべてのマウントの統合管理が容易になります。

おすすめ

転載: blog.csdn.net/vcj1009784814/article/details/106309098