Docker 初级新手教程:从零开始掌握容器化
Docker 初级新手教程:从零开始掌握容器化
适用人群:刚接触容器技术、想快速上手 Docker 的开发者。读完本文,你能理解 Docker 的核心概念,并独立完成镜像拉取、容器运行、自定义镜像构建与简单编排。
一、Docker 是什么
Docker 是一个开源的容器化平台。它把应用程序及其依赖(代码、运行时、系统库、配置)打包成一个标准化的单元——容器,让应用在任意环境里都能以相同的方式运行。
一句话概括:Docker 让“在我电脑上能跑”变成“在哪里都能跑”。
二、为什么需要 Docker
传统部署常遇到这些问题:
-
开发环境和生产环境不一致,出现“本地正常、上线报错”。
-
安装依赖繁琐,版本冲突难以排查。
-
一台服务器上部署多个应用,互相影响、资源隔离差。
Docker 带来的价值:
-
环境一致:镜像里固定了运行所需的一切。
-
轻量高效:容器共享宿主机内核,启动通常在秒级。
-
易于交付:镜像可以像代码一样被版本化管理、分发和回滚。
-
隔离性好:每个容器拥有独立的文件系统和进程空间。
三、四个核心概念
理解这四个词,就理解了 Docker 的地基。
-
镜像(Image):一个只读模板,包含运行应用所需的文件系统和配置。可以把它理解成“安装包”。
-
容器(Container):镜像的运行实例。可以把它理解成“正在运行的程序”。同一个镜像可以启动多个容器。
-
仓库(Registry):存放和分发镜像的地方,最常用的是 Docker Hub。
-
Dockerfile:一份文本文件,描述如何从基础镜像一步步构建出自己的镜像。
它们的关系是:Dockerfile 构建镜像,镜像运行成容器,镜像存放在仓库中。
四、安装 Docker
Windows / macOS
推荐安装 Docker Desktop,从官网下载后按提示安装即可。安装完成后启动 Docker Desktop,等待右下角(或菜单栏)图标变为运行状态。
Linux(以 Ubuntu 为例)
可以使用官方脚本快速安装:
curl -fsSL https://get.docker.com | sudo sh
sudo systemctl enable --now docker
安装后把当前用户加入 docker 组,避免每次都要 sudo:
sudo usermod -aG docker $USER
该操作需要重新登录终端后生效。
验证安装
无论哪个平台,执行下面的命令验证:
docker version
docker info
能看到客户端和服务端版本信息,说明安装成功。
五、运行第一个容器
执行:
docker run hello-world
你会看到一段欢迎信息。这条命令背后发生了什么?
-
Docker 先在本地查找
hello-world镜像,没有找到。 -
自动从 Docker Hub 拉取该镜像。
-
基于镜像创建并启动一个容器。
-
容器执行完毕后退出。
一个容器完整的生命周期,往往就是这几步。
六、最常用的命令
# 查看本地镜像
docker images
# 拉取镜像
docker pull nginx:latest
# 运行容器(-d 后台运行,-p 端口映射,--name 命名)
docker run -d --name my-nginx -p 8080:80 nginx:latest
# 查看运行中的容器
docker ps
# 查看全部容器(含已停止)
docker ps -a
# 查看容器日志
docker logs -f my-nginx
# 进入容器内部
docker exec -it my-nginx bash
# 停止 / 启动 / 删除容器
docker stop my-nginx
docker start my-nginx
docker rm my-nginx
# 删除镜像
docker rmi nginx:latest
建议先记住 run、ps、logs、exec、stop、rm 这几个,日常使用频率最高。
七、实践一:运行一个 Nginx
docker run -d --name web -p 8080:80 nginx:latest
打开浏览器访问 http://localhost:8080,就能看到 Nginx 默认欢迎页。
这里 -p 8080:80 的含义是:把宿主机的 8080 端口映射到容器内的 80 端口。访问宿主机 8080,就相当于访问容器里的 80。
八、实践二:运行 MySQL 并持久化数据
容器删除后,容器内的数据也会随之消失。要保存数据,需要使用数据卷(Volume):
docker run -d --name mysql-demo \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v mysql-data:/var/lib/mysql \
mysql:8
关键参数说明:
-
-e:设置环境变量,这里指定 root 密码。 -
-v mysql-data:/var/lib/mysql:把命名卷mysql-data挂载到容器的数据目录,实现数据持久化。
即使删除容器,只要卷还在,数据就不会丢失。
九、用 Dockerfile 构建自己的镜像
创建一个目录,准备一个简单的静态页面和应用镜像:
# 基于官方 nginx 镜像
FROM nginx:alpine
# 将本地页面复制到容器内的默认站点目录
COPY index.html /usr/share/nginx/html/index.html
# 声明容器对外暴露的端口
EXPOSE 80
# 容器启动时执行的命令
CMD ["nginx", "-g", "daemon off;"]
准备一个 index.html,然后在同一目录执行构建:
docker build -t my-web:v1 .
运行自己构建的镜像:
docker run -d --name my-web -p 8081:80 my-web:v1
访问 http://localhost:8081,看到的就是你自己的页面。
-t my-web:v1 表示给镜像打上“名称:标签”,标签用于区分版本。
十、Docker Compose 入门
当应用包含多个服务(例如 Web + 数据库)时,逐个 docker run 会很繁琐。Docker Compose 可以用一个 YAML 文件描述整套服务。
新建 docker-compose.yml:
services:
web:
build: .
ports:
- "8080:80"
depends_on:
- db
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
在文件所在目录执行:
docker compose up -d
一条命令即可启动全部服务;需要停止时执行:
docker compose down
这就是微服务时代非常常见的本地开发与部署方式。
十一、常见问题
1. 拉取镜像很慢怎么办? 可以为 Docker 配置镜像加速器,在 Docker 的配置文件中添加 registry-mirrors 后重启服务。
2. 容器启动后马上退出了? 用 docker logs <容器名> 查看日志。多数是因为启动命令执行完就结束了,或配置有误。
3. 端口被占用? 把宿主机的映射端口换一个,例如把 8080:80 改成 8090:80。
4. 容器里的数据会丢吗? 容器删除后,未挂载到卷的数据会随容器一起被删除。重要数据务必使用数据卷。
十二、给你的最佳实践
-
镜像尽量使用精简的基础镜像(如
alpine),减小体积与攻击面。 -
不要把密码等敏感信息写死在 Dockerfile 中,使用环境变量或密钥管理。
-
为镜像打上明确的版本标签,避免长期使用
latest。 -
数据一定要挂载到数据卷,不要把状态留在容器内部。
-
定期清理不再使用的容器、镜像和卷,避免磁盘被占满。
总结
到这里,你已经完成了 Docker 的入门闭环:
-
理解了镜像、容器、仓库、Dockerfile 四个核心概念。
-
学会了安装与验证 Docker。
-
掌握了运行、查看、进入、停止、删除容器的常用命令。
-
能运行 Nginx、MySQL 等常见服务,并实现端口映射与数据持久化。
-
能编写 Dockerfile 构建自己的镜像。
-
能用 Docker Compose 编排多服务应用。
接下来最好的学习方式,就是把你自己的一个小项目用 Docker 跑起来。动手一次,胜过读十遍。
- 点赞
- 收藏
- 关注作者
评论(0)