使用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将两个容器连接在一起。 这里的基本原则是:
- 你给你的DB容器一个唯一的名字,使用
--name
。 - 将客户机容器链接到数据库,使用
--link
指定客户机容器内的数据库容器的名称和别名。 - 然后Docker使用它的默认
bridge
连接这两个networking。
这样做,不需要端口映射到主机networking(由-p
选项提供)。 相反,docker将为您完成工作,并使用您在创build链接时定义的别名,在您的客户端容器中公开IP地址和端口。
然后,您可以使用此别名,使用环境variables docker自动为您创build的客户端容器中查找详细信息。
除了最后一步,你基本上已经完全掌握了。 如果你看看你的环境,我希望你会发现8000端口是你想要的。
- 如何在Amazon EC2容器集群中使用t2.nano ec2实例?
- Elastic Beanstalk单容器泊坞窗 – 使用awslogslogging驱动程序
- 使用WordPress从Docker容器连接到RDS Mysql
- 如何在AWS Elastic Beanstalk Docker容器中loggingPHP错误
- ecs-cli撰写服务不会终止
- 在AWS上重新启动Docker群中的计算机
- “docker-machine rm”在不存在的EC2实例上失败
- 如何将docker-compose.yml转换为Dockerrun.aws.json?
- 更新elsatic beanstalk中的多容器docker中的一个模块的属性文件