最近,我收到了 CODING 产品即将下线的通知邮件,其中还提及了新品 ——CNB(Cloud Native Build 云原生构建)。虽然我并非 CODING 的重度用户,但出于好奇,我深度体验了这款迭代产品。
我的直观感受是,CNB 和 CODING 是两款定位完全不同的产品。CODING 集合了项目管理、代码托管、知识分享等一系列功能,但是 CNB 相对来说非常简单,只有代码托管、云原生构建和云原生开发 3 个功能,这其中最特别,也是使用最丝滑的就是云原生开发,真正做到了开箱即用,等待时间很短。
具体操作上,在你个人的代码仓库,点击“知行合一”按钮,该项目的云端开发环境立刻就为你准备好了。
而且我发现,CNB 是一个练习和熟悉 Docker 环境的绝佳工具,没有前期繁琐的安装过程,直接就可以上手操作 Docker 命令。
为了推广新产品,腾讯还以 CNB 为依托开办了一个 Docker 培训营。这次体验,加上训练营的启发,让我想借此机会,分享一些自己近几年使用 Docker 的心得。
初次接触 Docker 的人都觉得要记得命令太多,开始学习的时候我也有这种感觉,但现在再看,学好 Docker 只需要从 3 方面给入手:基础指令、存储、网络。
虽然 Docker 的指令繁多,但其基本格式都遵循 docker + 对象 + 指令 + 参数
这种清晰的结构。
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
image
和 container
的关系,就像是菜谱与根据菜谱做出的成品菜。一个 image
(菜谱)可以制作出多份 container
(成品菜)。这里分享一个实用技巧:启动 container
时添加 --rm
参数。这样一来,当 container
停止时,它就会被自动销毁,省去了手动清理的麻烦 —— 如同有人帮你处理餐后的碗盘。
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
的内容类似这样:
FROM node:alpine
ADD package.json package-lock.json /code/
WORKDIR /code
RUN npm install --production
ADD . /code
CMD npm start
刚刚我们类比 image
和 container
像菜谱和成品菜,这里对应 Dockfile
和docker-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)
。
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镜像大小的方法
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"]
--no-cache-dir
来防止pip缓存下载的包--extra-index-url https://download.pytorch.org/whl/cpu
专门下载仅限CPU的PyTorch包rm -rf /var/lib/apt/lists/*
来清理apt缓存从 CODING 的迭代到 CNB 的新生,我们能看到云原生工具正朝着更便捷、更专注的方向发展。像 CNB 这样的产品,极大地降低了开发者接触和使用 Docker 等云原生技术的门槛。
而对于 Docker 本身,尽管其生态系统庞大,但万变不离其宗。只要牢牢掌握基础指令、存储和网络这三大核心概念,就能应对绝大多数日常开发和部署场景。
关于 Docker,您又有哪些独到的使用技巧或心得呢?欢迎在评论区留言,我们一起交流进步。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。