Docker入门:从一个小项目理解镜像、容器与数据卷
刚接触 Docker 时,最容易被名词绕晕:镜像、容器、数据卷、Dockerfile,它们到底是什么关系?我自己的办法是先做一个最小的项目,再回头看概念,顺序就顺了。
一、一个最小的例子
假设你要跑一个静态页面,只需要两个文件:index.html 和 Dockerfile,其他什么都不用装。
Dockerfile 只有三行,分别写成:FROM nginx:alpine、COPY index.html /usr/share/nginx/html/index.html、EXPOSE 80。
然后执行构建命令 docker build -t my-page:1.0 .,再执行启动命令 docker run -d -p 8080:80 --name my-page my-page:1.0。
在浏览器打开本地的 8080 端口,页面出现了。这一步里,镜像就是“已经装好环境、打好包的模板”,容器是“用这个模板跑起来的实例”,两者是一对多的关系:同一个镜像可以启动很多个容器。
二、改代码为什么要重新构建?
第一次改 index.html 后,刷新页面没有变化,这是新手最常遇到的一幕。原因是容器里的文件来自构建那一刻的复制,宿主机上的改动不会自动同步进去。解决办法有两种思路:开发时把代码目录挂载进容器,部署时重新构建镜像并替换容器。先理解“镜像不可变、容器可替换”这个原则,很多操作就不再神秘。
三、数据卷用来装什么?
如果应用要写数据,比如日志或上传的文件,直接写进容器层并不稳妥:容器删掉,数据就跟着没了。数据卷就是把数据放到容器之外,由 Docker 单独管理的一块存储,启动时这样挂载:docker run -d -v mydata:/data --name app my-page:1.0。
这样即使删掉容器再重建,只要卷还在,数据就还在。我的判断标准很简单:代码和环境放镜像里,需要长期保存的东西放卷里。
四、新手常踩的三个坑
第一,端口写反了。-p 8080:80 前面是宿主机端口,后面是容器端口,写反就打不开页面。第二,容器名重复,启动前先执行 docker ps -a 看一眼,旧的要先删掉。第三,镜像越做越大,尽量用 alpine 这类小基础镜像,不要把调试工具、临时文件都塞进最终镜像。
五、一个可复用的检查清单
每次动手前,我会先确认四件事:基础镜像是否够小、端口映射是否正确、数据是否用了卷、镜像有没有打标签。标签不用花哨,1.0、20261109 这种能对应上版本就行。做完这一步,再谈多容器编排、镜像仓库和自动化部署,底子就稳了。
- 点赞
- 收藏
- 关注作者
评论(0)