学习中心/工程实践/Docker/Docker 中级:自己写镜像,再用 Compose 一起起
· Docker · 中级
Docker 中级:自己写镜像,再用 Compose 一起起
Dockerfile、数据卷、进去看一眼、两个容器一起起。别人的 nginx 用完了就到这层。

别人的镜像用完了,要自己写配方
初级是 run 别人做好的 nginx。中级是:写 Dockerfile、build 成自己的镜像、数据放进卷、两个容器用 Compose 一起起。
- 写Dockerfile
- 建docker build
- 存volume
- 齐compose up
1. 最小 Dockerfile
仓库根目录放一个叫 Dockerfile 的文件,没有后缀。从上往下执行,每一层都会进缓存。
- 写基础镜像。钉小版本,不要 latest
FROM python:3.12-slim - 写容器里的工作目录
WORKDIR /app - 写先拷依赖清单,改代码时不必重装依赖
COPY pyproject.toml . - 写装依赖。不要把缓存留在图层里
RUN pip install --no-cache-dir . - 写再拷代码
COPY . . - 写容器起来后默认跑什么。用 JSON 数组,不要一整句 shell
CMD ["python", "-m", "http.server", "8000"]
2. 构建
- 不要把依赖目录打进上下文。密钥文件也写进去
echo node_modules > .dockerignore - 在当前目录构建,打上 myapp:dev
docker build -t myapp:dev . - 跑刚做的镜像。浏览器打开 localhost:8000
docker run --rm -p 8000:8000 myapp:dev
3. 数据要活过容器
容器删了,可写层一起没。数据库、上传文件,挂到卷上。
- 建一个命名卷
docker volume create app-data - 把卷挂到容器里的 /data。容器没了,卷还在
docker run --rm -v app-data:/data myapp:dev
4. 进去看一眼
- 进正在跑的 web 里开一个 shell。没有 bash 就用 sh
docker exec -it web sh - 跟着打日志。Ctrl+C 只退出跟随,不停容器
docker logs -f web
5. 两个容器一起起
应用加数据库,不要靠两条 docker run 记端口。写 docker-compose.yml,一次 up。
- 按 compose 文件构建并前台起。Ctrl+C 停整组
docker compose up --build - 后台起
docker compose up -d - 停并拆掉这组容器。卷默认还在,加 -v 才删卷
docker compose down
同一份 compose 里,服务名就是主机名。应用连 db:5432,不要写 localhost。
6. 密钥不要写进镜像
ENV 写进 Dockerfile 的值会进图层,谁都能 docker history 看到。密码、Token 用运行时的 -e 或 compose 的 environment,文件本身不要提交。
- 启动时注入。不要 COPY .env 进镜像
docker run --rm -e DATABASE_URL=postgres://... myapp:dev
会写配方、会挂卷、会 compose,就可以在本机复现一套服务。多阶段构建、非 root、往仓库推,看进阶篇。