2

爲了測試,我試圖從Docker內部運行我的python 3.4應用程序,並連接到DynamoDB Local實例。我可以從主機本地訪問DynamoDB,而不會出現任何問題。從Docker容器內部與boto3連接到DynamoDB Local

但是,從Docker容器中點擊時出現「連接拒絕錯誤」。我試過在容器中運行DynamoDB local,並將其鏈接到應用程序的docker容器,並在主機上運行它。一個猜測是有一些環境變量缺失,但我無法弄清楚。我無法將我的~/.aws目錄作爲卷鏈接。

下面是一些測試代碼重現錯誤:

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) [email protected]:~/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') 

從容器外殼內運行相同的代碼:

[email protected]:/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')) 

這裏是一個測試碼頭文件,將重現錯誤:

FROM python:3.4 

ADD . /src 

# python dependencies 
RUN python3 -m pip install -U pip && \ 
    python3 -m pip install boto3 

ENTRYPOINT ["/bin/bash"] 

而且我發動泊塢窗容器是這樣的:

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

IIRC,當你鏈接兩個容器時,他們不使用外部映射,所以你可能只需要使用端口8000。您應該可以使用docker在鏈接容器中創建的[環境變量](https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/#/environment-variables)進行檢查。 –

+0

這工作,謝謝!如果可以將此評論重新格式化爲答案,我很樂意爲您獎勵賞金。 –

+0

完成!請讓我知道是否還有什麼你認爲會有助於添加... –

回答

2

您正在使用泊塢窗link feature兩個容器連接在一起。這裏的基本原則是:

  1. 你給你的數據庫容器一個獨特的名稱,使用--name
  2. 將客戶機容器鏈接到數據庫,使用--link指定客戶機容器內的數據庫容器名稱和別名。
  3. 然後Docker使用其默認bridge網絡連接兩者。

這樣做,它不需要端口映射到主機網絡(由-p選項提供)。相反,docker將爲您完成工作,並使用您在創建鏈接時定義的別名,在您的客戶端容器中公開IP地址和端口。

然後,您可以使用此別名查找使用environment variables碼頭工具自動爲您創建的客戶端容器內的詳細信息。

除了這最後一步之外,你基本上已經完全掌握了。如果你檢查你的環境,我希望你會發現8000端口是你想要的。

相關問題