You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python Docker SDK连接AWS EC2实例并配置密钥

连接AWS EC2上的Docker并使用Python SDK管理

一、先配置EC2上的Docker Daemon允许远程访问

默认Docker Daemon仅监听本地Unix socket,要实现远程连接需修改配置:

  1. 编辑Docker配置文件/etc/docker/daemon.json(无则创建),添加如下内容:

    {
      "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
    }
    

    生产环境建议启用TLS加密,改用端口2376,后续会补充TLS配置方式。

  2. 重启Docker服务使配置生效:

    sudo systemctl restart docker
    
  3. 配置EC2安全组:

    • 添加一条入站规则,仅允许你的本地IP访问2375端口(无TLS)或2376端口(TLS),禁止开放给所有IP。

二、用Python Docker SDK连接EC2上的Docker

无需依赖docker.from_env()(默认读取本地环境),直接通过docker.DockerClient()指定远程连接参数:

情况1:无TLS测试环境

import docker

# 替换为你的EC2公网IP/弹性IP
client = docker.DockerClient(base_url='tcp://<EC2_PUBLIC_IP>:2375')

# 验证连接:列出活跃容器
print(client.containers.list())

情况2:TLS加密生产环境

先在EC2上生成TLS证书(或使用AWS提供的证书),再在代码中指定证书路径:

import docker

client = docker.DockerClient(
    base_url='tcp://<EC2_PUBLIC_IP>:2376',
    tls=True,
    # 替换为你的证书和密钥本地路径
    tls_client_cert=('/path/to/cert.pem', '/path/to/key.pem'),
    tls_ca_cert='/path/to/ca.pem'
)

# 测试操作:拉取镜像并启动容器
client.images.pull('nginx:alpine')
container = client.containers.run('nginx:alpine', detach=True, ports={'80/tcp': 8080})
print(f"已启动容器ID: {container.id}")

三、安全管理连接参数

绝对禁止硬编码IP、证书路径等敏感信息,推荐以下两种管理方式:

方式1:环境变量+dotenv包

  1. 安装依赖包:

    pip install python-dotenv
    
  2. 创建.env文件(添加到.gitignore避免提交到版本库):

    DOCKER_HOST=tcp://<EC2_PUBLIC_IP>:2376
    DOCKER_TLS_VERIFY=1
    DOCKER_CERT_PATH=/path/to/your/certs
    
  3. 代码中加载环境变量:

    from dotenv import load_dotenv
    import os
    import docker
    
    load_dotenv()
    
    client = docker.DockerClient(
        base_url=os.getenv('DOCKER_HOST'),
        tls=bool(int(os.getenv('DOCKER_TLS_VERIFY'))),
        tls_client_cert=(
            os.path.join(os.getenv('DOCKER_CERT_PATH'), 'cert.pem'),
            os.path.join(os.getenv('DOCKER_CERT_PATH'), 'key.pem')
        ),
        tls_ca_cert=os.path.join(os.getenv('DOCKER_CERT_PATH'), 'ca.pem')
    )
    

方式2:AWS Secrets Manager存储参数

适合AWS生产环境,将连接参数存入Secrets Manager,通过boto3读取:

  1. 安装依赖包:

    pip install boto3
    
  2. 代码中读取密钥并建立连接:

    import boto3
    import docker
    
    # 初始化Secrets Manager客户端,替换为你的EC2区域
    secrets_manager = boto3.client('secretsmanager', region_name='us-east-1')
    
    # 获取存储的密钥,替换为你的密钥名称
    secret_response = secrets_manager.get_secret_value(SecretId='docker-ec2-connection')
    secret_dict = eval(secret_response['SecretString'])
    
    client = docker.DockerClient(
        base_url=secret_dict['DOCKER_HOST'],
        tls=secret_dict['DOCKER_TLS_VERIFY'],
        tls_client_cert=(secret_dict['CERT_PATH'], secret_dict['KEY_PATH']),
        tls_ca_cert=secret_dict['CA_PATH']
    )
    

注意事项

  • 无TLS连接仅适合测试场景,生产环境必须启用TLS加密,防止Docker Daemon被未授权访问。
  • 严格控制EC2安全组的访问范围,仅允许可信IP访问Docker端口。
  • 若使用IAM角色,为EC2实例或本地机器配置必要权限(如Secrets Manager读取权限),避免硬编码AWS密钥。

内容的提问来源于stack exchange,提问作者Indrajith Vinod Nair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:25:17