Docker 入门:从一条命令到一个可复用的开发环境
第一次在新电脑上搭建开发环境时,最花时间的往往不是写代码,而是对齐版本:本地是 Python 3.11,同事是 3.12,数据库端口又被别的服务占了。Docker 的价值就在这里:它把应用和运行环境打成一个可以到处运行的包,换一台机器,只要镜像和启动方式不变,结果就大体一致。本文用本地练习的思路,带你从一条命令走到一个可复用的开发环境。
一、先跑起来:镜像、容器、端口
镜像可以理解为只读模板,容器是模板跑起来的实例。先试官方示例:
docker run hello-world
看到问候语,说明 Docker 本身工作正常。接下来跑一个网页服务练手:
docker run -d -p 8080:80 --name demo-web nginx
-d 是后台运行,-p 把容器里的 80 端口映射到本机的 8080,–name 给容器起个好记的名字。打开浏览器访问本地 8080 端口,能看到欢迎页就说明端口映射成功了。
常用查看和清理命令要先养成习惯:
docker ps
docker logs demo-web
docker stop demo-web
docker rm demo-web
ps 看运行中的容器,logs 看输出,stop 是停止,rm 是删除容器。注意:删除容器不会自动删除你特意挂载的数据卷,这一点后面会用到。
二、数据放哪里:先理解卷
容器默认是临时的,删了容器,容器内部写的文件通常也跟着消失。练习时如果想保留数据,可以把本机目录挂载进容器:
docker run -d -p 8080:80 -v ./site:/usr/share/nginx/html --name demo-web nginx
这样本机 site 目录里的网页文件会直接被容器里的 Nginx 使用,改了文件刷新浏览器就能看到效果。做开发调试时,这种方式比反复重新打包镜像快得多;真正发布时,再把文件打进镜像。
三、写一个自己的镜像:Dockerfile
只用现成镜像还不够,自己的代码也需要打包。假设项目里有一个静态页面 index.html,写一个最小 Dockerfile:
FROM nginx:alpine
COPY ./site /usr/share/nginx/html
EXPOSE 80
FROM 选基础镜像,COPY 把文件复制进去,EXPOSE 只是声明端口。构建和运行:
docker build -t my-web:1.0 .
docker run -d -p 8081:80 --name my-web my-web:1.0
构建时加 .dockerignore 也很重要,把 node_modules、.git、本地日志排除在外,镜像会更小,构建也更快。镜像名字里的 1.0 就是版本标签,改了代码就换一个新标签,回滚时心里有数。
四、用 Compose 管多个服务
一个服务好办,多个服务一起跑就容易记混端口和依赖。这时可以用 Compose,把服务写进一个文件:
services:
web:
build: .
ports:
- "8081:80"
volumes:
- ./site:/usr/share/nginx/html
然后一条命令启动,另一条命令停止并清理容器:
docker compose up -d
docker compose down
把这个文件提交到代码仓库,新同事只需要拉代码、执行 up,就能得到和你接近一致的环境,这正是 Docker 对团队最大的帮助。
五、新手最容易踩的五个坑
第一,端口冲突:先用 docker ps 排查,不要同时起两个占 8080 的服务。第二,容器删了数据没了:重要数据一定要用卷或者备份,不要只存在容器里。第三,镜像越装越大:基础镜像尽量选 slim、alpine 这类小体积版本,不需要的依赖不要装。第四,把密码写进镜像:密钥、口令不要写进 Dockerfile 和镜像,用环境变量或外部配置注入。第五,只在自己电脑上能跑:换机器测试一次,确认端口、卷路径和启动命令都没有写死成本机专属路径。
六、一个可落地的练习清单
今天就可以按这个顺序练一遍:跑通 hello-world;用 nginx 起一个本地网页;练习 ps、logs、stop、rm;用卷实现改文件即刷新;写 Dockerfile 并打上版本标签;最后用 Compose 把服务收进一个文件。每一步都记录下自己用的命令和遇到的问题,这份笔记以后就是你的环境说明书。Docker 不是为了炫技,而是让环境从玄学变成可重复、可检查、可分享的工作习惯。
- 点赞
- 收藏
- 关注作者
评论(0)