Dockerコンテナ内でホストDocker操作を呼び出して実行する

Dockerコンテナ内でホストDocker操作を呼び出して実行する

まず、この投稿は Docker 初心者向けです。もちろん、ベテランであれば記事中の分割線以降の操作方法もアイディアの一つです。

まず、docker 内でホストマシンの docker 操作を実行する方法、これを docker in docker と呼びます。

なぜホストマシンの Docker を Docker で操作する必要があるかについては、その利点は明らかです。ホストマシンに直接インストールしなくても、コンテナに特定のニーズを展開できます (ホストマシンの Docker を Docker で操作する方法がないと仮定すると、そのようなソフトウェア プログラムはホストマシンに直接インストールすることしかできず、管理と保守に役立たないことは明らかです)。

この要件を満たすのは、実はとても簡単です。Docker ホストの docker ファイルと docker.sock ファイルをコンテナにマウントするだけです。具体的には、次のようになります。

-v /var/run/docker.sock:/var/run/docker.sock

:/usr/bin/docker をダブルクリックします。

まず、ホスト マシン上の docker と docker.sock の場所を見つける必要があります。これらを間違ってマウントしないでください。標準の Linux では通常、上記の場所が使用されます。

Dockerコンテナを起動したら、上記2つのファイルを正常にマウントした後、Docker内でdocker imagesなどのコマンドを実行できるようになります。

許可が拒否された場合

unix:///var/run/docker.sock の Docker デーモン ソケットに接続しようとしたときにアクセスが拒否されました

…………………………………………………………

ダイヤル unix /var/run/docker.sock: 接続: 権限が拒否されました

回避策

コンテナが配置されているホストで、docker.sockに777権限を直接付与し、コマンドchmod 777 docker.sockを実行します。

ゴージャスな境界線

以下はQunhuiシステムに関するものです。このシステムが何であるかをあまり気にする必要はありません。簡単に言うと、このシステムにはDocker特有の問題があり、思い通りに行うことが困難です。そこで、私はそれに対処するための回避策を採用しました(議論を始めるための考え方です)。まずは現状を説明します。

システムは、docker 用の UI 管理ツールを提供します。このツールで通常のマウント操作を実行できますが、上記の docker および docker.sock ファイルをマウントする場合は機能しません。まずはスクリーンショットを見てみましょう。

UI操作の制限について画像で解説します!

Qunhui は選択できるファイルを公式に制限しています。/usr/<yyyy-mm-sock>/va/<yyyy-mm-sock> などのシステムレベルのファイルを選択することはできません。つまり、docker および docker.sock ファイルを直接マウントすることはできません。

ln -s ソフトリンクを実行することは可能ですか?

試してみたところ、まずsshコマンドラインを介してjenkinsフォルダに2つのソフト接続を作成し(dockerとdocker.sockをソフト接続)、その後Qunhui UIインターフェースに戻りましたが、それでも選択できませんでした(Qunhuiがソフト接続ファイルを直接ブロックしたため、表示されません)。

それで、どうやって解決するのでしょうか?

私の方法は次のとおりです(ソフトリンク方式は変更されています):

1. jenkinsディレクトリにdockerとdocker.sockの2つのファイルを作成します(適切な名前を付けます)。

2. 次に、docker の [ファイルの追加] ボタンをクリックし、通常どおりにこの 2 つのファイルを選択してマウントします。通常どおりマウントして、その他の構成を完了できます。構成が完了したら、当面は docker コンテナを起動しないでください。

3. ssh 経由で Qunhui にログインし、jenkins ディレクトリに作成した 2 つのファイルを削除し、docker および docker.sock ソース ファイルの jenkins へのソフト リンクを作成します。

root@test:cd /volume1/docker/jenkins/
ルート@テスト:rm -rf docker docker.sock
ルート@テスト:ln -s /run/docker.sock /volume1/docker/jenkins/docker.sock
ルート@テスト:ln -s /usr/local/bin/docker /volume1/docker/jenkins/docker
ルート@テスト:/volume1/docker/jenkins#ll
合計 8
drwxrwxrwx+ 1 ナゲッツ ユーザー 96 6月 6日 11:22 .
drwxr-xr-x+ 1 ルート ルート 188 5月30日 19:29 ..
lrwxrwxrwx 1 root root 21 6月 6 11:22 docker -> /usr/local/bin/docker
lrwxrwxrwx 1 root root 16 6月 6 11:21 docker.sock -> /run/docker.sock
drwxrwxrwx+ 1 shanhongyu ユーザー 24 6月 1 11:07 java_home
drwxrwxrwx+ 1 ナゲッツ ユーザー 4476 6月 6日 11:00 jenkins_home
drwxrwxrwx+ 1 shanhongyu ユーザー 82 6月 1 11:12 maven_home

4. その後、Qunhui UI に戻り、コンテナーを起動すると、完璧になります。

(Qunhui ではソフトリンクを選択できませんが、Linux と Docker では基本的にソフトリンクを直接マウントできます)

追加知識: Docker を使用してイメージ内のホスト プログラムを実行する

docker run コマンドは、新しいコンテナ内でコマンドを実行するために使用されます。 docker run コマンドは、まず指定されたイメージ上に書き込み可能なコンテナ レイヤーを作成し、次に指定されたコマンドを使用してそれを起動します。

つまり、docker run は API /containers/create および /containers/(id)/start と同等です。

停止したコンテナは、docker start を使用して、以前の変更をすべてそのままにして再起動できます。 すべてのコンテナのリストを表示するには、docker ps -a を参照してください。

使用法

docker run [オプション] イメージ [コマンド] [引数...]

シェル

名前を指定して疑似TTYを割り当てる(-name、-it)

$ docker run --name テスト -it debian
 
root@d6c0fe130dba:/# 終了 13
$ エコー $?
13
$ docker ps -a | grep テスト
d6c0fe130dba debian:7 "/bin/bash" 26秒前 終了 (13) 17秒前 テスト

シェル

この例では、debian:latest イメージを使用して test という名前のコンテナを実行します。 - コンテナの stdin に接続された疑似 TTY を割り当てるように Docker に指示します。これにより、コンテナ内に対話型の bash シェルが作成されます。 この例では、exit 13 と入力して bash シェルを終了します。この終了コードは docker run の呼び出し元に渡され、テスト コンテナのメタデータに記録されます。

コンテナ ID をキャプチャする (-cidfile)

$ docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"

シェル

これにより、コンテナが作成され、コンソールにテストが出力されます。 --cidfile フラグにより​​、Docker は新しいファイルを作成し、そこにコンテナ ID を書き込もうとします。ファイルがすでに存在する場合、Docker はエラーを返します。 Docker の実行が終了すると、Docker はこのファイルを閉じます。

完全なコンテナ機能(-privileged)

$ docker run -t -i --rm ubuntu bash
root@bc338942ef20:/# マウント -t tmpfs none /mnt
マウント: 権限が拒否されました

シェル

これは、潜在的に危険なカーネル機能のほとんどがデフォルトで削除されているため機能しません。これには、cap_sys_admin (ファイルシステムをマウントするために必要) が含まれます。 ただし、--privileged フラグを使用すると実行できます。

$ docker run -t -i --privileged ubuntu bash
root@50e3f57e16e6:/# マウント -t tmpfs none /mnt
ルート@50e3f57e16e6:/# df -h
ファイルシステムサイズ 使用済み 使用可能使用率 マウント先
なし 1.9G 0 1.9G 0% /月

シェル

作業ディレクトリを設定する [-w]

$ docker run -w /path/to/dir/ -i -t ubuntu pwd

シェル

-w は、ディレクトリ (ここでは /path/to/dir/) 内でのコマンドの実行を許可します。 パスが存在しない場合は、コンテナ内に作成されます。

各コンテナのストレージドライバーオプションを設定する

$ docker run -it --storage-opt size=120G fedora /bin/bash

シェル

tmpfs をマウントする (-tmpfs)

$ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k my_image

シェル

--tmpfs フラグは、rw、noexec、nosuid、size=65536k オプションを使用して、空の tmpfs をコンテナーにマウントします。

ボリュームをマウントする (-v, --read-only)

$ docker run -v `pwd`:`pwd` -w `pwd` -i -t ubuntu pwd

シェル

-v フラグは、現在の作業ディレクトリをコンテナにマウントします。 -w は、現在の作業ディレクトリでコマンドの実行を有効にし、ディレクトリを pwd によって返された値に変更します。したがって、この組み合わせでは、コンテナを使用してコマンドが実行されますが、現在の作業ディレクトリで実行されます。

$ docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash

シェル

バインドされたボリュームのホスト ディレクトリが存在しない場合は、Docker によってホスト上にこのディレクトリが自動的に作成されます。 上記の例では、Docker はコンテナを起動する前に /doesnt/exists フォルダーを作成します。

$ docker run --read-only -v /icanwrite busybox touch /icanwrite/here

シェル

ボリュームを --read-only と組み合わせて使用​​することで、コンテナーがファイルを書き込む場所を制御できます。 --read-only フラグは、コンテナのルート ファイルシステムを読み取り専用としてマウントし、コンテナの指定されたボリュームの外部の場所への書き込みを禁止します。

ホストの docker 操作を docker コンテナ内で呼び出して実行する方法については、上記の記事が皆さんにお伝えできるすべてです。この記事が皆さんの参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Dockerはコンテナとホスト間でのシェルコマンドのシームレスな呼び出しを可能にします
  • Dockerコンテナにホストディレクトリへの書き込み権限がない場合の解決策
  • Dockerコンテナがホストポートにアクセスできない場合の解決策
  • ホスト上のDockerコンテナ内でシェルまたはプログラムを実行する
  • dockerコンテナがIP経由でホストマシンにアクセスできない問題を解決する方法の詳細な説明
  • Dockerコンテナを使用してホストネットワークにアクセスする方法
  • Dockerコンテナとホストマシン間の8時間の差の問題を解決する

<<:  Vue3.0のさまざまなリスニング方法の包括的な概要

>>:  HTML で相対パスを使用してディレクトリのすべてのレベルのファイルを取得する方法の詳細な説明

推薦する

Vueでフォームデータを取得する方法

目次必要データを取得して送信するテンプレートフィルターフィルターの使用シナリオ要約する必要Vue を...

Tomcat10 Catalinaのログの文字化けの問題を解決する

実行環境、Idea2020バージョン、Tomcat10、実行時にTomcat CatalinaLog...

動的なテーブル効果を実現するJavaScript

この記事では、動的なテーブル効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

CentOS7環境にMySQL5.5データベースをインストールする

目次1. 現在のシステムにMySQLがインストールされているかどうかを確認する2. インストールされ...

XHTML 特殊文字コレクション

注意&#160;ノーブレークスペース = ノーブレークスペース、 iexcl ¡ &...

JavaScript 配列メソッド - 体系的な概要と詳細な説明

目次一般的な配列メソッド配列要素の追加と削除配列ヘッダーの操作配列の末尾を操作する任意の場所に追加ま...

ウェブページのカラーマッチングスキルについての簡単な説明(フロントエンド開発者必読)

一般的に、Web ページの背景色は、より柔らかく、よりシンプルで、より明るく、暗いテキストとマッチし...

HTMLファイルとは何ですか?HTMLファイルを開く方法

HTML は Hypertext Markup Language の略です。現在、ほとんどの Web...

WeChatミニプログラムページとコンポーネント間の情報伝達と機能呼び出し

今回は、私自身の開発経験を踏まえて、以下の観点で関連内容を解説します。ページからコンポーネントにデー...

W3C チュートリアル (8): W3C XML スキーマのアクティビティ

XML スキーマは、DTD に代わる XML ベースのものです。 XML スキーマは、DTD に代わ...

Linux カーネル デバイス ドライバー 高度な文字デバイス ドライバーのメモ

/****************** * 高度な文字デバイス ドライバー ***********...

Vueはフィルターを使用して日付をフォーマットします

この記事では、フィルターを使用して日付をフォーマットするVueの具体的なコードを参考までに紹介します...

mysql bin-log ログファイルを sql ファイルに変換する方法

mysqlbinlogのバージョンを表示mysqlbinlog -V [--version] bin...

MySQL サブクエリ (ネストされたクエリ)、結合テーブル、複合クエリの詳細な説明

1. サブクエリMySQL 4.1以降はサブクエリをサポートしていますサブクエリ:別のクエリ内にネス...

mysqldump でデータベースをバックアップするときに特定のライブラリを除外する例

例: mysqldump –all-databases を使用すると、すべてのライブラリがエクスポー...