Dockerコンテナテクノロジーの原則の分析(カスタムコンテナを作成する2つの方法)

基本的なコンテナーを完成させるために、コンテナーが実行する必要のある6つの分離
Linuxカーネルは、これらの6つの名前空間分離システムコールを提供します
シリアルナンバー 名前空間 システムコールパラメータ 検疫内容
1 UTS CLONE_NEWUTS ホスト名とドメイン名
2 IPC CLONE_NEWIPC セマフォ、共有メモリ
3 PID CLONE_NEWPID プロセス番号
4 通信網 CLONE_NEWNET インターネット機器
5 マウント CLONE_NEWNS マウントポイント、ファイルシステム
6 ユーザー CLONE_NEWUSER ユーザーとユーザーグループ
名前空間を実装するLinuxカーネルの主な目的は、軽量の仮想化(コンテナー)サービスを実現することです。同じ名前空間の下のプロセスは、互いの変更を認識でき、外部プロセスについて何も知らないため、コンテナーを作成できます。プロセスは幻想を生み出します。
仮想ルートを作成する
[root@es2 ~]# mkdir vroot
[root@es2 ~]# yum -y install --installroot=/root/vroot  bash yum coreutils
[root@es2 ~]# cd vroot
[root@es2 vroot]# ls

bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr

  • 分離スペースコマンドのヘルプ情報コマンドを表示する
[root@es2 ~]# man unshare
[root@es2 ~]# man setns
例えば:
  • シリアル番号(1):ホスト名分離スペースの使用(以下では同じマシンと2つの端末が使用され、1、2で区別されます)
2]# ushare --uts         //开启命名空间
2]# hostname bbb     //设置主机名
2]# bash
2]# exit      
1]# echo $HOSTNAME     //终端2改变了,但是终端1未影响
  • シリアル番号(2):ファイルシステムのマウントはユーザーから分離されていますuser unshare --mount

- - - - - ターミナル1 -​​ - - - -

1]# mount -l     // 查看可用的mount 文件
1]# cd /var/tmp
1]# lftp 192.168.1.254
lftp  192.168.1.254:->  ls
lftp  192.168.1.254:/> cd ios/
lftp  192.168.1.254:/iso>get RHEL7-extras.iso
lftp  192.168.1.254:/iso> bye
tmp]# ls
tmp]# unshare --mount
tmp]# mount -t iso9660 -o   loop,ro    RHEL7-extras.iso  /mnt/
tmp]# mount -l  | grep iso    

- - - - - ターミナル2 - - - - -

2]# mount -l  | grep iso   终端2 看不见
  • シリアル番号(3):IPCおよびPID分離unshare --pid --ipc --fork --mount --proc / bin / bash
    ---------ターミナル1 -​​-------- -
1]# ps -ef
1]# systemctl stop docker
1]# pstree -p
systemd(1)
1]# unshare --pid --ipc --fork --mount-proc /bin/bash
1]#pstree -p
bash(1) 
1]# kill -9 2346      //在终端2上随便找一个进程杀死,由于已隔离,无法杀死

---------ターミナル2 ----------
(次の操作は、dockerを閉じて、ネットワークカードを削除することです。dockerがオンになっていない場合は、次の操作を行う必要はありません。 )

2]# yum install bridge-utils
2]# ip link set dev docker0  down
2]# ip help link
2]# ip link help link
2]# ip link  del link dev docker0
2]# brctl show 
2]# ifconfig
  • シリアル番号(4):ネットワークネットワーク分離unshare --net / bin / bash
    ---------端末1 ---------
1]# ifconfig

- - - - - ターミナル2 - - - - -

2]# unshare --net /bin/bash
2]# ifconfig    //已无网卡
2]# ifconfig -a   //仅有本地回环地址
2]# ifconfig lo up    //启动回环
ネットワーク仮想スイッチを作成する
1]# ip link add name docker0 type bridge stp_state 1   //docker可改任意名  bridge 虚拟交换机   stp_state 1 打开协议
1]# ifconfig -a
1]# ip link set dev docker0 up  //开启虚拟交换机电源 
1]# ifconfig 
1]# ip addr add 172.17.0.1/16 brd 172.17.255.255 dev docker0    //设置ip地址
1]# ifconfig
仮想ネットワークカード(1対2ポートデバイス)を作成します
1]# ip link add lnic0 type veth peer  name rnic0    //lnic0 本地网卡    rnic0 容器插入网卡
1]# ifconfig -a      //能看见,但未使用
1]# ip netns list     //查看命名空间
1]# mkdir -p /var/run/netns
1]# cd  /var/run/netns
1]# ls

別のターミナルに移動して、名前空間プロセスを表示します

2 ]# echo  $$     // (以12345为例)
12345

ターミナルに戻る

1]# ln -s /proc/12345/ns/net  /var/run/netns/12345
1]# ll
1]# ip netns list
1]# ifconfig -a
1]# ip link set rnic0 netns 12345 name  eth0
2]# ifconfig -a    //会出现eth0
2]# ifconfig eth0 up
1]# ip netns exec 12345  ip addr  add dev eth0 172.17.0.2/16 brd 172.17.255.255    //设置ip地址
2]# ifconfig     
2]# ping 172.17.0.1     //ping 不通  (虚拟交换机只连接了一头)
1]# ip link set dev lnic0 master  docker0      //  (设置虚拟交换机连接容器)
1]# ip link set dev lnic0 up            //启动
2]# ping 172.17.0.1     //ping 不通   (未开启路由转发)
1]#sysctl -w net.ipv4.ip_forward=1    //开启路由转发
2]# ping 172.17.0.1 
2]# ping 192.168.1.254     //ping不通  (未设置网关)
2]# ip route replace default via 172.17.0.1       //设置网关
2]# ping 192.168.1.254     //ping通
2]#  pstree -p
systemd(1)

コンテナを起動して実行します

フルバージョン1(ターミナル2)
2]# cd vroot/
2]#touch docker           //为了区别真实根和虚拟根 
2]# ushare --uts --mount --pid --ipc --fork --mount-proc
2]# mount --bind /proc  /root/vroot/proc
2]# hostname mydocker
2]# /usr/sbin/chroot  /root/vroot
2]# yum install psmisc vim net-tools 
2]# ls /
2]# pstree -p
bash(1)
2]# ifconfig
eth0 :172.17.0.2
2]# 
フルバージョン2(ターミナル1)
1]# systemd-nspawn   -M   aabb    -D  /root/vroot  --network-bridge=docker0
ooxx]# ifconfig -a
ooxx]# yum -y install  iproute
ooxx]# ip link set  host0 name eth0
ooxx]# ifconfig -a
ooxx]# ifconfig eth0 172.17.0.3/16
ooxx]# ip route replace ddefault via 172.17.0.1
ooxx]# yum provides ping
ooxx]# yum -y install iputils
補足コマンドと要約コマンド
  1. ネットワークカードがない場合はどうなりますか?仮想デバイスを作成し、名前空間に参加します
  2. ip link add lnic0 type veth peer name rnic0 mkdir -p / var / run / netns
  3. ln -s / proc / ${PID}/ns/net /var/run/netns/$ {PID}
  4. ip link set rnic0 netns $ {PID} name eth0
コンテナを構築するための名前空間とchroot
  • 名前空間仮想ホストを作成します
  1. ip netns add vhost
  2. ipnetnsリスト
  • 仮想スイッチを設定する
  1. ip link add name docker0 type bridge stp_state 1
  2. ip link set dev docker0 up
  3. ip addr add 172.17.0.1/16 brd 172.17.255.255 dev docker0
  • 仮想ネットワークカードを作成し、仮想スイッチを追加します
  1. ip link add name global_nic type veth peer name ns_nic
  2. ip link set dev global_nic promisc on
  3. ip link set dev global _nic promisc on
  4. ip link set dev global_nic master docker0
  • 名前空間に仮想ネットワークカードを追加し、IPゲートウェイを設定します(vhostはpid番号です)
  1. ip link set ns_nic netns vhost name eth0
  2. ip netns exec vhost ip link set dev lo up
  3. ip netns exec vhost ip link set dev eth0 up
  4. ip netns exec vhost ip addr add dev eth0 172.17.0.2/16 brd 172.17.255.255
  • ルーティングと転送をオンにして、名前空間を外部ネットワークから非常にアクセスしやすくします
  1. sysctl -w net.ipv4.ip_forward = 1
  • ルートディレクトリを使用して名前空間を作成し、名前空間を入力します
  1. ushare --uts --mount --pid --ipc --fork --mount -proc
  • 仮想ディレクトリマッピングアクセスメモリ
  1. マウント--bind / proc / root / vroot / proc
  • ホスト名を設定する
  1. ホスト名vhost
  • 仮想ディレクトリを入力してください
  1. ip netns exec vhost / usr / sbin / chroot / root / vroot
あまりにも多くの手順が面倒な場合はどうすればよいですか?
  • 1つのコマンド(システム独自のコマンドを使用)
  1. systemd-nspawn -M aabb -D / root / vroot --network-bridge = docker0

おすすめ

転載: blog.csdn.net/weixin_45942735/article/details/104364584