コマンドを指定せずに、DockerコンテナでフルOSを実行するにはどうすればよいですか?


25

私はCoreOS Dockerのドキュメントに従っていますが、次のようなコマンドでコンテナを起動することについて言及しています:

docker run someImageName /bin/somebinary

someImageName画像はどこですか。/ bin / somebinaryが終了すると、イメージは実行されなくなります。

実行するバイナリを指定せずに、単にイメージを実行したいだけです。代わりに、通常はイメージOS内で実行されるサービス(たとえば、systemd / sysvinit)を実行するだけです

これは誰もがDockerでやりたいと思う最も一般的なことのように思えますが、コマンドなしでイメージを実行しようとすると戻ります:

2014/02/05 14:49:19 Error: create: No command specified

コマンドを指定するのではなく、Dockerコンテナを起動して完全なOSを実行するにはどうすればよいですか?



@FredtheMagicWonderDogまったく同じですが、答えは同じです。
ミケマッカナ14

回答:


24

ここに記載されている/sbin/initように、シングルユーザーモードからマルチユーザーモードで起動する他のUNIXと同様に、コマンドとして実行するだけです。

/programming/19332662/start-full-container-in-docker

コンテナは本格的なOSである可能性がありますが、必ずしもそうである必要はありません(VMについても同様です。構成と管理がより複雑です)。

Dockerの重要なポイントは、アプリケーションコンテナーを簡単にすることです。したがって、OS全体ではなく、アプリのみを構成する必要があります。


ありがとう。/ sbin / initでイメージを開始した後、を実行docker ps -notruncしてコンテナーID sudo /usr/sbin/lxc-attach -n containerIDを取得し、実行中のイメージを取得しました。他のポスターが言及したよう私は、次のシングルのコマンドのコンテナをチェックアウトしますので、私は本当に...、第二のinitを必要としない
mikemaccana

VMで本格的なOSを実行する必要はないと言うことは、物理マシンで本格的なOSを実行する必要はないということのようなものです。プログラムが実行さSTDLIBなしとそうはinitはないが、それはだということ
リー・ライアンを

11

Dockerは、オペレーティングシステムコンテナではなく、アプリケーションコンテナの管理と展開のためのシステムです。Dockerコンテナの実行とオペレーティングシステムの起動を混同しているようです。

Dockerコンテナは、単一のコマンドで起動できる、単一目的の非常に狭いスコープのアプリケーションである必要があります。それよりも複雑なものを探しているなら、Dockerはあなたが探しているソリューションではありません。その場合は、KVM、ESXi、OpenVZ、LXDなどを確認してください。

デフォルトCMDENTRYPOINTコンテナを指定する方法を探している場合は、ビルド時に Dockerfileを使用してそれを行うことができます。


5
Dockerとは何かを知っています。アプリケーションコンテナは、FedoraやUbuntuなどのオペレーティングシステムに基づいていることを指摘します。Unix上の永続的なアプリケーション-Dockerコンテナのようなユーザー空間のみのUnixでさえ-initscriptsまたはsystemdユニットファイルから起動されます。たとえば、私のアプリがクラッシュした場合、systemdが提供するようなしきい値で自動的に再起動したいと思います。
ミケマッカナ

5
コンテナに詰め込みすぎています-それらはオペレーティングシステムではありません。プロセス監視は、各コンテナの外部で処理する必要があります。
EEAA 14

1
プロセスが停止した場合...コンテナ全体を再起動するだけですか?それはそれほど高価ではないので大丈夫かもしれません。それはちょっと奇妙に感じている-私のコンテナには、/ sbinに/ initを持って、それが使用されることは決してありません...
mikemaccana

1
はい、それがアイデアです。コンテナには/sbin/initがありますが、持っている必要はありません。デフォルトのubuntuコンテナなどを使用した可能性があります。あり、多くあなたが望むならば削除することができ、これらのコンテナのビットが。
EEAA 14

1
@ValkoSipuliあなたは確かにその意見を保持する自由です。コンテナ内で複数のプロセスを実行すると、そもそもコンテナを使用する理由の多くが無効になると、私は今でも主張しています。コンテナ内でOSを実行する場所はありますか?多分。ただし、これは例外であり、賛否両論を十分に検討せずに行うべきではありません。
EEAA

5

コンテナで完全なオペレーティングシステムを実行するには、次のDockerfileを作成します。

FROM fedora:25

CMD /sbin/init

次に、コンテナをビルドして起動し、その中にシェルを入力して、その中で実行されているサービスを調べます。

docker build -t os .
docker run -d --privileged --name os os
docker exec -it os bash

コンテナ内の完全なsystemdサービス。綺麗な。


0
docker pull ubuntu

必要な回数だけ同じイメージから実行します。新しいコンテナが作成された後、コンテナを起動および停止して、それぞれ独自の構成を保存できます。便宜上、各コンテナに「--name」という名前を付けた方が良いでしょう。

Fi:

docker run --name MyContainer1 <ubuntu image>
docker run --name MyContainer2 <ubuntu image>
docker run --name MyContainer3 <ubuntu image>

それでおしまい。

$ docker ps
CONTAINER ID        IMAGE            CREATED          STATUS               NAMES
a7e789711e62        67759a80360c   12 hours ago     Up 2 minutes         MyContainer1
87ae9c5c3f84        67759a80360c   12 hours ago     Up About a minute    MyContainer2
c1524520d864        67759a80360c   12 hours ago     Up About a minute    MyContainer3

その後、コンテナを永久に作成し、VMのようにコンテナを起動および停止できます。

docker start MyContainer1

コンテナに入って、やりたいことをするには:

docker exec -it MyContainer1 bash
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.