学习中心/工程实践/Docker/Docker 中级:自己写镜像,再用 Compose 一起起

· Docker · 中级

Docker 中级:自己写镜像,再用 Compose 一起起

Dockerfile、数据卷、进去看一眼、两个容器一起起。别人的 nginx 用完了就到这层。

正在加载录音…

别人的镜像用完了,要自己写配方

初级是 run 别人做好的 nginx。中级是:写 Dockerfile、build 成自己的镜像、数据放进卷、两个容器用 Compose 一起起。

  1. 写Dockerfile
  2. 建docker build
  3. 存volume
  4. 齐compose up

1. 最小 Dockerfile

仓库根目录放一个叫 Dockerfile 的文件,没有后缀。从上往下执行,每一层都会进缓存。

  • 写
    基础镜像。钉小版本,不要 latestFROM python:3.12-slim
  • 写
    容器里的工作目录WORKDIR /app
  • 写
    先拷依赖清单,改代码时不必重装依赖COPY pyproject.toml .
  • 写
    装依赖。不要把缓存留在图层里RUN pip install --no-cache-dir .
  • 写
    再拷代码COPY . .
  • 写
    容器起来后默认跑什么。用 JSON 数组,不要一整句 shellCMD ["python", "-m", "http.server", "8000"]

2. 构建

  • 不要把依赖目录打进上下文。密钥文件也写进去echo node_modules > .dockerignore
  • 在当前目录构建,打上 myapp:devdocker build -t myapp:dev .
  • 跑刚做的镜像。浏览器打开 localhost:8000docker 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 就用 shdocker 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、往仓库推,看进阶篇。

同模块

工程实践 →