我第一次接触 Docker 的时候,内心是崩溃的。

什么镜像、容器、仓库、Dockerfile、docker-compose……一堆名词砸过来,感觉像在学一门新语言。但后来真正用上了,才发现:Docker 其实没那么难,而且一旦用了就回不去了。

今天这篇文章,我尽量用人话把 Docker 讲清楚。如果你是后端开发、运维、或者对部署感兴趣的前端,这篇适合你。

Docker 到底解决了什么问题?

你有没有遇到过这种场景:

  • 代码在你电脑上跑得好好的,部署到服务器就挂了
  • 同事说「我这里没问题啊」,但你的环境就是跑不起来
  • 装一个 MySQL 要配半天,还跟系统里已有的版本冲突

Docker 就是来解决这些「环境不一致」问题的。

简单理解:Docker 把你的应用 + 运行环境打包成一个箱子(容器),在任何地方打开这个箱子,结果都一模一样。

Docker 架构示意图

本文图片来源于网络,如有侵权请联系删除

3 个核心概念,搞懂就入门了

1. 镜像(Image)——应用的模板

镜像就像一个「安装包」,里面包含了运行应用所需的一切:操作系统、依赖库、配置文件、应用代码。

镜像是只读的,你不能直接修改它,只能基于它创建容器。

2. 容器(Container)——运行中的实例

容器是镜像的「运行态」。你可以把镜像想象成一个 Class,容器就是 new 出来的实例。

一个镜像可以同时跑 N 个容器,互不干扰。

3. 仓库(Registry)——镜像的仓库

Docker Hub 就是最大的公共仓库,类似 GitHub 之于代码。你可以从上面 pull 别人做好的镜像,也可以 push 自己的。

实战:5 分钟跑起你的第一个容器

Step 1:安装 Docker

# macOS(推荐 Docker Desktop)
brew install --cask docker

# Ubuntu
curl -fsSL https://get.docker.com | sh

安装完验证一下:

docker --version
# Docker version 24.0.7, build afdd53b

Step 2:拉取并运行 Nginx

# 拉取 nginx 官方镜像
docker pull nginx

# 启动容器,映射 8080 端口
docker run -d -p 8080:80 --name my-nginx nginx

打开浏览器访问 http://localhost:8080,你会看到 Nginx 的欢迎页面。

恭喜,你的第一个容器跑起来了。整个过程不超过 2 分钟。

Step 3:常用命令速查

docker ps              # 查看运行中的容器
docker ps -a           # 查看所有容器(包括已停止的)
docker stop my-nginx   # 停止容器
docker rm my-nginx     # 删除容器
docker images          # 查看本地镜像
docker rmi nginx       # 删除镜像

写一个 Dockerfile

说到这个我想起来,很多人看到 Dockerfile 就犯怵。其实它就是一个「食谱」,告诉 Docker 怎么一步步构建你的镜像。

来个最简单的 Node.js 应用 Dockerfile:

# 基础镜像
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 先复制 package.json(利用缓存)
COPY package*.json ./
RUN npm install

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["node", "index.js"]

然后构建和运行:

docker build -t my-node-app .
docker run -d -p 3000:3000 my-node-app

就这么简单。

Docker 开发工作流

本文图片来源于网络,如有侵权请联系删除

Docker Compose:管理多个容器

实际项目中,你的应用可能需要多个服务配合:Web 服务器 + 数据库 + 缓存。Docker Compose 就是用来一键管理多个容器的。

一个典型的 docker-compose.yml:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
      - redis
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: mysecret
    volumes:
      - pgdata:/var/lib/postgresql/data
  redis:
    image: redis:7-alpine

volumes:
  pgdata:

一个命令全部启动:

docker compose up -d

新手常踩的 3 个坑

  1. 端口冲突:-p 8080:80 左边是宿主机端口,右边是容器端口。如果 8080 被占用,换一个就行
  2. 数据丢失:容器删了,里面的数据就没了。用 -v 挂载 volume 做持久化
  3. 镜像太大:用 alpine 版本的基础镜像(如 node:18-alpine),体积能小 10 倍

说真的,Docker 是我这几年学到的最值的技术之一。不管你是前端、后端还是全栈,学会容器化部署,简历上都能加分。

有什么 Docker 相关的问题,评论区聊 👇

全平台搜索「奥创ultra」,获取更多实用技术干货。

更多推荐