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)

  1. 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 |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的镜像

  1. Docker 网络管理
    3.1 网络模式
    bridge:默认桥接模式

host:共享宿主机network

container:共享指定容器network

none:无网络配置,只有IO接口

自定义网络

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
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

复制源镜像至指定目录

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- ( u n a m e − s ) − (uname -s)- (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

相关推荐
weixin_537765802 小时前
【Docker基础】常用命令详解
docker·容器·eureka
mobº2 小时前
K8s 集群部署微服务 - yaml 版本(三)
微服务·容器·kubernetes
阿拉斯攀登3 小时前
CentOS 7.9 上 Docker 安装、配置与实战使用指南
docker·centos
皮糖小王子3 小时前
Docker打开本地镜像
运维·docker·容器
❀͜͡傀儡师3 小时前
docker 部署Flink和传统部署
docker·容器·flink
r***d8654 小时前
GitHub星标15万+的Docker项目,使用指南
docker·容器·github
2501_941623324 小时前
人工智能与机器学习:开启创新驱动的智能时代
eureka
2501_941142644 小时前
Node.js在高并发互联网系统中的异步架构设计与前后端协同优化实践经验分享
eureka
2501_941142644 小时前
基于 TypeScript 与 Node.js 构建高并发实时消息与推送系统的架构设计与工程实践分享
eureka