GNU/Linux >> Linux の 問題 >  >> Linux

Linuxコンテナの舞台裏

DockerなしでLinuxコンテナを使用できますか? OpenShiftなしですか? Kubernetesがない場合は?

はい、できます。 Dockerがコンテナを一般的な用語にする数年前(つまり、データセンターに住んでいる場合)、LXCプロジェクトは、同じカーネルを共有しながら、ある種の仮想オペレーティングシステムを実行するという概念を開発しましたが、含まれています 定義されたプロセスのグループ内。

DockerはLXC上に構築されており、今日、LXCの作業を直接的および間接的に活用するプラットフォームがたくさんあります。これらのプラットフォームのほとんどは、コンテナーの作成と保守を非常に簡単にします。大規模なデプロイメントでは、このような特殊なサービスを使用するのが理にかなっています。ただし、すべての人が大規模なデプロイメントを管理しているわけではなく、コンテナ化について学ぶために大規模なサービスにアクセスできるわけでもありません。幸いなことに、Linuxを実行しているPCとこの記事だけで、コンテナーを作成、使用、および学習できます。この記事は、LXC、その仕組み、なぜ機能するのか、問題が発生した場合のトラブルシューティング方法を確認することで、コンテナーを理解するのに役立ちます。

シンプルさを回避する

Linuxコンテナ

  • Linuxコンテナとは何ですか?
  • コンテナ用語の概要
  • ダウンロード:Containers Primer
  • Kubernetesオペレーター:コンテナオーケストレーションプラットフォームの自動化
  • eBook:クラウドネイティブアプリを設計するためのKubernetesパターン
  • Kubernetesとは何ですか?

LXCのクイックスタートガイドをお探しの場合は、優れたLinuxContainersのウェブサイトをご覧ください。

LXCのインストール

まだインストールされていない場合は、パッケージマネージャーを使用してLXCをインストールできます。

Fedoraなどでは、次のように入力します。

$ sudo dnf install lxc lxc-templates lxc-doc

Debian、Ubuntuなどでは、次のように入力します。

$ sudo apt install lxc
ネットワークブリッジの作成

ほとんどのコンテナはネットワークが利用可能であることを前提としており、ほとんどのコンテナツールはユーザーが仮想ネットワークデバイスを作成できることを期待しています。コンテナに必要な最も基本的なユニットはネットワークブリッジです。これは、多かれ少なかれ、ネットワークスイッチと同等のソフトウェアです。ネットワークスイッチは、ヘッドフォンジャックを分割するために使用されるスマートYアダプターに少し似ているため、音声信号の代わりにネットワークスイッチがネットワークデータをブリッジすることを除いて、2人が別々のヘッドセットで同じことを聞くことができます。

独自のソフトウェアネットワークブリッジを作成して、ホストコンピューターとコンテナーOSの両方が、単一のネットワークデバイス(イーサネットポートまたはワイヤレスカード)を介して異なるネットワークデータを送受信できるようにすることができます。これは重要な概念であり、手動でコンテナーを生成することを卒業すると失われることがよくあります。これは、デプロイメントのサイズに関係なく、実行するコンテナーごとに専用の物理ネットワークカードを使用する可能性が非常に低いためです。コンテナは仮想ネットワークデバイスと通信することを理解することが重要です。そのため、コンテナがネットワーク接続を失った場合のトラブルシューティングをどこから開始するかを知っておく必要があります。

マシン上にネットワークブリッジを作成するには、適切な権限が必要です。この記事では、 sudoを使用します root権限で操作するコマンド。 (ただし、LXCドキュメントには、 sudoを使用せずにこれを実行する権限をユーザーに付与するための構成が用意されています。 。)

$ sudo ip link add br0 type bridge

架空のネットワークインターフェイスが作成されていることを確認します。

$ sudo ip addr show br0
7: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc
   noop state DOWN group default qlen 1000
   link/ether 26:fa:21:5f:cf:99 brd ff:ff:ff:ff:ff:ff

br0以降 はネットワークインターフェイスと見なされ、独自のIPアドレスが必要です。ネットワーク上の既存のIPアドレスと競合しない有効なローカルIPアドレスを選択し、それを br0に割り当てます。 デバイス:

$ sudo ip addr add 192.168.168.168 dev br0

そして最後に、 br0 稼働中:

$ sudo ip link set br0 up
コンテナ構成の設定

LXCコンテナーの構成ファイルは、ネットワークとホストシステムでのコンテナーの場所を定義するために必要なだけ複雑になる可能性がありますが、この例では構成は単純です。お気に入りのテキストエディタでファイルを作成し、コンテナの名前とネットワークに必要な設定を定義します。

lxc.utsname = opensourcedotcom
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = 4a:49:43:49:79:bd
lxc.network.ipv4 = 192.168.168.1/24
lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596

このファイルをホームディレクトリにmycontainer.confとして保存します 。

lxc.utsname 任意です。コンテナは好きなように呼び出すことができます。これは、開始および停止するときに使用する名前です。

ネットワークタイプはvethに設定されています 、これは一種の仮想イーサネットパッチケーブルです。アイデアは、 veth 接続は、コンテナから lxc.network.linkで定義されているブリッジデバイスに移動します プロパティ、 br0に設定 。コンテナのIPアドレスは、ブリッジデバイスと同じネットワーク内にありますが、衝突を避けるために一意です。

vethを除いて ネットワークタイプとアップ ネットワークフラグ、設定ファイルのすべての値を発明します。プロパティのリストは、 man lxc.container.confから入手できます。 。 (システムにない場合は、パッケージマネージャーで個別のLXCドキュメントパッケージを確認してください。) / usr / share / doc / lxc / examplesにはいくつかの設定ファイルの例があります。 、後で確認する必要があります。

コンテナシェルの起動

この時点で、操作可能なコンテナへの道の3分の2になります。ネットワークインフラストラクチャがあり、架空のPCに架空のネットワークカードをインストールしました。今必要なのは、オペレーティングシステムをインストールすることだけです。

ただし、この段階でも、コンテナスペース内でシェルを起動することでLXCが機能していることを確認できます。

$ sudo lxc-execute --name basic \
--rcfile ~/mycontainer.conf /bin/bash \
--logfile mycontainer.log
#

この非常にむき出しのコンテナで、ネットワーク構成を確認します。見慣れた、しかしユニークに見えるはずです。

# /usr/sbin/ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state [...]
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
[...]
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> [...] qlen 1000
link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0
   valid_lft forever preferred_lft forever
inet6 2003:db8:1:0:214:1234:fe0b:3596/64 scope global
   valid_lft forever preferred_lft forever
[...]

コンテナは、偽のネットワークインフラストラクチャと、なじみのあるが独自のカーネルを認識しています。

# uname -av
Linux opensourcedotcom 4.18.13-100.fc27.x86_64 #1 SMP Wed Oct 10 18:34:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

出口を使用する コンテナを離れるコマンド:

# exit
コンテナオペレーティングシステムのインストール

完全にコンテナー化された環境を構築することは、ネットワーキングと構成のステップよりもはるかに複雑なので、LXCからコンテナーテンプレートを借りることができます。テンプレートがない場合は、ソフトウェアリポジトリで別のLXCテンプレートパッケージを探してください。

デフォルトのLXCテンプレートは、 / usr / share / lxc / templatesで利用できます。 。

$ ls -m /usr/share/lxc/templates/
lxc-alpine, lxc-altlinux, lxc-archlinux, lxc-busybox, lxc-centos, lxc-cirros, lxc-debian, lxc-download, lxc-fedora, lxc-gentoo, lxc-openmandriva, lxc-opensuse, lxc-oracle, lxc-plamo, lxc-slackware, lxc-sparclinux, lxc-sshd, lxc-ubuntu, lxc-ubuntu-cloud
>

お気に入りを選んで、コンテナを作成します。この例ではSlackwareを使用しています。

$ sudo lxc-create --name slackware --template slackware

テンプレートが実行されるのを見るのは、テンプレートを最初から作成するのとほぼ同じくらい教育的です。非常に冗長で、 lxc-createであることがわかります。 コンテナの「ルート」を/var / lib / lxc / slackware / rootfsに設定します いくつかのパッケージがダウンロードされ、そのディレクトリにインストールされています。

テンプレートファイルを読むと、何が関係しているのかがさらによくわかります。LXCは、最小限のデバイスツリー、共通のスプールファイル、ファイルシステムテーブル(fstab)、initファイルなどをセットアップします。また、コンテナー内で意味をなさない一部のサービス(ハードウェア検出用のudevなど)が開始されないようにします。テンプレートは幅広い典型的なLinux構成をカバーしているため、独自の構成を設計する場合は、セットアップしたいものに最も近いテンプレートに基づいて作業することをお勧めします。そうしないと、LXCプロジェクトがすでにつまずいて説明している(他に何もないとしても)省略の誤りを犯すことは間違いありません。

最小限のオペレーティングシステム環境をインストールしたら、コンテナを起動できます。

$ sudo lxc-start --name slackware \
--rcfile ~/mycontainer.conf

コンテナを起動しましたが、アタッチしていません。 (前の基本的な例とは異なり、今回はシェルを実行しているだけでなく、コンテナー化されたオペレーティングシステムを実行しています。)名前でシェルにアタッチします。

$ sudo lxc-attach --name slackware
#

ご使用の環境のIPアドレスが構成ファイルのIPアドレスと一致していることを確認してください。

# /usr/sbin/ip addr SHOW | grep eth
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 [...] 1000
link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0

コンテナを終了し、シャットダウンします。

# exit
$ sudo lxc-stop slackware

LXCを使用した実際のコンテナーの実行

実生活では、LXCを使用すると、安全で安全なコンテナーを簡単に作成して実行できます。コンテナは2008年にLXCが導入されてから長い道のりを歩んできました。そのため、開発者の専門知識を活用してください。

linuxcontainers.orgのLXCの説明によりプロセスが簡単になりますが、この手動のツアーでは、舞台裏で何が起こっているのかを理解するのに役立ちます。


Linux
  1. Linuxatコマンドでタスクをスケジュールする

  2. Linuxカーネルをftraceで分析する

  3. GNUbcを使用してLinuxシェルで数学を実行します

  1. nmcliを使用してLinuxコマンドラインからネットワーク接続を管理する

  2. Linuxファイアウォールの使用を開始する

  3. LXC コマンドを使用して LXC Linux コンテナを作成および起動する方法

  1. LinuxでNetworkManagerを使い始める

  2. Linuxcronコマンドを使用したタスクのスケジューリング

  3. ネットワークを介したLinuxでのファイル変更の監視に関する考え