如何在AWS中通过终端Python会话或Jupyter使用自定义Docker镜像开发?
自定义Jupyter Docker镜像在AWS多服务中复用的实践建议
一、Docker镜像构建核心步骤
1. 选择合适的基础镜像
优先选适配目标AWS服务的官方镜像,减少重复配置:
- 通用数据科学场景:用
jupyter/scipy-notebook(内置常用数据分析包) - SageMaker适配:用AWS官方SageMaker Notebook基础镜像,比如
763104351884.dkr.ecr.us-east-1.amazonaws.com/sagemaker-notebook-instance:tensorflow-2.13-cpu-py310(需替换对应区域和框架版本)
2. 编写Dockerfile示例
# 基于SageMaker兼容的基础镜像 FROM 763104351884.dkr.ecr.us-east-1.amazonaws.com/sagemaker-notebook-instance:tensorflow-2.13-cpu-py310 # 切换root安装系统依赖(按需添加) USER root RUN apt-get update && apt-get install -y --no-install-recommends \ git \ curl \ && rm -rf /var/lib/apt/lists/* # 清理缓存减小镜像体积 # 切回Jupyter默认用户jovyan,安装Python包 USER jovyan WORKDIR /home/jovyan # 从本地requirements.txt安装依赖(推荐方式,便于版本管理) COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 或者直接指定包版本(适合少量包的场景) # RUN pip install --no-cache-dir pandas==2.1.0 scikit-learn==1.3.0 # 保留Jupyter默认启动命令,确保服务正常启动 CMD ["start-notebook.sh"]
3. 本地构建与验证
- 构建镜像:
docker build -t my-custom-jupyter:v1 . - 本地运行测试:
docker run -p 8888:8888 my-custom-jupyter:v1,打开浏览器访问Jupyter,验证目标包是否安装成功。
二、适配不同AWS服务的配置
1. SageMaker Notebook Instance
- 推送镜像到ECR:
- 在AWS控制台创建ECR私有仓库
- 本地登录ECR:
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <你的AWS账号ID>.dkr.ecr.us-east-1.amazonaws.com - 打标签:
docker tag my-custom-jupyter:v1 <账号ID>.dkr.ecr.us-east-1.amazonaws.com/my-custom-jupyter:v1 - 推送:
docker push <账号ID>.dkr.ecr.us-east-1.amazonaws.com/my-custom-jupyter:v1
- 创建SageMaker Notebook:
在创建实例时,选择“自定义镜像”,从ECR中选择刚才推送的镜像即可。如果要用于训练任务,需额外在Dockerfile中添加训练入口配置(比如指定ENTRYPOINT ["python", "/opt/ml/code/train.py"],并将训练代码复制到/opt/ml/code目录)。
2. EC2实例
- 前提:EC2实例已安装Docker和AWS CLI
- 登录ECR后拉取镜像运行:
docker run -d -p 8888:8888 \ -v /ec2-local-data:/home/jovyan/data \ # 挂载EC2本地目录,持久化数据 <账号ID>.dkr.ecr.us-east-1.amazonaws.com/my-custom-jupyter:v1 - 开机自启:编写systemd服务文件(
/etc/systemd/system/jupyter-container.service),内容如下:
然后执行[Unit] Description=Custom Jupyter Notebook Container After=docker.service Requires=docker.service [Service] Restart=always ExecStart=/usr/bin/docker run --rm -p 8888:8888 -v /ec2-local-data:/home/jovyan/data <账号ID>.dkr.ecr.us-east-1.amazonaws.com/my-custom-jupyter:v1 ExecStop=/usr/bin/docker stop -t 2 %n [Install] WantedBy=multi-user.targetsystemctl daemon-reload && systemctl enable --now jupyter-container。
3. ECS/EKS(容器集群场景)
- ECS:创建Fargate或EC2类型的任务定义,指定镜像、端口映射(8888)、资源限制,然后启动服务,通过Application Load Balancer暴露Jupyter访问地址。
- EKS:部署Deployment管理Pod副本,创建Service暴露端口,用Ingress配置域名访问,适合多用户协作或高可用需求。
三、镜像维护与优化技巧
- 版本化管理:给镜像打语义化标签(如
v1.0.0、v1.1.0),记录每个版本的依赖变更,方便回滚和追踪。 - 减小镜像体积:
- 用
--no-cache-dir安装pip包,避免缓存文件残留 - 清理系统包管理缓存(如
rm -rf /var/lib/apt/lists/*) - 多阶段构建:将依赖编译和运行环境分离,仅复制必要的文件到最终镜像
- 用
- 自动化构建:用AWS CodePipeline或GitHub Actions,当
requirements.txt更新时自动触发镜像构建、测试并推送到ECR,减少手动操作。 - 定期更新基础镜像:每月基于最新的官方基础镜像重新构建,修复依赖漏洞,保持环境安全性。
内容的提问来源于stack exchange,提问作者Vidya S
相关产品推荐
相关产品推荐

