Docker 全阶段学习指南

1. Docker 基础概念

1.1 云服务与虚拟化基础

1.1.1 云服务模型对比
服务模型核心提供用户责任优点缺点
IaaS虚拟化资源(虚拟机、存储、网络)管 OS、应用部署与资源灵活、可扩展管理复杂,需技术支持
PaaS开发平台(运行环境、工具)仅专注应用开发简化开发流程灵活度低,受平台限制
SaaS现成应用(直接使用)仅使用应用快速部署,省成本定制化差,依赖服务商
DaaS数据处理、分析与访问服务仅用数据与分析降低数据管理难度存在数据隐私风险
1.1.2 常见云服务提供商
  • 阿里云、腾讯云、AWS、Google Cloud、华为云等
  • 提供存储、计算、网络、CDN 等服务
1.1.3 虚拟化技术
  • 全虚拟化:完全模拟硬件环境,兼容多操作系统
  • 半虚拟化:与宿主机协作,性能更优
  • 主流产品:VMware、KVM、Hyper-V、VirtualBox

1.2 Docker 核心价值

1.2.1 为什么需要 Docker
  • 一致性环境:实现跨平台部署,确保应用运行一致性
  • 资源高效:相比传统虚拟机,资源消耗减少50%以上
  • 快速部署:秒级启动,简化应用部署流程
1.2.2 Docker 与传统虚拟机对比
特性Docker 容器虚拟机
启动速度秒级分钟级
资源消耗几乎无损耗50%左右
性能接近原生较弱
单机支持量上千个几十个
隔离性资源隔离/限制完全隔离

1.3 Docker 架构组成

核心组件:
  • Docker Daemon:后台守护进程
  • Docker Client:用户交互界面
  • Images:只读模板,包含应用及其依赖
  • Containers:镜像的运行实例
  • Registry:镜像存储和分发服务(如 Docker Hub)
核心技术:
  • Namespace:实现资源隔离(6大命名空间)
  • Cgroup:实现资源限制
  • Copy-on-Write:高效文件操作
核心概念
  • 镜像(Image):包含应用及依赖的只读模板
  • 容器(Container):镜像的运行实例,具有独立文件系统、网络、进程空间
  • 仓库(Repository):存放 Docker 镜像的地方(如 Docker Hub)

2. Docker 镜像与容器

2.1 安装配置

2.1.1 基本安装步骤
# 关闭防火墙和增强功能
systemctl stop firewalld.service && setenforce 0

# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

# 配置镜像加速——华为云加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [ "https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com" ]
}
EOF

# 设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装 Docker-CE
yum install -y docker-ce docker-ce-cli containerd.io

# 启动服务
systemctl start docker && systemctl enable docker

2.2 镜像管理

2.2.1 基本命令
#查看 Docker 版本
docker --version

#查看 Docker 系统信息
docker info
2.2.2 核心命令
# 拉取镜像
docker pull nginx

# 查看镜像版本
docker inspect <ID>|grep -i version

# 查看镜像
docker images

# 镜像标签
docker tag nginx:latest nginx:web

# 删除镜像
docker rmi nginx:web					#通过 仓库:标签
docker rmi ID							#通过 ID

# 导出
docker save nginx:latest > nginx.tar

# 导入
docker load < nginx.tar

2.3 容器管理

2.3.1 生命周期管理
# 创建容器
docker create -it nginx:latest /bin/bash

# 启动/停止
docker start <container_id>
docker stop <container_id>

# 创建一个自定义名称的容器
docker run -itd --name 自定义名称 镜像名 [命令]

# 修改容器名称
docker rename 原容器名/原容器ID 新名称

# 运行容器
docker run -itd <镜像名> /bin/bash

# 进入容器
docker exec -it <container_id> /bin/bash

# 文件复制
docker cp ~/test.txt <container_id>:/opt/			# 主机复制到容器
docker cp <container_id>:/opt/test.txt /opt			# 容器复制到主机
2.3.2 查看容器
# 查看正在运行的容器
docker ps

# 查看所有容器
docker ps -a

# 查看容器版本号
docker inspect <容器名> |grep -i version

# 查看容器 IP 
docker inspect <容器名> |grep -i ipaddress
2.3.2 批量操作
# 批量停止容器
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash

# 批量清理后台停止的容器
docker rm $(docker ps -a -q)

# 批量删除所有容器
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash

# 批量删除镜像
docker images | awk 'NR>=2{print "docker rmi "$3}'| bash			# 批量删除镜像
docker images |awk 'NR>=2{print "docker rmi "$1 ":" $2}'|bash		# 批量删除同id的镜像

3. Docker 网络管理

3.1 网络模式

  1. bridge:默认桥接模式
  2. host:共享宿主机network
  3. container:共享指定容器network
  4. none:无网络配置,只有IO接口
  5. 自定义网络

3.2 端口映射

# 随机端口映射
docker run -d --name test1 -P nginx

# 指定端口映射
docker run -d --name test2 -p 43000:80 nginx
						   (映射端口:容器端口)

3.3 模式命令

# host 主机模式
docker run -itd --name nginx-host --network host nginx

# container 容器模式
docker run -itd --name test1 centos:7 /bin/bash

# none 无网络模式

# bridge 桥接模式(默认)
docker run -itd --name test3 --network bridge centos:7 /bin/bash
							  (默认  可省略)

# 创建自定义网段
docker network create --subnet 172.18.0.0/16 mynetwork

# 使用指定 IP 运行容器
docker run -itd --name nginx_ceshi01 --net mynetwork --ip 172.18.0.10 nginx

4 资源限制

4.1 CPU 控制

# CPU使用上限限制
docker run -itd --name ceshi01 --cpu-quota 50000 centos:7  # 50% CPUd

# CPU 权重
docker run -itd --name ceshi01 --cpu-shares 512 centos:7   # 使用1024的倍数方便计算 

# CPU 绑定
docker run -itd --name ceshi01 --cpuset-cpus "0,2" centos:7 # 绑定指定CPU

4.2 内存限制

# 内存限制
docker run -itd --name ceshi01 -m 512m centos:7                    # 物理内存限制
docker run -itd --name ceshi01 -m 300m --memory-swap=1g centos:7   # 内存+swap限制

4.3 磁盘 IO 控制

# IO速率限制
docker run -itd --name ceshi01 --device-write-bps /dev/sda:1MB centos:7

4.4 压力测试与验证

分别进入容器,进行压力测试

yum install -y epel-release
yum install -y stress
stress -c 4				#产生四个进程,每个进程都反复不停的计算随机数的平方根

# 观察资源分配情况
docker stats

5 数据管理

5.1 数据卷

# 挂载数据卷
docker run -itd -v /var/mount:/var/mount --name centos_ceshi01 centos:7 /bin/bash

5.2 数据卷容器

# 创建数据卷容器
docker run -itd --name centos_ceshi01 -v /var/mount centos:7 /bin/bash

# 共享数据卷
docker run -itd --name centos_ceshi02 --volumes-from centos_ceshi02 centos:7 /bin/bash

6 容器互联

6.1 链接容器

# 创建互联容器
docker run -itd --name web1 centos:7
docker run -itd --name web2 --link web1:web1 centos:7  			# 不好用,只能单向连

# 测试连接
docker exec -it web2 ping web1

7 Dockerfile——镜像创建

7.1 创建方式对比

方式优点缺点适用场景
基于现有镜像简单快速镜像体积大快速测试
基于本地模板灵活定制需要模板文件特殊系统需求
基于Dockerfile自动化、可版本控制学习成本生产环境

7.2 Dockerfile 核心指令

# 1、FROM——指定基础镜像
FROM centos:7

# 2、MAINTAINER——维护者信息(可选)
MAINTAINER "John Doe <johndoe@example.com>"

# 3、RUN——执行命令(常用于安装软件包、修改配置等)
RUN yum install -y httpd
RUN rm -rf /tmp/*
RUN cd /app && ls -la

# 4、ENTRYPOINT——设置容器启动时默认执行的命令
ENTRYPOINT ["httpd"]

# 5、CMD——启动命令
CMD ["httpd", "-D", "FOREGROUND"]

# 6、EXPOSE——容器内的端口
EXPOSE 80

# 7、ENV——设置环境变量
ENV MY_VAR=my_value

# 8、ADD——将文件或目录从宿主机复制到镜像中,支持从 URL 下载文件,并能自动解压归档文件
ADD myfile.tar.gz /app

# 9、COPY——将本地文件或目录复制到镜像中
COPY . /app

# 10、VOLUME——创建容器中的挂载点
VOLUME ["/data"]

# 11、USER—— 设置容器内运行命令时的用户
USER root

# 12、WORKDIR——设置后续指令的工作目录
WORKDIR /app

# 13、ONBUILD——设置当该镜像作为基础镜像时,后续 Dockerfile 执行的命令
ONBUILD RUN echo "Building from base image"

# 14、HEALTHCHECK——设置容器的健康检查
HEALTHCHECK CMD curl --fail http://localhost:8080 || exit 1

7.3 Dockerfile 示例

# 使用 CentOS 7 作为基础镜像

# 建立工作目录
mkdir /opt/apache
cd /opt/apache
vim Dockerfile
------------------------------------------------------------------------------------------------------------
FROM centos:7
MAINTAINER this is apache image <htj>
ADD CentOS-Base.repo /etc/yum.repos.d/
RUN yum clean all
RUN yum -y install httpd
EXPOSE 80
ADD index.html /var/www/html/index.html
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
------------------------------------------------------------------------------------------------------------
vim run.sh

#!/bin/bash
rm -rf /run/httpd/*							#清理httpd的缓存
/usr/sbin/apachectl -D FOREGROUND			#指定为前台运行
------------------------------------------------------------------------------------------------------------
# 配置注释

# 基于cenyos:7创建
FROM centos:7

# 维护镜像的用户信息
MAINTAINER this is apache image <htj>

# 复制源镜像至指定目录
ADD CentOS-Base.repo /etc/yum.repos.d/

# 镜像操作指令安装apache软件
RUN yum clean all
RUN yum -y update
RUN yum -y install httpd

# 开启 80 端口
EXPOSE 80

# 复制网站首页文件
ADD index.html /var/www/html/index.html

# 将执行脚本复制到镜像中
ADD run.sh /run.sh				

# 给脚本赋权
RUN chmod 755 /run.sh

# 启动容器时执行脚本
CMD ["/run.sh"]
============================================================================================================

//配置容器启动的三种方式
#方法一

ADD run.sh /run.sh				# 将执行脚本复制到镜像中
RUN chmod 755 /run.sh
# 启动容器时执行脚本
CMD ["/run.sh"]

//方法二:
ENTRYPOINT [ "/usr/sbin/apachectl" ]
CMD ["-D", "FOREGROUND"]

//方法三

# 启动 httpd 服务
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]


准备执行脚本(方式一)
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*							#清理httpd的缓存
/usr/sbin/apachectl -D FOREGROUND			#指定为前台运行
# 因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。

//准备网站页面
//
echo "this is test web" > index.html

//生成镜像
docker build -t httpd:centos .   		#注意别忘了末尾有"."

//新镜像运行容器
docker run -d -p 1216:80 httpd:centos

//测试
http://192.168.10.23:1216/

7.3 镜像构建

# 构建镜像
docker build -t myapp:latest .

# 查看构建历史
docker history myapp:latest

8 Docker Compose编排

8.1 简介

Docker Compose用于定义和运行多容器Docker应用程序。

8.2 YAML文件格式

8.2.1 基本语法
  • 大小写敏感:YAML 是大小写敏感的,所以一定要注意区分大小写。
  • 缩进:YAML 使用空格进行缩进,不支持 TAB 缩进。通常推荐使用两个空格作为一个层级的缩进。
  • 列表:列表项使用 -(短横线)表示。
  • 字典:字典使用 :(冒号)连接键值对,冒号后面需要加一个空格。
  • 注释:使用 # 来添加注释。
  • 字符串:如果字符串包含特殊字符,可以使用单引号 ' 或双引号 " 来包裹。
8.2.2 常用字段
  • build:指定Dockerfile路径
  • image:指定镜像
  • ports:端口映射
  • volumes:数据卷挂载
  • networks:网络配置
  • depends_on:依赖关系

8.3 Docker Compose 常用字段

build					# 指定构建配置,子级 dockerfile 标签可指定 Dockerfile 文件名
dockerfile				# 构建镜像的上下文路径
context					# 可为 dockerfile 路径或 git 仓库 url
image					# 指定镜像
command					# 执行命令,覆盖容器默认启动命令
container_name			# 指定容器名称(唯一,指定后无法 scale)
deploy					# 部署和运行服务配置(仅 Swarm 模式可用)
environment				# 添加环境变量
networks				# 加入网络,引用顶级 networks 条目
network_mode			# 设置容器网络模式(如 host、bridge 等)
ports					# 暴露容器端口(同 - p,端口≥60)
volumes					# 挂载宿主机目录或命名卷(命名卷需在顶级 volumes 定义)
volumes_from			# 从其他服务 / 容器挂载卷(支持:ro/:rw,仅版本 '2' 支持)
hostname				# 容器主机名
sysctls					# 在容器内设置内核参数
links					# 连接其他容器(格式:服务名称 [: 服务别名])
privileged				# 给容器 root 权限(true/false,不安全)
restart					# 重启策略:no(默认)、on-failure [: 次数]、always、unless-stopped
depends_on				# 定义容器依赖关系,控制启动顺序(如 php 依赖 apache、mysql)

8.4 Docker Compose 常用命令

docker-compose build							  # 重新构建服务
docker-compose ps								  # 列出容器
docker-compose up        						  # 创建和启动容器
docker-compose exec <服务名> < 命令 >			   # 在指定服务的容器内执行命令
docker-compose scale <服务名>=< 数量 >			   # 指定一个服务的容器启动数量
docker-compose top								  # 显示容器内的进程
docker-compose logs [服务名]						# 查看容器的输出(可指定服务名,不指定则查看所有服务)
docker-compose down								  # 删除容器、网络、数据卷和镜像
docker-compose stop/start/restart [服务名]    		# 停止/启动/重启服务

8.5 Docker Compose 部署实例

8.5.1 安装 docker
# 关闭防火墙和增强功能
systemctl stop firewalld.service && systemctl disable firewalld.service && setenforce 0

# 安装 Docker
yum install -y yum-utils device-mapper-persistent-data lvm2 && yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io && systemctl start docker.service && systemctl enable docker.service

# 验证Docker是否安装成功(出现版本号即为成功)
docker --version

# 华为云加速器(镜像加速器)
mkdir -p /etc/docker
------------------------------------------------------------------------------------------------------------
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [ "https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com" ]
}
EOF
------------------------------------------------------------------------------------------------------------

# 重启服务使配置生效
systemctl daemon-reload
systemctl restart docker

8.5.2 安装 Docker Compose
# 下载最新版 Docker Compose(截至2025年,v2.27.0 为稳定版,可替换为最新版本)
curl -L "https://github.com/docker/compose/releases/download/v2.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予执行权限
chmod +x /usr/local/bin/docker-compose

# 创建软链接(确保命令全局可用)
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 验证安装(出现版本信息即正常)
docker-compose --version

8.5.3 创建项目目录结构
# 创建所有需要的目录(一键执行)
mkdir -p /opt/compose/{nginx/{conf,logs,html},tomcat/{conf,logs,webapps}}
cd /opt/compose

# 目录结构展示
/opt/compose/
├── nginx
│   ├── conf
│   ├── html
│   └── logs
├── tomcat
    ├── conf
    ├── webapps
    └── logs

8.5.3 主配置文件

创建文件:vim /opt/compose/docker-compose.yml

version: '3'

# 自定义网络
networks:
  compose_network:
    driver: bridge
          
services:
  nginx:
    container_name: compose-nginx
    image: nginx:1.20  # 直接使用官方1.20版本镜像
    ports:
      - "80:80"
    volumes:
      # 挂载自定义配置覆盖容器默认配置
      - /opt/compose/nginx/conf:/etc/nginx/conf.d
      # 挂载日志目录
      - /opt/compose/nginx/logs:/var/log/nginx
      # 静态文件目录
      - /opt/compose/nginx/html:/usr/share/nginx/html
    depends_on:
      - tomcat
    networks:
      - compose_network

  tomcat:
    container_name: compose-tomcat
    image: tomcat:9.0
    ports:
      - "8080:8080"
    volumes:
      - /opt/compose/tomcat/conf:/usr/local/tomcat/conf  # 配置挂载(可选)
      - /opt/compose/tomcat/logs:/usr/local/tomcat/logs  # 日志挂载
      - /opt/compose/tomcat/webapps:/usr/local/tomcat/webapps  # 应用挂载
    networks:
      - compose_network

8.5.4 配置 nginx 反向代理
# 配置 nginx 反向代理
vim /opt/compose/nginx/conf/nginx.conf
------------------------------------------------------------------------------------------------------------
server {
    listen 80;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # 所有请求转发到 Tomcat
    location / {
        proxy_pass http://compose-tomcat:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

8.5.4 配置 tomcat
# 配置 nginx 反向代理
vim /opt/compose/nginx/conf/nginx.conf
------------------------------------------------------------------------------------------------------------
server {
    listen 80;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # 所有请求转发到 Tomcat
    location / {
        proxy_pass http://compose-tomcat:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

8.5.6 用户授权
# nginx
chown -R 101:101 /opt/compose/nginx/{conf,logs,html}
chmod -R 755 /opt/compose/nginx/{conf,logs,html}

# tomcat
chown -R 1000:1000 /opt/compose/tomcat/{conf,logs,webapps}
chmod -R 755 /opt/compose/tomcat/{conf,logs,webapps}

8.5.6 启动服务
# 进入项目目录
cd /opt/compose

# 构建或重新构建 Compose 文件中定义的服务所依赖的镜像
docker-compose build

# 启动所有服务(-d表示后台运行)
docker-compose up -d

# 查看启动状态(确保所有服务都是Up状态)
docker-compose ps

更多推荐