DUICUO

[共有] Docker 活用のヒント 24 選

[[143422]]

TES GLOBALでは、Dockerにすっかり魅了され、バージョン0.8から本番環境で使用しています。多くの開発者がDockerCon Europeのトレーニングに参加しています。以下に、Dockerの基礎知識をお持ちの方に役立つヒントをいくつかまとめました。

1. CLI

1.1 docker psの出力を美しくする

表の行が折りたたまれないように、Docker ps の出力を less -S にパイプします。

  1. docker ps -a | less -S

1.2 ログの更新

-F オプションを使用しない限り、Docker ログはすぐに更新されません。

  1. docker は <コンテナID> -F をログに記録します

1.3 docker inspectから単一の値を取得する

docker inspectデフォルトで大量のJSONデータを出力します。特定のキーの値を取得するには jq を使用できます。または、組み込みのGoテンプレート機能を使用することもできます。

  1. 最後の Docker コンテナは現在正常に動作していますか?
  2. docker inspect --format '{{.State.Running}}' $(docker ps -lq)  

1.4 sshdやnsenterの代わりにdocker execを使う

Dockerディストリビューションをご覧になったことがある方なら、このトリックはお馴染みでしょう。バージョン1.3で追加された新機能「exec」を使うと、コンテナ内で新しいプロセスを実行できます。これにより、ホストマシンで「sshd」を実行したり「nscenter」をインストールしたりする必要がなくなります。

2. Dockerファイル

2.1 DockerビルドはGitリポジトリをサポートします

ローカルの Dockerfile から Docker イメージを作成できるだけでなく、 docker buildのリポジトリ URL を指定するだけで、残りの作業はdocker build実行してくれます。

2.2 パッケージリストがない

デフォルトのイメージ(Ubuntuなど)には、イメージサイズを小さく抑えるためにパッケージリストが含まれていません。そのため、ベースDockerfileでapt-get updateを使用する必要があります。

2.3 パッケージのバージョンに注意してください。

パッケージのインストールには注意してください。これらのコマンドもキャッシュされます。つまり、キャッシュをクリアすると異なるバージョンが取得される可能性があります。また、キャッシュが長期間更新されていない場合は、最新のセキュリティアップデートが適用されない可能性があります。

2.4 小容量ベースイメージ

Docker Hubには、Scratchと呼ばれる公式の、完全にゼロサイズのDockerイメージがあります。そのため、ゼロサイズが必要な場合は、イメージをゼロから作成できます。ただし、ほとんどの場合、サイズがわずか2.5MBのBusyboxから始める方がよいでしょう。

2.5 FROM はデフォルトで最新バージョンを取得します。

FROMキーワードの後に​​バージョンタグを指定しない場合、デフォルトで最新バージョンが取得されます。この点に留意し、可能な限り特定のバージョンを指定するようにしてください。

2.6 シェルまたはexecモード

Dockerfileでは、コマンド(CMD RUNなど)を2つの方法で指定できます。コマンドをそのまま記述すると、Dockerはそれをsh -cコマンドでラップして実行します。文字列配列として記述することもできます。配列形式で記述する場合は「go exec」を使用するため、コンテナのシェルに依存しません。Docker開発者は後者の方法を推奨しています。

2.7 追加とコピー

ADDとCOPYはどちらもコンテナ作成時にローカルファイルを追加できます。ただし、ADDにはリモートファイルの追加、ファイルパッケージの解凍や展開など、いくつかの追加機能があります。ADDを使用する前に、この違いを理解しておいてください。

2.8 WORKDIRとENV

各コマンドは新しい一時イメージを作成し、新しいシェルで実行されるため、Dockerfile 内で `cd <directory>` や `export <var>=<value>` を実行することはできません。複数のコマンドで作業ディレクトリを設定するには `WORKDIR` を使用し、環境変数を設定するには `ENV` を使用してください。

2.9 CMDとENTRYPOINT

CMDは、イメージ実行時にデフォルトで実行されるコマンドです。デフォルトのENTRYPOINTは`/bin/sh -c`で、CMDは引数として渡されます。Dockerfile内でENTRYPOINTをオーバーライドすることで、コンテナがコマンドライン引数を受け入れるようにすることができます(デフォルトの引数はDockerfile内のCMDで指定されます)。

  1. Dockerfile内
  2. エントリポイント /bin/ls
  3. コマンド [ "-a" ]
  4. コマンドラインについては説明しましたが、Netrypoint はまだ ls を表示しています。
  5. docker run training/ls -l

2.10 末尾にADDを配置する

Dockerfileに追加すると、ファイルが変更された場合にキャッシュが無効化されます。キャッシュの無効化を防ぐため、頻繁に変更される項目をDockerfileに追加するのは避けてください。コードは最後に、ライブラリと依存関係は先頭に配置してください。Node.jsアプリケーションの場合、package.jsonを先頭に配置し、`nmp install`を実行してからコードを追加してください。

#p#

3. Dockerネットワーク

Dockerには、コンテナのIPアドレスを指定するためのIPプールが組み込まれています。これは外部からは見えませんが、ブリッジされたネットワークインターフェースを介してアクセスできます。

3.1 ポートマッピングを見つける

docker run 、引数として明示的なポートマッピングを受け入れるか、`-P` オプションを使用してすべてのポートをマッピングできます。後者の方法の利点は、競合を回避できることです。特定のポートを見つけるには、次のコマンドを使用します。

  1. docker ポート コンテナID ポート番号
  2. または
  3. docker inspect --format '{{.NetworkSettings.Ports}}'  
  4. コンテナID

3.2 コンテナのIPアドレス

各コンテナは、プライベートネットワークセグメントに属する独自のIPアドレスを持ちます(デフォルトは172.17.0.0/16)。IPアドレスは再起動時に変更される場合があります。IPアドレスを確認するには、次のコマンドを使用します。

  1. docker inspect --format '{{.NetworkSettings.IPAddress}}' コンテナID  

Docker は競合をチェックし、必要に応じて異なるネットワーク セグメントのアドレスを使用します。

3.3 ホストのネットワークを乗っ取る

docker run --net=hostネットワークを再利用できます。ただし、これは行わないでください。

4. ボリューム

ディレクトリまたは単一ファイルのコピーオンライトをバイパスし、負荷をほぼゼロにするファイル システム (バインド マウント)。

4.1 docker commit時にボリュームの内容は保存されません。

イメージが作成された後にボリュームに書き込むことはあまり意味がありません。

4.2 ボリュームはデフォルトで読み取りおよび書き込み可能です。

ただし、:ro 記号があります。

4.3 ボリュームとコンテナは別々に存在します。

ボリュームは、1つのコンテナが使用している限り存在します。`--volumes-from` オプションを使用することで、コンテナ間でボリュームを共有できます。

4.4 docker.sockをマウントする

docker.sock をマウントするだけで、コンテナからDocker APIへのアクセスが可能になります。その後、コンテナ内でDockerコマンドを実行できます。これにより、コンテナは自身を強制終了することも可能になり、コンテナ内でDockerデーモンプロセスを実行する必要はありません。

5. 安全性

5.1 Dockerをルートとして実行する

Docker APIはルートアクセスを許可できるため、`/`をボリュームにマッピングして読み書きを行うことができます。また、 --net hostを使用してホストマシンのネットワークを乗っ取ることもできます。Docker APIを公開しないでください。どうしても公開する必要がある場合は、TLSを使用してください。

5.2 DockerfileのUSER

デフォルトでは、Dockerは任意のコマンドをrootとして実行できますが、USERを使用することもできます。Dockerにはユーザー名前空間がないため、コンテナはユーザーをホストマシン上のユーザーとして扱います。ただし、これは単なるUIDなので、コンテナ内にユーザーを追加する必要があります。

5.3 TLSを使用してDocker APIを操作する

Dockerバージョン1.3ではTLSのサポートが追加されました。それまでは手動認証メカニズムが使用されていました。クライアントとサーバーの両方に鍵がありました。この鍵はルートユーザーのパスワードのようなものと考えてください。バージョン1.3以降、Boot2dockerはデフォルトでTLSを使用し、鍵を自動的に生成します。

さらに、キーの生成にはOpenSSLバージョン1.0.1以降が必要であり、Dockerデーモンプロセスは--tls-verifyオプション付きで実行する必要があります。Dockerはセキュアポート(2376)を使用します。