4

docker python API ( pip install docker-py) を使用してコンテナーを作成し、それを docker-compose で作成した既存のコンテナーにリンクしたいと考えています。

コマンド ラインを使用すると、これは簡単です。

docker run --link EXISTING_CONTAINER:LINK_NAME mycontainer:mytag

しかし、docker API を使用すると行き詰まります。docker.Client().create_container()-undocumented-parameter を取るメソッドを使用する必要があると思いますlinks=。(ドキュメントはかなり不完全だと強く思います...)。

docker-compose コードを読んでみましたが、これはlinks=パラメーターを使用しているようですが、方法がわかりませんでした。

私の最初の試みはうまくいきませんでした:

client_obj.create_container(..., links=(('EXISTING_CONTAINER', 'LINK_NAME'),))

...これは、docker-compose コードが行っていることだと思います。

誰かがここで私を助けてくれますか?

4

3 に答える 3

4

https://github.com/docker/docker-py

Docker Remote API 用の Python ライブラリ。docker コマンドが行うすべてのことを行いますが、Python 内から – コンテナーの実行、コンテナーの管理、イメージのプル/プッシュなどを行います。

create_container :

Creates a container that can then be .start() ed. 
Parameters are similar to those for the docker run 
command except it doesn't support the attach options (-a).

create_containerのソースコード

def create_container(self, image, command=None, hostname=None, user=None,
                     detach=False, stdin_open=False, tty=False,
                     mem_limit=None, ports=None, environment=None,
                     dns=None, volumes=None, volumes_from=None,
                     network_disabled=False, name=None, entrypoint=None,
                     cpu_shares=None, working_dir=None, domainname=None,
                     memswap_limit=None, cpuset=None, host_config=None,
                     mac_address=None, labels=None, volume_driver=None,
                     stop_signal=None, networking_config=None):

しかし、私は開始機能で見つけlinksまし:

def start(self, container, binds=None, port_bindings=None, lxc_conf=None,
          publish_all_ports=None, links=None, privileged=None,
          dns=None, dns_search=None, volumes_from=None, network_mode=None,
          restart_policy=None, cap_add=None, cap_drop=None, devices=None,
          extra_hosts=None, read_only=None, pid_mode=None, ipc_mode=None,
          security_opt=None, ulimits=None):

だから私はあなたがすべきだと思います:

from docker import Client
>>> cli = Client(base_url='tcp://127.0.0.1:2375')
>>> container = cli.create_container(
...     image='busybox:latest',
...     command='/bin/sleep 30')
>>> response = cli.start(container=container.get('Id'),links=[('EXISTING_CONTAINER', 'LINK_NAME')])

作業例 (DO)

DOでCoreOSを使用しています:

  1. /var/run/docker.sock Dockerコンテナを実行し、 fromホスト内にマウントします
  2. インストールツール
  3. テスト コンテナーを実行するEXISTING_CONTAINER
  4. Python の例を実行する

コマンドのセット:

docker run -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu:12.04 bash
apt-get update;apt-get install python-pip -y;pip install docker-py
docker run -d --name EXISTING_CONTAINER busybox   sh -c "while true; do sleep 1;done"

Python の例

from docker import Client
cli = Client(base_url='unix://var/run/docker.sock', version='auto')
container = cli.create_container(
image='busybox:latest',
command='/bin/sleep 30')
response = cli.start(container=container.get('Id'),links=(('EXISTING_CONTAINER', 'LINK_NAME'))

ホストでの結果:

wp-coreos-512mb-ams2-01 ~ # docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2f58e661579d        busybox             "sh -c 'while true; d"   23 seconds ago      Up 22 seconds                           EXISTING_CONTAINER
6f08dd3f5017        busybox:latest      "/bin/sleep 30"          9 minutes ago       Up 5 seconds                            condescending_brown
于 2016-05-13T10:50:47.917 に答える
2

はい、docker-py のネットワークに関するドキュメントが大幅に不足しています。メンテナーも同意しています (グローバル エイリアスの例についてはhttps://github.com/docker/docker-py/issues/982 )。

上記の Valeriy の回答はレガシー リンクを作成することに注意してください。これは、docker-compose によって作成されたネットワークなど、デフォルト以外のネットワークを使用すると (私の場合は) 問題につながる可能性があります。

いずれにせよ、パラメータを追加することClient.start減価償却されます。

これを行う新しい方法は unitttest にあります: https://github.com/docker/docker-py/blob/master/tests/integration/network_test.py#L190-213

@requires_api_version('1.22')
def test_create_with_links(self):
    net_name, net_id = self.create_network()

    container = self.create_and_start(
        host_config=self.client.create_host_config(network_mode=net_name),
        networking_config=self.client.create_networking_config({
            net_name: self.client.create_endpoint_config(
                links=[('docker-py-test-upstream', 'bar')],
            ),
        }),
    )

    container_data = self.client.inspect_container(container)
    self.assertEqual(
        container_data['NetworkSettings']['Networks'][net_name]['Links'],
        ['docker-py-test-upstream:bar'])

    self.create_and_start(
        name='docker-py-test-upstream',
        host_config=self.client.create_host_config(network_mode=net_name),
    )

    self.execute(container, ['nslookup', 'bar'])

Valeriy の例は次のようになります。

Python の例

from docker import Client
cli = Client(base_url='unix://var/run/docker.sock', version='auto')

# Note: 'bridge' is the default network
net_config = cli.create_networking_config(
        {'bridge': self.docker_client.create_endpoint_config(
            links=[('EXISTING_CONTAINER', 'LINK_NAME')]
        )}
    )

container = cli.create_container(
  image='busybox:latest',
  command='/bin/sleep 30',
  network_configuration=net_config 
)
response = cli.start(container=container.get('Id'))

私はこの特定のコードをテストしていませんが、これは私が新しいコンテナを既存のコンテナに接続することができた方法ですが、既存のコンテナはネットワーク「project_default」に構成することによって作成されました

詳細と背景については、このリンクを確認することもできます。

于 2016-05-30T15:33:47.617 に答える
0

以下は、それを行うための現在の作業方法です。

links=[('postgres-modeldb', 'modeldb'),('postgres-userdb', 'userdb'),('redis-workerdb', 'workerdb')]

host_config = client.create_host_config(
    links=links
)

networking_config = client.create_networking_config({
    'my-net': client.create_endpoint_config(
        links=links
    )
})

container = client.create_container(
    image='josepainumkal/vwadaptor:jose_toolUI',
    name=container_name,
    host_config=host_config,
    networking_config = networking_config
) 

response = client.start(container=container.get('Id'))
于 2017-05-11T21:29:07.813 に答える