link 个容器 docker python API
link containers with the docker python API
我想使用 docker python API (pip install docker-py
) 创建一个容器并 link 它到我创建的现有容器用 docker-compose.
使用命令行很简单:
docker run --link EXISTING_CONTAINER:LINK_NAME mycontainer:mytag
但是使用 docker API 我卡住了。我认为我必须使用 docker.Client().create_container()
方法,该方法采用 - 未记录的 - 参数 links=
。 (我强烈认为文档非常不完整......)。
我尝试阅读 docker-compose 代码,这似乎使用了 links=
参数,但我不知道如何使用。
我最初的尝试没有成功:
client_obj.create_container(..., links=(('EXISTING_CONTAINER', 'LINK_NAME'),))
...我认为 docker-compose 代码正在做的事情。
有人可以帮我吗?
https://github.com/docker/docker-py
A Python library for the Docker Remote API. It does everything the
docker command does, but from within Python – run containers, manage
them, pull/push images, etc.
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).
source code of 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):
但我在 start function:
找到了 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:
- 运行 docker 容器并挂载在
/var/run/docker.sock
来自主机
- 安装工具
- 运行 测试容器
EXISTING_CONTAINER
- 运行 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
是的,docker-py 的网络文档严重缺乏 - 维护者同意(https://github.com/docker/docker-py/issues/982 全局别名示例)。
请注意,上面 Valeriy 的回答将创建遗留问题 link,如果您使用非默认网络(例如由 docker 创建的网络),这可能(在我的情况下)会导致问题-撰写。
无论如何,给Client.start
加上参数就是depreciated.
可以在 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"
您可能还想查看 this link 了解更多信息和背景。
以下是目前的工作方式。
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'))
我想使用 docker python API (pip install docker-py
) 创建一个容器并 link 它到我创建的现有容器用 docker-compose.
使用命令行很简单:
docker run --link EXISTING_CONTAINER:LINK_NAME mycontainer:mytag
但是使用 docker API 我卡住了。我认为我必须使用 docker.Client().create_container()
方法,该方法采用 - 未记录的 - 参数 links=
。 (我强烈认为文档非常不完整......)。
我尝试阅读 docker-compose 代码,这似乎使用了 links=
参数,但我不知道如何使用。
我最初的尝试没有成功:
client_obj.create_container(..., links=(('EXISTING_CONTAINER', 'LINK_NAME'),))
...我认为 docker-compose 代码正在做的事情。
有人可以帮我吗?
https://github.com/docker/docker-py
A Python library for the Docker Remote API. It does everything the docker command does, but from within Python – run containers, manage them, pull/push images, etc.
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).
source code of 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):
但我在 start function:
找到了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:
- 运行 docker 容器并挂载在
/var/run/docker.sock
来自主机 - 安装工具
- 运行 测试容器
EXISTING_CONTAINER
- 运行 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
是的,docker-py 的网络文档严重缺乏 - 维护者同意(https://github.com/docker/docker-py/issues/982 全局别名示例)。
请注意,上面 Valeriy 的回答将创建遗留问题 link,如果您使用非默认网络(例如由 docker 创建的网络),这可能(在我的情况下)会导致问题-撰写。
无论如何,给Client.start
加上参数就是depreciated.
可以在 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"
您可能还想查看 this link 了解更多信息和背景。
以下是目前的工作方式。
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'))