Docker 入门:从镜像、容器到 docker-compose 编排

Docker 火了这么多年,我最近才系统学了一遍。这篇笔记把最核心的概念和常用操作串起来,作为自己的入门备忘。

一、三个核心概念

一句话总结:docker pull 把镜像从仓库拉下来,docker run 用镜像创建并启动容器。

二、最常用的命令

docker pull nginx:latest      # 拉取镜像
docker images                 # 查看本地镜像
docker run -d -p 8080:80 --name web nginx   # 后台运行容器, 端口映射
docker ps                     # 查看运行中的容器 (加 -a 看全部)
docker logs -f web            # 跟踪容器日志
docker exec -it web bash      # 进入容器内部
docker stop web && docker rm web            # 停止并删除

其中 -p 8080:80 是端口映射:宿主机的 8080 转发到容器的 80,这是初学时最容易迷糊的地方。

三、用 Dockerfile 构建自己的镜像

以一个简单的静态站点为例:

FROM nginx:alpine
COPY ./dist /usr/share/nginx/html
EXPOSE 80

构建并运行:

docker build -t my-site:1.0 .
docker run -d -p 8080:80 my-site:1.0

构建原则:每一行指令都会产生一层,尽量把变化少的指令放前面,利用好构建缓存。

四、docker-compose:多容器编排

单个容器用 docker run 就够了,但一个真实应用往往有 Web、数据库、缓存好几个容器,这时候就该 compose 上场了。一个典型的 docker-compose.yml:

services:
  web:
    build: .
    ports:
      - "8080:80"
    depends_on:
      - db
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db-data:/var/lib/mysql
volumes:
  db-data:

之后一条 docker compose up -d 就能把整个应用拉起来,docker compose down 一键销毁,环境一致性非常好。

五、数据持久化

容器删了,容器里写的数据就没了。数据库这类有状态服务一定要用 volume 把数据挂到宿主机,这是新手最容易出的生产事故。

六、小结

Docker 的价值在于"一次构建,到处运行",把环境差异这个问题基本消灭了。下一步打算把本站的静态页也塞进 Nginx 容器里跑,顺便练习 volume 挂载站点文件。