J'ai procastiné Docker pendant un mois... Voici ce qui m'a débloquée

J’ai procrastiné Docker pendant un mois… Voici ce qui m’a débloquée

我拖延了 Docker 一个月……这是让我走出困境的方法

Le 8 juillet, j’ai commencé un mentorat DevOps avec Endah. J’étais motivée, pleine de bonnes résolutions, prête à attaquer le Docker comme une pro. Sauf qu’entre le 21 juillet et le 22 août, je n’ai rien publié. Mon dernier article ici datait du 29 juillet. Ce silence n’était pas de l’inaction : c’était la phase la moins visible de l’apprentissage, celle où on lit la documentation officielle, où on regarde des schémas d’architecture, où on essaie de comprendre pourquoi Docker existe avant de taper la première commande.

7 月 8 日,我开始了与 Endah 的 DevOps 指导课程。我当时动力十足,满怀决心,准备像专业人士一样攻克 Docker。然而,在 7 月 21 日到 8 月 22 日之间,我没有任何产出。我在这里的上一篇文章还是 7 月 29 日发布的。这种沉默并非无所事事:这是学习过程中最不显眼的一个阶段,即阅读官方文档、研究架构图,并在输入第一条命令之前试图理解 Docker 存在的意义。

Le déclic est venu quand j’ai arrêté de vouloir tout comprendre en théorie avant de commencer, et que j’ai accepté d’apprendre en construisant. Si tu es en train de lire cet article en te reconnaissant un peu trop, reste. Ce texte est pour toi.

当我不再执着于在开始前从理论上理解一切,并接受“在构建中学习”这一理念时,转机出现了。如果你在阅读这篇文章时感到感同身受,请留下来。这篇文章就是为你写的。

Le déclic : comprendre en construisant

转机:在构建中理解

Ce qui m’a débloquée, ce n’est pas un énième tutoriel. C’est une idée toute bête : créer un conteneur qui fait quelque chose, même minuscule, pour voir concrètement ce que Docker permet de faire. J’ai appelé le projet “boxeur” ; une image basée sur Alpine qui exécute en boucle un script Bash et écrit des logs. Pas de grand plan au départ. Mais à mesure que j’avançais, les concepts clés de Docker se sont mis en place un par un : ce qu’est une image, ce qu’est un conteneur, comment ils communiquent, où vivent les données.

让我走出困境的不是又一个教程,而是一个简单的想法:创建一个能做点什么(哪怕是很小的事情)的容器,从而直观地看到 Docker 能做什么。我把这个项目命名为“boxeur”;这是一个基于 Alpine 的镜像,它循环执行一个 Bash 脚本并写入日志。起初并没有宏大的计划,但随着进展,Docker 的核心概念一个接一个地清晰起来:什么是镜像,什么是容器,它们如何通信,数据存储在哪里。

Coder, lancer, observer ce qui casse, comprendre pourquoi : c’est cette boucle qui m’a fait passer de “je regarde des vidéos sur Docker” à “je sais ce que je fais quand j’utilise Docker”. C’est là que j’ai compris un principe qu’Endah n’arrêtait pas de me répéter : sortir du tutorial hell. Regarder des vidéos, c’est confortable, mais ça reste passif. Taper docker run pour la première fois, lire l’erreur que ton terminal te renvoie, et comprendre ce qu’elle signifie, c’est ça qui construit une vraie compréhension du système.

编码、运行、观察哪里出错了、理解原因:正是这个循环让我从“看 Docker 视频”转变为“我知道我在用 Docker 做什么”。就在那时,我理解了 Endah 一直对我强调的原则:走出“教程地狱”(tutorial hell)。看视频很舒服,但那始终是被动的。第一次输入 docker run,阅读终端返回的错误,并理解它的含义,这才是构建系统真正理解力的方式。

Les galères (et ce qu’elles m’ont appris sur Docker)

那些坑(以及它们教会我关于 Docker 的事)

Git 403 : mon premier mur Avant même de toucher à Docker, j’ai buté sur Git. Un bête 403 Forbidden en essayant de pousser mon code. La solution : générer un Personal Access Token sur GitHub, parce que les mots de passe classiques ne suffisent plus pour l’authentification en ligne de commande. Ça m’a forcée à comprendre comment GitHub gère l’authentification aujourd’hui, pas juste à copier une commande.

Git 403:我的第一道墙 甚至在接触 Docker 之前,我就在 Git 上碰壁了。在尝试推送代码时遇到了一个愚蠢的 403 Forbidden 错误。解决方法是:在 GitHub 上生成一个个人访问令牌(Personal Access Token),因为传统的密码已不再适用于命令行身份验证。这迫使我理解了 GitHub 现在是如何处理身份验证的,而不仅仅是复制粘贴命令。

Des logs qui n’existaient pas docker logs boxeur… rien. Un terminal désespérément vide. J’ai mis un moment à comprendre pourquoi : mon script écrivait ses logs dans un fichier à l’intérieur du conteneur, pas sur la sortie standard. Or Docker ne capture que ce qui sort sur stdout ; c’est une distinction fondamentale entre “écrire un fichier de log” et “logger au sens Docker du terme”. J’ai donc utilisé une autre approche : lire le fichier directement depuis l’intérieur du conteneur. docker exec boxeur_mentor cat /var/log/boxeur.log. Et là, les logs sont apparus. Cette galère m’a appris comment Docker capture réellement les flux de sortie, et pourquoi la convention “logguer sur stdout” existe dans l’écosystème des conteneurs.

不存在的日志 docker logs boxeur……什么都没有。终端一片死寂。我花了一段时间才明白原因:我的脚本将日志写入了容器内部的一个文件,而不是标准输出(stdout)。然而,Docker 只捕获输出到 stdout 的内容;这是“写入日志文件”与“Docker 意义上的日志记录”之间的根本区别。所以我用了另一种方法:直接从容器内部读取文件:docker exec boxeur_mentor cat /var/log/boxeur.log。日志终于出现了。这次折腾教会了我 Docker 是如何真正捕获输出流的,以及为什么容器生态系统中存在“记录到 stdout”这一惯例。

Alpine n’est pas Ubuntu J’ai voulu installer Nginx et j’ai tapé apt-get install nginx par réflexe. Erreur immédiate. Alpine n’utilise pas apt-get, mais son propre gestionnaire de paquets : apk. apk add --no-cache nginx. Petit détail, grande leçon : chaque image de base a son propre système et son propre gestionnaire de paquets. Ça m’a poussée à comprendre ce qui différencie réellement les distributions Linux utilisées comme images de base, plutôt que de copier des commandes sans en connaître le contexte.

Alpine 不是 Ubuntu 我想安装 Nginx,下意识地输入了 apt-get install nginx。立即报错。Alpine 不使用 apt-get,而是使用它自己的包管理器:apk。即 apk add --no-cache nginx。小细节,大教训:每个基础镜像都有自己的系统和包管理器。这促使我去理解作为基础镜像的 Linux 发行版之间到底有什么区别,而不是在不了解上下文的情况下盲目复制命令。

La faute de frappe qui m’a coûté une heure Au moment de pousser mon image sur Docker Hub, j’ai tagué mon image avec une majuscule : Dreatech/boxeur au lieu de dreatech/boxeur. Résultat, une erreur DNS aussi cryptique que frustrante : lookup Dreatech on 127.0.0.53:53: server misbehaving. Docker Hub n’accepte pas les majuscules dans les noms de dépôt ; une convention de nommage héritée du système de registres de conteneurs. Une fois comprise, la correction était triviale : docker tag boxeur:latest dreatech/boxeur:latest puis docker push dreatech/boxeur:latest.

让我耗费一小时的拼写错误 在将镜像推送到 Docker Hub 时,我给镜像打标签时用了大写字母:Dreatech/boxeur 而不是 dreatech/boxeur。结果出现了一个既晦涩又令人沮丧的 DNS 错误:lookup Dreatech on 127.0.0.53:53: server misbehaving。Docker Hub 不接受仓库名称中的大写字母;这是从容器注册表系统继承下来的命名惯例。一旦理解了这一点,修正就非常简单了:docker tag boxeur:latest dreatech/boxeur:latest 然后 docker push dreatech/boxeur:latest

Ce que je retiens vraiment

我的真正收获

Au-delà des commandes, ce projet m’a permis de comprendre en profondeur plusieurs concepts fondamentaux de Docker :

  • Image vs conteneur : l’image est la recette figée ; le conteneur est l’instance qui tourne, vivante, modifiable, jetable.
  • Docker Compose : en faisant communiquer mon “boxeur” et un “observateur”, j’ai compris comment Compose gère les dépendances entre services.
  • Les volumes et la persistance : un bind mount simple illustre pourquoi la persistance est un problème quand les conteneurs sont éphémères.
  • Le poids des images : Alpine (7 Mo) vs Ubuntu (100 Mo). Comprendre cet écart m’a fait réaliser l’impact du choix de l’image de base sur la vitesse de build et de déploiement.

除了命令之外,这个项目让我深入理解了 Docker 的几个基本概念:

  • 镜像 vs 容器:镜像是固定的配方;容器是运行中的实例,它是鲜活的、可修改的、可丢弃的。
  • Docker Compose:通过让我的“boxeur”与一个“观察者”通信,我理解了 Compose 是如何管理服务间依赖关系的。
  • 数据卷与持久化:一个简单的绑定挂载(bind mount)很好地说明了为什么在容器本质上是短暂的情况下,持久化是一个独立的问题。
  • 镜像大小:Alpine(7 MB)对比 Ubuntu(100 MB)。理解这种差异让我意识到基础镜像的选择对构建和部署速度的直接影响。

Et puis, il y a eu ce moment précis : docker run -d --name boxeur_mentor dreatech/boxeur:latest. Mon image, celle que j’avais mis du temps à comprendre et à construire, tournait enfin ; publiée, accessible, réelle.

最后,还有那个决定性的时刻:docker run -d --name boxeur_mentor dreatech/boxeur:latest。我的镜像,那个我花了很长时间去理解和构建的东西,终于运行起来了;已发布、可访问、真实存在。

Le rôle du mentorat

指导的作用

Rien de tout ça ne serait arrivé aussi vite sans l’accompagnement d’Endah, ma mentor dans le cadre du programme CloudHer, porté par Women Innovating In Cloud Africa (WIICA). Ses rappels réguliers m’ont poussée à sortir de la phase de lecture passive pour passer à la pratique ; pas en me donnant les réponses, mais en m’orientant.

如果没有 Endah 的陪伴,这一切都不会发生得这么快。她是 Women Innovating In Cloud Africa (WIICA) 发起的 CloudHer 项目中我的导师。她定期的提醒促使我走出被动阅读阶段,投入到实践中;她没有直接给我答案,而是为我指明了方向。