基础阶段很简单,就是入门Dockerfile和基本使用,不过感觉给出的场景很不错。
(外加几句话,参加这种训练营更多是给自己一个训练的并且主动解决问题的机会,针对我这种有一些经验的人,单纯完成任务应该是不够的,可以通过经验,社区的比对和博客让我的技术更规范化)
Q1 Simple NG Service
基础知识点:
- docker 编译,打包,运行镜像
- 基础的FROM选择底包, RUN 执行命令,EXPOSE 暴露端口, CMD 作为入口执行程序。
实践知识点:
- 打包顺序和流程:
- 选择合适的FROM 作为基础镜像
- 精简,最小化提高安全性
- 直接使用已经有的官方镜像,比如python:3.11-slim
- 处理软件包环境和依赖
- 模板 (更新软件源,无推荐安装,删除apt缓存)
- apt-get update && \
- apt-get install -y –no-install-recommends \
- curl \
- && rm -rf /var/lib/apt/lists/*
- 模板 (更新软件源,无推荐安装,删除apt缓存)
- 处理端口
- 运行入口
- 选择合适的FROM 作为基础镜像
- 端口转发
- 虽然是云原生但是因为在线开发消耗算力时长而且不如原生vscode流畅丝滑,我还是把项目复制到本地,本地vscode远程ssh打开项目编译的dockerfile,然后才明白这个端口转发是什么东西有多好用
- 大多数运行网络服务的docker镜像会在docker本机(运行docker的物理机器)开端口,但是显然如果我们ssh到远程机器,很多测试程序大概率跑在客户机并且已经写死(尤其是开发和测试过程中)127.0.0.1本级测试,只在远程机器上开端口不方便
- 于是vscode就可以自动进行端口转发,这意味着你不需要端口映射,远程的端口就可以通过ssh协议被VScode Server转发到本地然后被直接访问
- 以上将远程服务器端口转发到本地是端口转发,同理还有反向端口转发,就是把本地的端口转发到远程服务器上
- 根据ChatGPT的提醒,端口转发作为强大的工具可以自己用,但是在生产环境要小心,主要原因是扩大了攻击面导致有潜在风险。
- 守护进程前台化
- Docker容器只给前台程序生存空间,所以像ng这样的守护进程+客户端的程序需要用纯客户端模式启动,防止docker容器找不到活动程序直接被杀掉,这也是为啥本次程序的入口为CMD [“nginx”, “-g”, “daemon off;”]
测试命令和技巧:
# 测试命令: # docker build -t exercise1 . # docker run -d -p 8080:80 exercise1 # curl http://127.0.0.1:8080 | grep -q "Hello Docker"
Q1 Simple Python Flask Service
基础知识点:
同上,但是添加了
- WORKDIR确定工作文件夹
- COPY来拷贝应用程序和程序的非系统包管理依赖目录
- 添加用户和USER 选择用户
- ENV 添加环境变量
从这里也可以看出来这是一个比较完整的需要处理多方依赖(pip)和安全层级(非root用户)的场景。
实践知识点:
- COPY 命令的技巧
- 单个文件直接copy文件到目录就行(别忘了下划线)
- 多个文件的shell模式
- 用空格隔开,比如COPY requirements.txt app.py /app/
- 多个文件的json格式(ChatGPT在我复盘时候提醒的,没有试过)
- COPY [“file1”, “file2”, “file3”, “/dest/”]
- Python项目的docker目录结构
- Dockerfile
- app.py作为入口
- requirements.txt作为依赖表
- 添加和使用用户
- 这是个很大的话题,见下文
先这样,不管了,实习再说吧
Views: 2
