Docker 入门:从一句话理解容器,到跑起你的第一个应用
很多新手第一次听到 Docker,都会问同一个问题:容器和虚拟机到底有什么不一样?一句话回答:虚拟机是“搬一台电脑”,容器是“打包一个应用”。虚拟机要模拟整套硬件、装一个完整的操作系统,启动慢、占资源多;容器只打包应用本身和它依赖的运行库,与宿主机共享操作系统内核,所以启动常常不到一秒,体积也只有几十到几百 MB。
容器到底解决了什么问题
最经典的场景是“在我电脑上明明能跑”。开发环境是 Python 3.11、生产环境却是 3.9,依赖版本一差,程序就行为异常。Docker 把“应用 + 运行环境”打成一个不可变的镜像(Image),在哪里运行都是一模一样的。镜像是只读的模板,基于镜像启动的实例叫容器(Container),容器里产生的数据如果不做特殊处理,会随容器删除而消失——这是新手最容易踩的第一个坑。
四个核心概念
- 镜像(Image):分层构建的只读文件,每一层对应 Dockerfile 里的一条指令,相同的层可以在多个镜像间复用。
- 容器(Container):镜像的运行实例,彼此隔离,共享内核。
- Dockerfile:描述镜像怎么构建的文本文件,是镜像的“菜谱”。
- 仓库(Registry):存放镜像的地方,Docker Hub 是最常用的公共仓库,云厂商也提供私有镜像托管服务。
动手:跑起你的第一个容器
先确认本地装好了 Docker,执行:
docker version
docker run hello-world
看到 “Hello from Docker!” 就说明环境没问题。接下来跑一个真正的 Web 服务:
docker run -d -p 8080:80 --name my-nginx nginx
这条命令做了三件事:以后台方式(-d)启动容器,把宿主机的 8080 端口映射到容器的 80 端口(-p),并给容器起个名字。打开浏览器访问 localhost:8080,就能看到 Nginx 的欢迎页。停止和删除也很简单:
docker stop my-nginx
docker rm my-nginx
写你自己的镜像
新建一个目录,放一个简单的 index.html,再写一个 Dockerfile:
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
执行 docker build -t my-site:1.0 . 构建,再用 docker run -d -p 8080:80 my-site:1.0 启动,就得到了属于自己的镜像。这里的 alpine 是个非常小的 Linux 发行版镜像,基于它的镜像体积通常只有几十 MB。
新手常踩的四个坑
- 容器删了,数据就没了:需要持久化的数据要用卷(volume)挂载,例如
docker run -v mydata:/data。 - 端口映射写反:
-p 宿主机端口:容器端口,顺序别弄错。 - 镜像越做越大:构建时尽量用多阶段构建,把编译工具留在构建阶段,不带进最终镜像。
- 容器跑着就以为万事大吉:崩溃重启策略要显式设置,例如
--restart unless-stopped。
小结
Docker 的学习曲线并不陡:先理解“镜像是模板、容器是实例”这一组关系,再用 hello-world 和 Nginx 各跑一次,最后亲手写一个 Dockerfile,基本概念就打通了。下一步可以去了解 Docker Compose——用一个 YAML 文件把多个容器编排起来,比如“Web 服务 + 数据库”一次启动。容器化的真正价值不在技术本身,而在于让“开发、测试、生产用同一份环境”从口号变成默认动作。
- 点赞
- 收藏
- 关注作者
评论(0)