docker run
commandは、Dockerのインストール後に学習する必要がある最初のコマンドの1つです。しかし、他にどのようにdocker run
を使用できるのか疑問に思ったことはありませんか。 アプリケーションを効果的に展開および管理するためのコマンド? Dockerの実行例(docker run)
を1つ見ていきます。 素晴らしいことだ。しかし、何を推測してください、あなたはこのチュートリアルでより多くを得るでしょう!
この記事では、ワークフローを改善するために使用できるDockerの実行例を使用してDevOpsゲームをアップする方法を学習します。
読み進めて、Dockerコマンドを再度実行しても失われることはありません!
前提条件
このチュートリアルは、実践的なデモンストレーションになります。フォローする場合は、次のものがあることを確認してください。
- Linuxマシン–このデモはUbuntu 20.04を使用していますが、どのLinuxディストリビューションでも機能します。 Ubuntuをインストールする方法は次のとおりです。
- Dockerがマシンにインストールされています。
- root /sudo権限を持つユーザーアカウント。
Docker実行の例1:コンテナをインタラクティブに実行する
しばらくの間コンテナを実行している可能性がありますが、Dockerコンテナをインタラクティブモードで実行するための好ましい状況がいくつかあることをご存知ですか?
Dockerを使用すると、次の場合にインタラクティブモードでコンテナーを実行できます。
- 問題のトラブルシューティングを行っているため、コンテナ内で実行されたコマンドの出力を確認する必要があります。
- 新しいDockerコマンドを試していて、コマンドの結果をリアルタイムで確認したい。
- コンテナ内で、手動入力が必要なプロセスを実行しています。
Dockerの実行例を実行する場合(docker run
)オプションのないコマンドの場合、デフォルトの動作は、コンテナをインタラクティブモードで実行することです。コンテナをインタラクティブモードで実行すると、端末のコンテナで実行されたコマンドの出力を確認できます。
1.次のコマンドを実行して、コンテナーを実行します(my_nginx
)インタラクティブモードで公開(-p
)ポート80
コンテナのポート8080
への あなたのホストマシンの。コンテナの名前は好きなように変更できます。
このコマンドはnginx
を使用します Dockerハブからのイメージを使用してコンテナーを作成し、自動的に削除します(--rm
)コンテナが停止したときのコンテナ。
docker container run --rm --name my_nginx -p 8080:80 nginx
root以外のユーザーを使用しているため sudo特権 、Dockerコマンドを実行するときにsudoを付加する必要はありません
以下に示すように、ターミナルにnginxウェブサーバーのログ出力が直接表示されます。
インタラクティブコンテナを実行すると多くの情報が提供されますが、必要な情報だけを除外したい場合もあります。その場合は、以下に示すように、-aフラグを追加し、コンテナーの標準ストリーム(-a)を指定します。
標準ストリームを指定すると、My_nginxコンテナのstdout出力のみを表示するようにDockerに指示されます。
docker container run -a stdout --rm --name my_nginx -p 8080:80 nginx
デフォルトでは、-aフラグを指定しない場合、stdin、stdout、およびstderrはすべて端末に接続されます。 -aフラグは次の引数を取り、出力を整理して関連情報のみを表示するのに役立ちます。
-
-a stdin
–stdin
を添付します コンテナに送信し、端末のすべての入力をコンテナに送信します。
-
-a stdout
–stdout
を添付します コンテナに、コンテナによって生成されたすべての出力を端末に表示します。
-
-a stderr
–stderr
を添付します コンテナに送信され、コンテナによって生成されたすべてのエラーメッセージが端末に表示されます。
以下から、出力がすっきりしていることがわかります。
2.次に、別のターミナルを開き、docker ps
を実行します コマンドを実行して、ホストマシンで実行されているコンテナのリストを表示します。
docker ps
以下に、出力にリストされているmy_nginxコンテナーを示します。
3.最後に、curl
を実行します 以下のコマンドを使用して、nginxWebサーバーをテストします。
curl http://localhost:8080
以下に、出力が生成されるとすぐに、nginx Webサーバーのログ出力がターミナル(左側)に表示されることがわかります。
Dockerの実行例2:コンテナをデタッチモードで実行する
コンテナをインタラクティブモードで実行し、実行時にターミナルで出力を確認する方法を学びました。ただし、ターミナルでコンテナの出力を監視していない場合は、コンテナをデタッチモードで実行できます。
デタッチモードでは、コンテナはバックグラウンドで実行され、ターミナルのコンテナで実行したコマンドの出力は表示されません。
次のコマンドを実行して、コンテナーを実行します(my_nginx
)デタッチモード(-d
。
docker container run --rm --name my_nginx -d -p 8080:80 nginx
コンテナがデタッチモードで実行されると、Dockerは出力をコンテナのログにリダイレクトします。この時点で、my_nginxコンテナは、以下に示すように、バックグラウンドコマンド出力で実行されています。
また、出力に一意のコンテナIDが表示されます。このIDを使用して、コンテナーを接続したり、コンテナーを開始/停止/削除したりできます。
次に、docker ps
を実行します コマンドを実行して、ホストマシンで実行されているコンテナのリストを表示します。
コンテナ(my_nginx)はバックグラウンドで実行されているため、新しいターミナルを開かなくても任意のコマンドを実行できます。
docker ps
次の出力が表示されます。これは、 my_nginxを示しています。 コンテナは現在、デタッチモードで実行されています。
何らかの理由で、コンテナがデタッチモードで実行されているときにNGINXウェブサーバーが正しく機能しない場合は、実行中のコンテナに端末を接続する必要があります。 docker attach
を実行すると、実行中のコンテナにアタッチできます コマンドの後にコンテナのIDまたは名前(my_nginx
)、以下に示すように。
docker container attach my_nginx
以下に示すように、 my_nginxへの接続に成功しました 容器。これで、問題の根本的な原因を特定して修正できます。
ブリッジネットワークの作成
Dockerを使用する利点の1つは、コンテナーネットワークを管理することです。 Dockerを使用すると、ネットワークの構成について心配する必要はありません。 Dockerはネットワークを自動的にセットアップします。ネットワークの作成、コンテナのネットワークへの接続、IPアドレスの管理などが含まれます。
Dockerがコンテナのネットワークを設定し、ブリッジネットワークを作成する方法をご覧ください。
1. docker
を実行します 以下のコマンドを実行して、ホストマシン(--net=host
)上のネットワークリソースに完全にアクセスできるUbuntuコンテナを実行します。 )、これはデバッグに便利です。
-tiオプションは、コンテナーをインタラクティブモードに保つようにDockerに指示します。 Bashシェルを使用している場合は、このオプションを指定する必要があります。 「コンテナのインタラクティブな実行」セクションのようにこのコマンドを実行しても機能しません。
docker run -ti --rm --net=host ubuntu bash
2.次に、apt update
を実行します コンテナ内のコマンドを使用して、パッケージリストを更新します。
apt update -y
3.以下のコマンドを実行して、install
を実行します bridge-utils
パッケージ。このパッケージは、ブリッジデバイスを作成および管理するために必要です。
apt install bridge-utils
4.次に、次のbrctl show
を実行します。 システム上のブリッジネットワークを一覧表示するコマンド。
brctl show
次の出力のようなブリッジネットワークのリストが表示されます。 docker0という名前のブリッジデバイスがあることに注意してください。このネットワークは、カスタムブリッジ仮想ネットワークを指定しない場合にDockerがコンテナーの仮想ネットワークを作成するために使用する仮想ネットワークです。
5.別の端末を開き、docker network
を実行します 以下のコマンドを使用して、新しいネットワークを作成します。ネットワークには別の名前を付けることができますが、このチュートリアルでは、ネットワークの名前はmy-ata-network
です。 。
docker network create my-ata-network
以下に示すように、一意のネットワークIDが返されます。後で新しいブリッジネットワークIDと照合するため、ネットワークIDを書き留めておきます(ステップ6)。
6. Ubuntuコンテナターミナルに戻り、次のコマンドを実行してブリッジネットワークを一覧表示します(show
)システム上で再び。
brctl show
以下に示すように、br-d9ba7f94ac73という名前の出力にリストされた新しいブリッジネットワークが表示されます。 d9ba7f94ac73の部分が、手順5で返されたネットワークIDと一致していることがわかります。
この出力は、Dockerがmy-ata-networkという名前の新しいブリッジネットワークを作成し、そのブリッジネットワークにUbuntuコンテナを追加したことを確認します。
Dockerの実行例3:ポートフォワーディングを使用したコンテナーの実行
Dockerは、Linuxカーネルに組み込まれているファイアウォール機能、つまりiptables
を使用します。 コマンド、ファイアウォールルールを作成します。これらのファイアウォールルールは、パケットがブリッジ間で送信されるタイミングを制御し、したがって、それらのブリッジに接続されたコンテナで使用できるようになります。
Dockerがiptables
を使用して内部でポート転送をどのように実現するかを見てみましょう。 。
1.次のコマンドを実行して、特権Ubuntuコンテナを起動します(--privileged=true
)ポート転送を含む、ホスト上のすべてのネットワークリソースへのフルアクセス。
docker run -ti --rm --net=host --privileged=true ubuntu bash
2.次に、以下のコマンドを実行してupdate
パッケージリストとinstall
iptables
。
apt update && apt install iptables
3. iptables
を実行します リストする特権Ubuntuコンテナで以下のコマンド(-L
)nat
テーブルルール。
iptables -n -L -t nat
以下に表示されているのは、Ubuntuに付属しているデフォルトのルールです。
4.次に、以下のコマンドを実行して、Ubuntu
を実行します。 ポート8080
でホストにポート転送するコンテナ 。
docker run -ti --rm -p 8080:8080 ubuntu bash
5.最後に、iptables
を再実行します 以下のコマンドでnat
を一覧表示します テーブルルール。
iptables -n -L -t nat
以下に、新しいルールが追加され、すべてのパケットがホストのポート(8080)からコンテナのポート(8080)に転送されることに注意してください。 Dockerでポートを公開することは、ネットワーク層でのポート転送にすぎないことがわかります。
ユーザー定義ネットワークの作成
Docker DCA試験では、開発者向けのブリッジネットワークを作成するように求められる場合があります。どのように? docker network
を使用する コマンドを使用すると、ブリッジネットワーク(ユーザー定義の仮想ネットワーク)を作成できます。 docker network
さまざまなネットワーク上のコンテナが通信する方法を提供します。
1. docker network
を実行します 以下のコマンドを使用して、ata-app-net
という名前の新しいブリッジネットワークを作成します。 bridge
を使用する 運転者。
docker network create --driver bridge ata-app-net
2.次に、次のコマンドを実行してリストします(ls
)ホスト上のブリッジネットワーク。
docker network ls
以下で、ata-app-netという名前の新しいユーザー定義のブリッジネットワークが作成されていることに注意してください。
3.以下のコマンドを実行して表示します(inspect
)ata-app-net
の詳細 ブリッジネットワーク。
docker network inspect ata-app-net
以下では、ata-app-netブリッジネットワークに単一のサブネット(172.21.0.0/16)があることに注意してください。このサブネットは、ブリッジネットワークを作成するときに自動的に割り当てられます。ブリッジネットワークに関連付けられているドライバー(ブリッジ)も表示されます。
4.次に、このDocker実行例を実行します(docker run
)以下のコマンドを使用して、ユーザー定義のブリッジネットワークでいくつかの高山コンテナを実行し、相互にpingを試行します。
docker run -dit --name ata-app1 --network ata-app-net alpine ash
5. docker ps
を実行します 実行中のコンテナを一覧表示するコマンド。
docker ps
以下に示すように、両方のコンテナが実行されています。
6.以下のdockernetworkコマンドを再実行して、inspect
を実行します。 あなたのata-app-net
ブリッジネットワーク。
docker network inspect ata-app-net
以下に、2つのコンテナがIPアドレスと名前とともにata-app-netブリッジネットワークに接続されていることを確認できます。
7.次に、docker container attach
を実行します 以下でata-app1
に接続します 容器。
docker container attach ata-app1
8. ata-app2
にpingを実行します コンテナが相互に通信できることを確認します。
ping ata-app2
9.次に、google.com
にpingを実行します ata-app1 インターネットと通信できます。
ping google.com
10.最後に、手順7〜9を繰り返して、ata-app2
に接続します。 ata-app1
にpingを実行します 。
必ずCTRL+PQを押して、ata-app1コンテナーから切り離し、実行を続けてください。そうしないと、コンテナが停止し、ata-app2からata-app1にpingを実行すると、pingコマンドが失敗します。
docker container attach ata-app2
ping ata-app1
ping google.com
以下に、すべてのパケットが送受信されていることを確認します。これにより、両方のコンテナが相互に通信でき、インターネットと通信できることが確認されます。
結論
このチュートリアルでは、Dockerの実行例(docker run
)を数多く学びました。 )アプリケーションのデプロイと管理を容易にするために使用できます。 docker run
を理解することで、Dockerをより効果的に使用できるようになりました。 ■Dockerがコンテナのネットワークを設定する方法。
この時点で、Dockerの実行例(docker run
)を利用する方法をすでに知っています。 )DevOpsゲームを強化するためのコマンド。
この知識があれば、アプリケーションをより効率的かつスケーラブルな方法でデプロイしてみませんか?