実行中のdocker containerへのアクセス方法

3717 ワード

containerが起きると、ログを調べたり、操作を実行したりするなど、containerの内部に入ってみたい場合があります.現在、いくつかの方法で実現できます.

1. docker attach


これは公式に提供されている方法です.
テスト、まずcontainerを起動します.
$ docker run -i -t ubuntu bash
root@4556f5ad6067:/#

終了せずに別の端末を開きます.
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4556f5ad6067        ubuntu:14.04        "bash"              45 seconds ago      Up 43 seconds                           jolly_ardinghelli

$ docker attach 4556f5ad6067
root@4556f5ad6067:/#

これで繋がりました.このとき、いくつかのコマンドを入力すると、両方の端末に表示と出力が表示されます.この方式には大きな限界があり、entrypointまたはプログラムが実行されていることが分かれば、docker attachを介してアクセスした後は操作が実行できず、1つの端末が終了した後にcontainer全体が終了する.この方法はお勧めしません.

2. lxc-attach


この方法を使用する場合は、まずdockerがlxc方式で起動されることを保証します.具体的には、
  • 修正/etc/default/docker増加DOCKER_OPTS="-e lxc"
  • dockerサービスsudo service docker restart
  • を再起動
    containerを起動する方法は、以前と同じです.
    $ docker run -i -t ubuntu bash
    root@e7f01f0ff598:/#

    containerに入るには、次のようにします.
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    e7f01f0ff598        ubuntu:14.04        "bash"              17 seconds ago      Up 15 seconds                           grave_jones
    
    $ ps aux | grep e7f01f0ff598
    root     23691  0.0  0.0  43140  1876 pts/9    Ss   21:47   0:00 lxc-start -n e7f01f0ff598c80d70a996135c98fbaeddc6daa61436bbbfa735233e8b6f8ebe -f /var/lib/docker/containers/e7f01f0ff598c80d70a996135c98fbaeddc6daa61436bbbfa735233e8b6f8ebe/config.lxc -- /.dockerinit -g 172.17.42.1 -i 172.17.0.3/16 -mtu 1500 -- bash
    ma6174   23756  0.0  0.0  13428   928 pts/12   S+   21:47   0:00 grep --color=auto e7f01f0ff598
    
    $ sudo lxc-attach -n e7f01f0ff598c80d70a996135c98fbaeddc6daa61436bbbfa735233e8b6f8ebe
    root@e7f01f0ff598:/#

    この方式はやはり便利だ.dockerサービスを再起動してlxcで実行する必要があることを前提とし、containerに入ると実行中のプログラムに影響を及ぼさずにコマンドを実行できる端末があります.

    3. nsenter


    dockerがlxcで起動していない場合、実行中のcontainerに入りたい場合はnsenterを使用することも考えられます
    このプログラムのインストール方法は独特で、dockerを使用してインストールします.
    $ docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter

    使い方も簡単で、まずあなたが入るcontainerのPID:
    $ PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)

    このコマンドでcontainerにアクセスできます.
    $ nsenter --target $PID --mount --uts --ipc --net --pid

    使いやすいようにスクリプトを書くと自動的に完了します.
    $ cat /bin/docker_enter
    #!/bin/bash
    sudo nsenter --target `docker inspect --format {{.State.Pid}} $1` --mount --uts --ipc --net --pid bash

    これにより、containerに入るたびにdocker_enter <container_name_or_ID>を実行するだけでよい.

    4. ssh


    この原理も簡単で、containerの中でsshサービスを起動して、それからsshの方式を通じてcontainerの中に上陸して、このような方式を推薦しないで、主にsshの上陸を配置するのが面倒で、sshサービスを開くのも資源を消費して、まったく必要ありません.
    ~~~~~~~~~~~~~~~~華麗な分割線~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    docker 1.2.0リリースでは、restartパラメータをサポートし、docker runで指定できます.
      --restart=""               Restart policy to apply when a container exits (no, on-failure, always)

    このパラメータがあれば便利です.例えば、containerのサービスが何らかの理由で終了した場合、以前は外部プログラムでcontainerを再起動するしかありませんでした.このパラメータがあればcontainerを自動的に再起動することができます.もちろん、失敗した再試行回数を設定することもできます.on-failure:5で失敗した後、最大5回再起動することを指定します.
    公式の2つの例:
    docker run --restart=always redis
    
    docker run --restart=on-failure:5 redis