基础阶段很简单,就是入门Dockerfile和基本使用,不过感觉给出的场景很不错。

(外加几句话,参加这种训练营更多是给自己一个训练的并且主动解决问题的机会,针对我这种有一些经验的人,单纯完成任务应该是不够的,可以通过经验,社区的比对和博客让我的技术更规范化)

Q1 Simple NG Service

基础知识点:

  1. docker 编译,打包,运行镜像
  2. 基础的FROM选择底包, RUN 执行命令,EXPOSE 暴露端口, CMD 作为入口执行程序。

实践知识点:

  1. 打包顺序和流程:
    • 选择合适的FROM 作为基础镜像
      • 精简,最小化提高安全性
      • 直接使用已经有的官方镜像,比如python:3.11-slim
    • 处理软件包环境和依赖
      • 模板 (更新软件源,无推荐安装,删除apt缓存)
        • apt-get update && \
        • apt-get install -y –no-install-recommends \
        • curl \
        • && rm -rf /var/lib/apt/lists/*
    • 处理端口
    • 运行入口
  2. 端口转发
    • 虽然是云原生但是因为在线开发消耗算力时长而且不如原生vscode流畅丝滑,我还是把项目复制到本地,本地vscode远程ssh打开项目编译的dockerfile,然后才明白这个端口转发是什么东西有多好用
    • 大多数运行网络服务的docker镜像会在docker本机(运行docker的物理机器)开端口,但是显然如果我们ssh到远程机器,很多测试程序大概率跑在客户机并且已经写死(尤其是开发和测试过程中)127.0.0.1本级测试,只在远程机器上开端口不方便
      • 于是vscode就可以自动进行端口转发,这意味着你不需要端口映射,远程的端口就可以通过ssh协议被VScode Server转发到本地然后被直接访问
      • 以上将远程服务器端口转发到本地是端口转发,同理还有反向端口转发,就是把本地的端口转发到远程服务器上
    • 根据ChatGPT的提醒,端口转发作为强大的工具可以自己用,但是在生产环境要小心,主要原因是扩大了攻击面导致有潜在风险。
  3. 守护进程前台化
    • 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

基础知识点:

同上,但是添加了

  1. WORKDIR确定工作文件夹
  2. COPY来拷贝应用程序和程序的非系统包管理依赖目录
  3. 添加用户和USER 选择用户
  4. ENV 添加环境变量

从这里也可以看出来这是一个比较完整的需要处理多方依赖(pip)和安全层级(非root用户)的场景。

实践知识点:

  1. COPY 命令的技巧
    • 单个文件直接copy文件到目录就行(别忘了下划线)
    • 多个文件的shell模式
      • 用空格隔开,比如COPY requirements.txt app.py /app/
    • 多个文件的json格式(ChatGPT在我复盘时候提醒的,没有试过)
      • COPY [“file1”, “file2”, “file3”, “/dest/”]
  2. Python项目的docker目录结构
    • Dockerfile
    • app.py作为入口
    • requirements.txt作为依赖表
  3. 添加和使用用户
    • 这是个很大的话题,见下文

先这样,不管了,实习再说吧

Views: 2

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.