首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从 CODING 到 CNB:一次产品体验引发的 Docker学习心得

从 CODING 到 CNB:一次产品体验引发的 Docker学习心得

原创
作者头像
dsy
发布2025-07-11 16:10:53
发布2025-07-11 16:10:53
2670
举报
CODING 主页面
CODING 主页面

最近,我收到了 CODING 产品即将下线的通知邮件,其中还提及了新品 ——CNB(Cloud Native Build 云原生构建)。虽然我并非 CODING 的重度用户,但出于好奇,我深度体验了这款迭代产品。

我的直观感受是,CNB 和 CODING 是两款定位完全不同的产品。CODING 集合了项目管理、代码托管、知识分享等一系列功能,但是 CNB 相对来说非常简单,只有代码托管、云原生构建和云原生开发 3 个功能,这其中最特别,也是使用最丝滑的就是云原生开发,真正做到了开箱即用,等待时间很短。

具体操作上,在你个人的代码仓库,点击“知行合一”按钮,该项目的云端开发环境立刻就为你准备好了。

CNB 个人主页面
CNB 个人主页面
云原生开发环境
云原生开发环境

而且我发现,CNB 是一个练习和熟悉 Docker 环境的绝佳工具,没有前期繁琐的安装过程,直接就可以上手操作 Docker 命令。

为了推广新产品,腾讯还以 CNB 为依托开办了一个 Docker 培训营。这次体验,加上训练营的启发,让我想借此机会,分享一些自己近几年使用 Docker 的心得。

初次接触 Docker 的人都觉得要记得命令太多,开始学习的时候我也有这种感觉,但现在再看,学好 Docker 只需要从 3 方面给入手:基础指令、存储、网络。

基础指令

docker 命令的基本格式
docker 命令的基本格式

虽然 Docker 的指令繁多,但其基本格式都遵循 docker + 对象 + 指令 + 参数 这种清晰的结构。

代码语言:cmd
复制
1.image
#从 Docker Hub 拉取版本为 20 的 node image
docker image pull node:20

docker image ls

2.container
# 从本地的 node:20 的 image 启动一个 container 并进入
docker container run -it node:20 /bin/bash

docker container ls

# 进入container内部命令行,一般排查问题的时候常用
 docker exec -it gateway-bmw bash

imagecontainer 的关系,就像是菜谱与根据菜谱做出的成品菜。一个 image(菜谱)可以制作出多份 container(成品菜)。这里分享一个实用技巧:启动 container 时添加 --rm 参数。这样一来,当 container 停止时,它就会被自动销毁,省去了手动清理的麻烦 —— 如同有人帮你处理餐后的碗盘。

代码语言:cmd
复制
docker run -d --name nginx -p 8888:80 --rm nginx:alpine
-d  #启动一个 daemon 进程
--name #为容器指定名称
-p #外部端口:内部端口,宿主机与容器端口映射,方便容器对外提供服务
nginx:alpine #基于该镜像创建容器,alpine代表是最精简的 image

# 测试
 curl localhost:8888
 

在使用 Docker 部署自己应用时,往往需要自己构建镜像。Docker 使用 Dockerfile 作为配置文件构建镜像,常见的 Dockerfile 的内容类似这样:

代码语言:cmd
复制
FROM node:alpine
 
ADD package.json package-lock.json /code/
WORKDIR /code
 
RUN npm install --production
 
ADD . /code
 
CMD npm start

刚刚我们类比 imagecontainer 像菜谱和成品菜,这里对应 Dockfiledocker-compose.yml 文件就像一页菜谱和一桌子菜(有具体的荤菜、素材、凉菜等)的关系,docker-compose.yml 可以看作是一堆 container 的结合,但是这些 container 之间彼此需要交流、需要共享一些数据,这就引出了下面要说的存储和网络。

存储

container 被销毁时,其内部产生的所有数据也会随之丢失。为了持久化存储数据,我们需要使用数据卷(Volume)。主要有两种方式:命名卷 (Named Volume)和 挂载卷 (Bind Mount),它们的区别如下。

数据持久化方式
数据持久化方式

网络

bridge 是 Docker 容器中默认的网络类型,非常适合单机环境下的容器互联。在自定义的 bridge网络中,容器之间可以通过容器名直接进行 DNS 解析和通信。

例如,在下面的 docker-compose.yml 配置中,web 服务可以直接使用服务名 redis 作为主机名来连接 Redis 实例,如 redis.Redis(host='redis', port=6379)

代码语言:cmd
复制
version: '3.8'

services:
  redis:
    image: redis:7.0
    container_name: my-redis
    networks:
      - mynet

  web:
    build: .
    container_name: my-web
    ports:
      - "5000:5000"
    depends_on:
      - redis
    networks:
      - mynet

networks:
  mynet:
    driver: bridge

除了 bridge,Docker 还有其他网络类型,但因日常使用较少,此处不再赘述。

其他技巧

减少docker镜像大小的方法

代码语言:cmd
复制
FROM python:3.12-slim
RUN apt-get update \
    && apt-get install -y \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY . .
RUN pip install --no-cache-dir -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cpu
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
  1. 增加了--no-cache-dir来防止pip缓存下载的包
  2. 使用 --extra-index-url https://download.pytorch.org/whl/cpu 专门下载仅限CPU的PyTorch包
  3. 添加rm -rf /var/lib/apt/lists/*来清理apt缓存

总结

从 CODING 的迭代到 CNB 的新生,我们能看到云原生工具正朝着更便捷、更专注的方向发展。像 CNB 这样的产品,极大地降低了开发者接触和使用 Docker 等云原生技术的门槛。

而对于 Docker 本身,尽管其生态系统庞大,但万变不离其宗。只要牢牢掌握基础指令存储网络这三大核心概念,就能应对绝大多数日常开发和部署场景。

关于 Docker,您又有哪些独到的使用技巧或心得呢?欢迎在评论区留言,我们一起交流进步。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础指令
  • 存储
  • 网络
  • 其他技巧
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档