基本的なコンテナーを完成させるために、コンテナーが実行する必要のある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
補足コマンドと要約コマンド
- ネットワークカードがない場合はどうなりますか?仮想デバイスを作成し、名前空間に参加します
- ip link add lnic0 type veth peer name rnic0 mkdir -p / var / run / netns
- ln -s / proc /
${PID}/ns/net /var/run/netns/
$ {PID} - ip link set rnic0 netns $ {PID} name eth0
コンテナを構築するための名前空間とchroot
- 名前空間仮想ホストを作成します
- ip netns add vhost
- ipnetnsリスト
- 仮想スイッチを設定する
- ip link add name docker0 type bridge stp_state 1
- ip link set dev docker0 up
- ip addr add 172.17.0.1/16 brd 172.17.255.255 dev docker0
- 仮想ネットワークカードを作成し、仮想スイッチを追加します
- ip link add name global_nic type veth peer name ns_nic
- ip link set dev global_nic promisc on
- ip link set dev global _nic promisc on
- ip link set dev global_nic master docker0
- 名前空間に仮想ネットワークカードを追加し、IPゲートウェイを設定します(vhostはpid番号です)
- ip link set ns_nic netns vhost name eth0
- ip netns exec vhost ip link set dev lo up
- ip netns exec vhost ip link set dev eth0 up
- ip netns exec vhost ip addr add dev eth0 172.17.0.2/16 brd 172.17.255.255
- ルーティングと転送をオンにして、名前空間を外部ネットワークから非常にアクセスしやすくします
- sysctl -w net.ipv4.ip_forward = 1
- ルートディレクトリを使用して名前空間を作成し、名前空間を入力します
- ushare --uts --mount --pid --ipc --fork --mount -proc
- 仮想ディレクトリマッピングアクセスメモリ
- マウント--bind / proc / root / vroot / proc
- ホスト名を設定する
- ホスト名vhost
- 仮想ディレクトリを入力してください
- ip netns exec vhost / usr / sbin / chroot / root / vroot
あまりにも多くの手順が面倒な場合はどうすればよいですか?
- 1つのコマンド(システム独自のコマンドを使用)
- systemd-nspawn -M aabb -D / root / vroot --network-bridge = docker0