記事ディレクトリ
1.名前空間の6つの分離
翔ファン | タイプ | 機能説明 |
---|---|---|
NO.1 | MNT名前空間 | ディスクマウントポイントとファイルシステムの分離を提供します |
NO.2 | IPC名前空間 | プロセス間通信の分離機能を提供します |
NO.3 | ネット名前空間 | ネットワーク分離機能を提供します |
NO.4 | UTS名前空間 | ホスト名分離機能を提供します |
NO.5 | PID名前空間 | プロセス分離機能を提供する |
NO.6 | ユーザー名前空間 | ユーザー分離機能を提供する |
2.Dockerネットワーク
DockerはLinuxブリッジを使用して、ホストマシン上のDockerコンテナブリッジ(docker0)を仮想化します。Dockerがコンテナを起動すると、Dockerブリッジのネットワークセグメントに従ってコンテナにIPアドレスが割り当てられます。これはContainer-IPと呼ばれます。同時に、Dockerブリッジは、各コンテナーのすべてのデフォルトゲートウェイです。同じホスト内のコンテナーは同じブリッジに接続されているため、コンテナーはコンテナーのContainer-IPを介して直接通信できます。
Dockerブリッジは、実際のネットワークデバイスではなく、ホストによって仮想化されます。外部ネットワークをアドレス指定できないため、外部ネットワークは
Container-IPを介してコンテナーに直接アクセスできません。コンテナが外部アクセスにアクセスできるようにする場合は、コンテナポートをホストホストにマッピングします(ポートマッピング)。つまり、docker runがコンテナを作成するときに-pまたは-Рパラメータを使用して有効にし、[host IP ]コンテナにアクセスする場合:[コンテナポート]コンテナにアクセスします。
コンテナを外部からアクセスできるようにするにはどうすればよいですか?次に、関数、コンテナポートマッピングについて説明します
1.ポートマッピング
(1)ランダムポートマッピング
docker run -itd -P 镜像:标签
(2)ポートマッピングを指定します
docker run -itd -p 指定宿主机端口:指定容器端口 镜像:标签
##宿主机端口 32768 - 60999 这些端口都能被使用 0-32767 端口是被系统所使用的
2.コンテナログを表示する
docker logs 容器id或容器名
3.Dockerネットワークモード
**ホスト:**コンテナは、独自のネットワークカードを仮想化したり、独自のIPを構成したりすることはありませんが、ホストのIPとポートを使用します。
**コンテナ:**作成されたコンテナは、独自のネットワークカードを作成して独自のIPを構成するのではなく、指定されたコンテナとIPとポートの範囲を共有します。
**なし:**このモードは、コンテナのネットワーク機能をオフにします。
**ブリッジ:**デフォルトはこのモードです。このモードでは、各コンテナーにIPを割り当てて設定し、コンテナーをdocker0仮想ブリッジに接続して、dockerlブリッジとiptablesnatテーブル構成を介してホストと通信します。
カスタムネットワーク
Dockerをインストールすると、ブリッジ(作成されたコンテナーはデフォルトでこのネットワークに接続されます)、なし、ホストの3つのネットワークが自動的に作成されます。
詳細なネットワークモード
1.ホストモード:
Vmwareのブリッジモードと同等で、ホストと同じネットワーク内にありますが、独立したIPアドレスはありません。
Dockerは、Linux名前空間テクノロジーを使用してリソースを分離します。たとえば、プロセスを分離するためのPID名前空間、ファイルシステムを分離するためのマウント名前空間、ネットワークを分離するためのNetworkNamespaceなどです。
ネットワーク名前空間は、他のネットワーク名前空間から分離されたネットワークカード、ルーティング、iptableルールなどを含む独立したネットワーク環境を提供します。
Dockerコンテナには通常、個別のネットワーク名前空間が割り当てられます。
ただし、コンテナの起動時にホストモードが使用されている場合、コンテナは独立したネットワーク名前空間を取得しませんが、ネットワーク名前空間をホストと共有します。コンテナは、独自のネットワークカードを仮想化したり、独自のIPを構成したりすることはありませんが、ホストのIPとポートを使用します。
2.コンテナモード
ホストモードを理解すると、このモードは簡単に理解できます。このモードは、新しく作成されたコンテナが
、ホストではなく既存のコンテナとネットワーク名前空間を共有することを指定します。新しく作成されたコンテナは、独自のネットワークカードを作成したり、独自のIPを構成したりすることはありませんが、IP、ポート範囲などを指定されたコンテナと共有します。同様に、ネットワークに加えて、2つのコンテナは、ファイルシステム、プロセスリストなどの他の側面から分離されています。2つのコンテナのプロセスは、Ioネットワークカードデバイスを介して通信できます。
(1)Dockerネットワークリストを表示する
[root@localhost ~]# docker network ls
(2)コンテナプロセス番号を取得します
docker inspect -f '{
{.State.Pid}}' 容器Pid号
(3)コンテナはコンテナモードを指定します
docker run -itd --name c2 --net=container:817518d0df4b nginx:1.14 bash
3.noneモード
noneモードでは、Dockerコンテナには独自のネットワーク名前空間がありますが、Dockerコンテナのネットワーク構成は行われません。
つまり、このDockerコンテナには、ネットワークカード、IP、ルーティング、その他の情報がありません。このネットワークモードでは、コンテナにはloループバックネットワークのみがあり、他のネットワークカードはありません。このタイプのネットワークはネットワーク化できず、閉じたネットワークでコンテナのセキュリティを確保できます。
4.花嫁モード
ブリッジモードは、Dockerのデフォルトのネットワークモードです。-netパラメーターがない場合は、ブリッジモードになります。
VmwareのNATモードと同等で、コンテナは独立したネットワーク名前空間を使用し、docker0仮想ネットワークカードに接続します。docker0ブリッジとiptablesnatテーブル構成を介してホストと通信します。このモードでは、ネットワーク名前空間の割り当て、IPの設定などを各コンテナーに割り当て、ホスト上のDockerコンテナーを仮想ブリッジに接続します。
(1)Dockerプロセスが開始すると、docker0という名前の仮想ブリッジがホスト上に作成され、このホスト上で開始されたDockerコンテナーがこの仮想ブリッジに接続されます。仮想ブリッジは物理スイッチのように機能するため、ホスト上のすべてのコンテナはスイッチを介してレイヤー2ネットワークに接続されます。
(2)docker0サブネットからコンテナにIPを割り当て、docker0のIPアドレスをコンテナのデフォルトゲートウェイとして設定します。ホスト上に仮想NICvethペアデバイスのペアを作成します。Vethデバイスは常にペアで提供され、データチャネルを形成し、データは一方のデバイスから入力され、もう一方のデバイスから出力されます。したがって、vethデバイスは2つのネットワークデバイスを接続するためによく使用されます。
(3)Dockerは、vethペアデバイスの一方の端を新しく作成されたコンテナーに入れてeth0(コンテナーのネットワークカード)という名前を付け、もう一方の端をホストに配置して、veth*と同様の名前を付けます。このネットワークデバイスをdocker0ブリッジに追加します。brctlshowコマンドで表示できます。
(4)docker run -pを使用する場合、dockerは実際にiptablesでDNATルールを作成して、ポート転送機能を実現します。iptables -tnat-vnLを使用して表示できます。
5.カスタムネットワーク
最初にネットワークをカスタマイズしてから、指定したIPを使用してDockerを実行できます
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwor
##fdocker1为执行ifconfig -a 命令时,显示的网卡名,如果不使用--opt 参数指定此名称,那你在使用ifconfig -a命令查看网络信息时,看到的是类似br-110eb56a0b22这样的名字,这显然不怎么好记。
#mynetwork为执行docker network list命令时,显示的bridge网络模式名称。
指定されたIPでDockerを実行します
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash
コンテナリソース制御
1.CPUリソース制御
cgroupsは非常に強力なLinuxカーネルツールであり、名前空間によって分離されたリソースを制限するだけでなく
、リソースの重みを設定したり、使用量を計算したり、プロセスの開始と停止を制御したりすることもできます。したがって、cgroups(コントロールグループ)は、リソースのクォータとメトリックを実装します。
Cgroupsには4つの機能があります。
**リソース制限:**タスクが使用するリソースの合計量を制限できます
**優先度の割り当て:割り当てられたCPUタイムスライスの数とディスクIo帯域幅のサイズにより、実際には制御と同等です。タスク実行優先度レベルのリソース統計:** CPU時間、メモリ使用量など、システムのリソース使用量をカウントできます。
タスク制御: cgroupは、タスクの一時停止や再開などの操作を実行できます。
(1)CPU使用率の上限を設定します
Linuxは、CFS(Completely Fair Scheduler、Completely Fair Scheduler)を使用して、各プロセスによるCPUの使用をスケジュールします。CFSのデフォルトのスケジューリング期間は10msです。
各コンテナプロセスのスケジューリング期間と、この期間中に各コンテナが最大で使用できるCPU時間を設定できます。
--cpu-periodを使用してスケジューリング期間を設定し、-cpu-guotaを使用してコンテナーが各期間で使用できるCPU時間を設定します。両方を一緒に使用できます。CFS期間の有効範囲は1ms〜1sであり、対応する–cpu-periodの値の範囲は1000〜1000000です。
コンテナのCPUクォータは1ms以上である必要があります。つまり、-cpu-quotaの値は1000以上である必要があります。
ファイルを介してCPU使用率の上限を変更する
例:コアが1つだけの仮想マシンを準備する
では、なぜ一度に多くのCPUリソースを占有するのでしょうか。構成ファイルを表示できます。
コンテナの実行時のCPU使用率を指定します
docker run -itd --name 容器名 --cpu-quota 使用率 镜像:标签 bash
(2)CPUリソース占有率を設定します(複数のコンテナを設定することが有効です)
Dockerは**-cpu-shares**を介してCPU共有を指定し、デフォルト値は1024、値は1024の倍数です
さらに3つの端末を開いて、c3、c4、およびc5の3つのコンテナーにログインし、依存パッケージをインストールして、4つのCPUプロセスを生成します。
yum install -y epel-release
yum install -y stress
stress -c 4
別のターミナルを開き、コンテナのCPU比を確認します
docker stats
(3)指定したCPUをバインドするようにコンテナを設定します
まず、4つのCPUコアを仮想マシンに割り当てます
c6コンテナを作成し、CPUNo.1とNo.3をバインドします
[root@localhost ~]# docker run -itd --name c6 --cpuset-cpus 1,3 centos:7 bash
インストール、依存関係パッケージ、ストレステストソフトウェア
yum install -y epel-release
yum install -y stress
ストレステストを開始し、4つのCPUプロセスを生成します
stress -c 4
別のターミナルを開いてtopを実行し、1を押して表示します
2.メモリ使用量の制限
docker run -itd --name 容器名 -m 所限制的内存大小 镜像:标签 bash
docker stats ##查看容器使用情况
(1)スワップパーティションスワップの制限
--memory-swapは--memoryと一緒に使用する必要があることを強調します。
通常、-memory-swapの値には、コンテナの使用可能なメモリと使用可能なスワップが含まれます。
つまり、-m 300m --memory-swap = 1gは、コンテナが300Mの物理メモリを使用でき、700M(1G-300)のスワップを使用できることを意味します。
--memory-swapが0に設定されているか、設定されていない場合、コンテナーが使用できるスワップサイズは-m値の2倍になります。
--memory-swapの値が-mと同じである場合、コンテナーはスワップを使用できません。
--memory-swapの値が-1の場合、コンテナプログラムで使用されるメモリが制限されており、使用できるスワップスペースの使用が制限されていないことを意味します(ホストが使用できるスワップコンテナの数だけ)。
3.ディスクIOクォータ制御の制限(blkio)
--device-read-bps:デバイスの読み取り速度bps(データ量)を制限します。単位はkb、mb(M)、またはgbです。
例: docker run -itd --name test9 --device-read-bps /dev/sda:1M centos:7 /bin/bash
--device-write-bps:デバイスの書き込み速度bps(データ量)を制限します。単位はkb、mb(M)、またはgbです。
例: docker run -itd --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
–device-read-iops:デバイスの読み取りのiops(回数)を制限します
–device-write-iops:デバイスへの書き込みのiops(回数)を制限します
例:
要件:c8コンテナーを作成して開き、イメージはcentos:7であり、/ dev/sdaデバイスの読み取り速度制限は1mb/sに設定されています
docker run -itd --name c8 --device-write-bps /dev/sda:1mb centos:7 bash
docker exec -it c8 bash
テストを書く
dd if=/dev/zero of=test.txt bs=1M count=10 oflag=direct
Dockerが占有しているディスクスペースをクリーンアップします
ディスクのクリーンアップ、閉じたコンテナの削除、不要なデータボリュームおよびネットワークに使用できます
docker system prune -a