# Docker 从零到大牛(超详细讲解,零基础入门必看,更新到Docker容器编排)
·
一、基础入门
1. Docker 的概念与核心组件(镜像、容器、仓库)

镜像(image) :一个轻量级、可执行的软件包,包含运行应用程序所需的所有内容:代码、运行时环境、系统工具、库和配置文件。
- 核心特性
- 分层结构: 镜像是多层叠加的,每层只存储差异部分,减少了存储开销并加速构建过程。
- 只读性:镜像本身不可修改;当基于镜像创建容器时,Docker会添加一个可写层(容器层)来保存运行时变化。
- 可移植性:镜像可以轻松打包、分发和运行在任何支持Docker的环境中,确保开发、测试和生产环境的一致性。
容器(container):一种轻量级的虚拟化技术,用于打包和运行应用程序及其依赖环境。它基于Docker镜像(一个只读模板),在隔离的沙箱环境中执行应用,共享宿主机的操作系统内核,从而比传统虚拟机更高效、更快速启动。容器具有高度可移植性,能在不同平台(如开发、测试、生产环境)无缝运行。
- 关键特性
- 轻量高效:容器只包含应用运行所需的最小资源,启动时间短(通常在秒级),资源占用低。
- 隔离性: 每个容器运行在独立的进程空间中,确保应用间互不干扰。
- 可移植性:通过Docker镜像,容器能在任何支持Docker的系统(如Linux、Windows)上运行。
- 易于管理:支持自动化部署、扩展和版本控制。
仓库(Repository):用于存储、管理和分发Docker镜像的组件。
-
基本功能:
- 仓库允许用户上传(push)和下载(pull)镜像,实现镜像的集中存储和分发。
- 它支持版本控制,每个镜像可以有多个标签(tag),例如 ubuntu:20.04 或 nginx:latest,便于追踪不同版本的镜像。
- 通过仓库,团队可以共享镜像,提升开发和部署效率。
-
常见类型:
- **公共仓库:**如Docker Hub(官方公共仓库),提供免费服务,用户可以访问预构建的镜像(如MySQL或Python)。例如,使用命令 docker pull nginx 从Docker Hub下载Nginx镜像。
- **私有仓库:**用于企业内部或敏感项目,如自建仓库(使用Docker Registry工具)或云服务(如Amazon ECR、Google Container Registry)。私有仓库增强安全性,确保镜像仅限授权用户访问。
2. Docker 与虚拟机的区别及优势
架构差异
- 虚拟机:通过 Hypervisor(如 VMware、VirtualBox)虚拟化硬件,每个虚拟机包含完整的操作系统(Guest OS)、应用及依赖,资源占用高。
- Docker:基于宿主机的操作系统内核,通过容器化技术隔离进程,共享内核,仅包含应用及依赖,体积更小。
启动速度
- 虚拟机需启动完整的操作系统,通常需要数秒到分钟级。
- Docker 容器直接运行在宿主内核上,启动时间为毫秒级。
资源占用
- 虚拟机需分配固定资源(CPU、内存、磁盘),存在资源浪费。
- Docker 容器按需占用资源,多个容器可共享宿主资源,利用率更高。
Docker 的优势
轻量化与高效
- 容器镜像体积远小于虚拟机镜像,节省存储和带宽。
- 更高的部署密度,单台宿主机可运行更多容器实例。
快速部署与扩展
- 支持秒级横向扩展,适合微服务架构和 DevOps 流程。
- 镜像通过分层构建,易于版本管理和分发。
跨平台一致性
- 开发、测试、生产环境使用相同镜像,避免“在我机器上能运行”问题。
- 支持多云和混合云部署,兼容主流云平台(AWS、Azure、GCP)。
隔离性与安全性
- 虽然共享内核,但通过命名空间(Namespace)和控制组(CGroup)实现进程、网络、文件系统隔离。
- 虚拟机提供更强的硬件级隔离,适合高安全需求场景。
适用场景对比
虚拟机适用场景
- 需要运行不同内核的操作系统(如 Windows 与 Linux 混合环境)。
- 对安全隔离性要求极高的场景(如金融、政务系统)。
Docker 适用场景
- 微服务架构、CI/CD 流水线。
- 快速弹性扩缩容的云原生应用。
- 开发环境标准化与团队协作。
通过结合两者优势(如 Docker 运行在虚拟机内),可平衡安全性与效率。
核心操作

Docker 镜像管理:拉取、列出、删除镜像(docker pull、docker images、docker rmi)
docker pull 下载镜像

docker images 查看本地的主机上的所有镜像
docker images #查看本地的主机上的所有镜像
[root@hadoop100 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 1b44b5a3e06a 4 weeks ago 10.1kB
#解释
REPOSITORY 镜像的仓库源
TAG 标签
IMAGE ID 镜像的id
CREATED 创建时间
SIZE 大小
#可选项
-a , --all #列出所有镜像
-q , --quiet # 只显示镜像id
docker rmi [指定镜像名]:【tag】
[root@hadoop100 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 8.0 6f19538dd7d2 2 weeks ago 780MB
tomcat 9.0 77abd5123450 3 weeks ago 470MB
tomcat latest a79522cb3b39 3 weeks ago 468MB
redis latest f1285ef3611d 5 weeks ago 137MB
nginx latest 41f689c20910 6 weeks ago 192MB
[root@hadoop100 ~]# docker rmi tomcat:9.0
# 不加tag的话默认为最新版,即latest
Untagged: tomcat:9.0
Untagged: tomcat@sha256:7f6ed3a4d4f2492e653a3a8735d0788580f029edbacb0ced940c95fcf2cafdc3
Deleted: sha256:77abd5123450d9239c64e893230eb80a6213b9ab0ba77bfaeaf7287bc4fdd8ec
Deleted: sha256:a9d4960dfb15a455ae561033a964f7a494245c935e81552c13ab1369bf4eb9c6
Deleted: sha256:696a214e557c2391b50f66e88307142a081ddcf7dc89eb33fc037e7399ab442a
Deleted: sha256:d6073d5d0dd7f978730a4a31e658ae06812ae6e6979a5fcc366332aa36aea246
Deleted: sha256:51eded1ae06d6730a733ae06beef189a416292fd2c8b7c68834d0e6ceb5fcc75
[root@hadoop100 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 8.0 6f19538dd7d2 2 weeks ago 780MB
tomcat latest a79522cb3b39 3 weeks ago 468MB
redis latest f1285ef3611d 5 weeks ago 137MB
nginx latest 41f689c20910 6 weeks ago 192MB
Docker 容器管理:启动、停止、删除、查看日志(docker run、docker stop、docker rm、docker logs)
1. docker run 新建容器并启动
docker run [可选参数] image
# 参数说明
--name= "Name" 容器的名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行
-it 交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip: 主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P 随机指定端口
#测试,启动并进入容器
[root@hadoop100 ~]# docker run -it centos /bin/bash
[root@848175d49d10 /]# ls #查看容器内的centos,基础版本,很多命令都是不完善的。
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
#从容器中退回主机
[root@848175d49d10 /]# exit
exit
[root@hadoop100 ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg
[root@hadoop100 ~]# cd /
[root@hadoop100 /]# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
2. docker ps 列出所有运行中的容器

3.退出容器

4. docker rm 删除容器

5. 启动和停止容器

6.后台启动容器

7. 查看日志

8.查看容器中的进程信息

9. 查看镜像的元数据

10.进入正在运行的容器


Dockerfile 与镜像构建
一、Dockerfile 核心指令详解
-
FROM
指定基础镜像,所有操作基于此镜像展开。FROM ubuntu:22.04 # 使用Ubuntu 22.04作为基础 -
RUN
在镜像构建过程中执行命令(每一条RUN生成一个镜像层)。RUN apt-get update && apt-get install -y python3 # 更新并安装Python -
COPY
将本地文件复制到镜像中(构建时生效)。COPY ./app /usr/src/app # 复制本地app目录到镜像的/usr/src/app -
CMD
定义容器默认启动命令(可被docker run覆盖)。CMD ["python3", "app.py"] # 容器启动时运行app.py -
ENTRYPOINT
定义容器主进程(与CMD配合使用,CMD作为参数)。ENTRYPOINT ["nginx"] CMD ["-g", "daemon off;"] # 完整命令:nginx -g "daemon off;" -
其他关键指令
WORKDIR:设置工作目录(后续指令的默认路径)。ENV:设置环境变量(如ENV PYTHONPATH=/app)。EXPOSE:声明容器运行时监听的端口(如EXPOSE 80)。
二、多阶段构建优化镜像大小
原理:通过多个FROM阶段分离构建环境和运行环境,仅复制必要文件到最终镜像。
示例:
# 阶段1:构建环境(安装编译工具)
FROM golang:1.19 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 阶段2:运行环境(仅复制二进制文件)
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"] # 最终镜像仅包含Alpine和myapp二进制文件
优势:最终镜像从包含编译工具的数百MB缩减到仅10MB左右。
三、构建自定义镜像
- 编写Dockerfile(参考上述语法)
- 执行构建命令:
示例:docker build -t your-username/your-image:tag . # -t指定镜像名,`.`表示当前目录为构建上下文docker build -t alice/web-server:v1 . # 构建名为web-server的镜像
四、上传镜像到仓库
-
登录Docker Hub(或私有仓库):
docker login # 输入用户名和密码 -
标记镜像(符合仓库命名规范):
docker tag your-image:tag your-username/your-image:tag -
推送镜像:
docker push your-username/your-image:tag私有仓库示例:
docker push registry.example.com/alice/web-server:v1 # 推送到私有仓库
容器编排与进阶
Docker Compose 基础与多容器部署
1. docker-compose.yml 文件结构
该文件采用 YAML 格式定义多容器应用,核心结构包括:
version: 指定编排格式版本(如'3.8')services: 定义容器服务networks: 配置容器间通信网络volumes: 声明数据持久化存储
2. Web + 数据库部署示例
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
networks:
- app-net
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: $example_password
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- app-net
volumes:
pgdata:
networks:
app-net:
driver: bridge
关键配置说明:
web服务:Nginx 容器,主机端口 808080808080 映射容器端口 808080db服务:PostgreSQL 容器,密码通过环境变量注入volumes:数据库数据持久化存储depends_on:确保数据库先于 Web 启动networks:自定义网络app-net实现服务互通
3. Docker 网络模式
在 docker-compose.yml 中通过 network_mode 指定:
| 模式 | 配置示例 | 特点 |
|---|---|---|
| 桥接 | network_mode: bridge | 默认模式,容器通过虚拟网桥通信,隔离主机网络 |
| 主机 | network_mode: host | 容器直接共享主机网络栈,无 NAT 转换,性能最优但丧失隔离性 |
| 自定义网络 | 显式声明 networks | 通过自定义网络实现服务发现(容器可通过服务名互访),推荐生产环境使用 |
更多推荐



所有评论(0)