使用boto3从Docker容器内部连接到DynamoDB Local

为了testing,我试图从docker内部运行我的python 3.4应用程序,并连接到一个DynamoDB Local实例。 我可以从主机本地访问DynamoDB,而不会出现问题。

但是,从Docker容器中打开时出现“连接拒绝错误”。 我已经尝试在容器中运行DynamoDB本地,并将其链接到应用程序的泊坞窗容器,并在主机上运行它。 一个猜测是有一些环境variables缺失,但我无法弄清楚。 我不帮助链接我的~/.aws目录作为一个卷。

以下是一些重现错误的testing代码:

 import boto3 print('creating dynamodb resource') dynamodb = boto3.resource( 'dynamodb', endpoint_url='http://localhost:8001', region_name='dummy_region', aws_access_key_id='dummy_access_key', aws_secret_access_key='dummy_secret_key', verify=False) print ('got resource:', dynamodb) print('adding table') result = dynamodb.create_table( TableName='foo', KeySchema=[ { 'AttributeName': 'from_email', 'KeyType': 'HASH' # Partition key }, { 'AttributeName': 'raw_id', 'KeyType': 'RANGE' # Sort key }, ], AttributeDefinitions=[ { 'AttributeName': 'from_email', 'AttributeType': 'S' }, { 'AttributeName': 'raw_id', 'AttributeType': 'N' }, ], ProvisionedThroughput={ 'ReadCapacityUnits': 10, 'WriteCapacityUnits': 10 } ) print('created table:', result) print('getting table') table = dynamodb.Table('foo') print('got table:', table) 

从主机运行这个,这是我的输出:

 (workbench) ryan@ryan:~/dev/$ python dyn.py creating dynamodb resource got resource: dynamodb.ServiceResource() adding table created table: dynamodb.Table(name='foo') getting table got table: dynamodb.Table(name='foo') 

从容器shell运行相同的代码:

 root@e88da4d624e0:/src# python dyn.py creating dynamodb resource got resource: dynamodb.ServiceResource() adding table [... traceback clipped ...] File "/usr/local/lib/python3.4/site-packages/botocore/vendored/requests/packages/urllib3/connection.py", line 155, in connect conn = self._new_conn() File "/usr/local/lib/python3.4/site-packages/botocore/vendored/requests/packages/urllib3/connection.py", line 134, in _new_conn (self.host, self.port), self.timeout, **extra_kw) File "/usr/local/lib/python3.4/site-packages/botocore/vendored/requests/packages/urllib3/util/connection.py", line 88, in create_connection raise err File "/usr/local/lib/python3.4/site-packages/botocore/vendored/requests/packages/urllib3/util/connection.py", line 78, in create_connection sock.connect(sa) ConnectionRefusedError: [Errno 111] Connection refused [ ... ] botocore.vendored.requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionRefusedError(111, 'Connection refused')) 

这是一个testingdockerfile将重现错误:

 FROM python:3.4 ADD . /src # python dependencies RUN python3 -m pip install -U pip && \ python3 -m pip install boto3 ENTRYPOINT ["/bin/bash"] 

我正在启动这样的docker容器:

 docker run --name dynamodb -p "8001:8000" -d ryan/dynamodb docker run --link dynamodb:localhost -ti ryan/app 

您正在使用泊坞窗链接function将两个容器连接在一起。 这里的基本原则是:

  1. 你给你的DB容器一个唯一的名字,使用--name
  2. 将客户机容器链接到数据库,使用--link指定客户机容器内的数据库容器的名称和别名。
  3. 然后Docker使用它的默认bridge连接这两个networking。

这样做,不需要端口映射到主机networking(由-p选项提供)。 相反,docker将为您完成工作,并使用您在创build链接时定义的别名,在您的客户端容器中公开IP地址和端口。

然后,您可以使用此别名,使用环境variables docker自动为您创build的客户端容器中查找详细信息。

除了最后一步,你基本上已经完全掌握了。 如果你看看你的环境,我希望你会发现8000端口是你想要的。