質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

23669閲覧

docker runのオプションについて

mint.cherry

総合スコア284

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

7クリップ

投稿2015/11/06 03:24

docker のバージョンは1.8です。

いくつか質問します。
常識的なことかもしれませんがおねがいしますm(__)m(汗)

docker runのオプション


1.-t は何をするのでしょうか
ttyの確保と書いてありましたが、いまいちわかりません。
何の略ですか?また何をしてくれるのでしょうか?

2.-i について調べました、「stdoutを開きっぱなし」「コンテナの標準入力を開く」とかいてありましたが、いまいちわかりません。

3.-p 1234:80 が私の解釈があっているのでしょうか?
外部から80番宛のパッケが来た場合、ローカル内では1234番に送るということですか?

以上おねがいしますm(__)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  1. -t について

簡単に説明するならDockerコンテナ内の標準出力とホスト側の出力をつなげるものです。
文字出力だけなら-tを指定しなくても変わらないのですが、色を出力したりC-Hでバックスペースのようなターミナル制御ができなくなります。

参考: ttyについて ttyやptsってなんぞ?

  1. -i について

-tとは逆にホスト側の入力をコンテナの標準出力をつなげるものです。
-iを指定するとキーボードから入力した文字はコンテナ内のプロセスに送られbashなどでコマンドを実行できるのですが、-iがない場合は文字が送られないので何も入力できなくなります。

シェルのようにコマンド入力と出力が必要なプロセスを実行するときは1と2の両方を指定します。

  1. -pについて

イメージ図を作ってみました。
-p 1234:80と指定するとホスト側のポート1234をコンテナのポート80に転送します。
docker run -pオプション


ホストとコンテナのtty
tty

投稿2015/11/06 13:46

編集2015/11/10 13:46
shiena

総合スコア1827

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mint.cherry

2015/11/09 03:07

回答ありがとう御座いますm(__)mいつもありがとう御座います。 -itは両方共ttyに関連していたんですね。 telnetまたはsshで接続された順に/dev/pts/1から割り当てられ、互いにメッセージなどのやりとりができるというもので、いいでしょうか? 例えば、リモートPCでubuntuにssh接続したとします、リモート側は/dev/pts/1が割り当てられ、ubuntuにメッセージを送りたい場合に「echo "hello" > /dev/pts0」とやれば、ubuntuにhelloメッセージが行くということですか? 実際に試してみましたがうまくいけませんでした。 host# docker start -a -i test(-tオプションがなかったです。多分startコマンドでは、host側からの一方通行なのかな...) コンテナ#tty /dev/console デタッチでホスト側へ host# echo "hello" > /dev/console host#docker attach test コンテナ#cat /dev/console ”hello”メッセージが表示されませんでした...そもそもメッセージの格納先が/dev/consoleであっているのかとおもいましたけど -pに関しての図ありがとう御座います。 1234番宛はdockerの80に転送されるっていうことなんですね。dockerの80番ポートに送りたい場合は、1234番を指定しないといけないって感じですか。
shiena

2015/11/09 12:50

ttyについて以下のようにすればメッセージが行く事を確認できます。 dockerホスト側でターミナルを開く。ttyの結果を/dev/pts/0とします。 ここからdocker runでbashを実行すると、ホストの/dev/pts/0がコンテナの/dev/consoleとつながります。 dockerホスト側でもう1つターミナルを開き、echo "hello" > /dev/pts/0を実行します。 すると最初に開いたターミナルのコンテナにhelloが表示されます。 参考リンクと同じような図を書くと以下のようになるはずです。 dockerホストの/dev/pts/0---docker---dockerコンテナの/dev/console---bash -pは質問が1234だったのでそのまま書きましたが、他のポートも指定できます。 :の左がホストに割り当てたい任意のポート、:の右がコンテナに転送したい任意のポートを指定できます。
mint.cherry

2015/11/10 04:45

返事ありがとうございます。 ターミナルを増やして試す方法があるんですね。てっきり、リモートでログインしてやるものかと。。。 コンテナとホスト間がメッセージのやり取りができませんでした。ホストからconsoleへ送れるのですが、コンテナ側からだと「bash: /dev/pts/3: Permission denied」とエラーが ホスト側はpts3です。 dockerとは関係ないのですが、ただターミナルを増やして、ptsの番号も違うしメッセージのやり取りも出来ました。ptsについて、少し理解で来ましたm(__)m
shiena

2015/11/10 13:54

ホストとコンテナのttyを図におこしてみました。 1つ目のターミナル(/dev/pts/0)はdockerを通じてコンテナ内の/dev/consoleとつながっています。 2つ目のターミナル(/dev/pts/1)は1つ目のターミナルと同じホストなので/dev/pts/0を通じてコンテナ内に届きます。 そしてコンテナの内側は/dev/consoleにつながっているのですが直接ホスト側の/dev/pts/0が見えているわけではありません。 ubuntu:latestで「ls /dev/pts/」を実行するとptmxしかないので/dev/pts/3はファイル書き込みできずにPermission deniedになったと思われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問