docker

Docker介绍

Docker 是一个开源容器化平台,主要作用是通过将应用程序及其依赖环境打包成轻量级、可移植的容器,实现跨环境的一致性部署与运行。其核心价值包括:

  1. 环境隔离:容器内的应用与宿主机及其他容器相互隔离,确保运行环境的独立性。
  2. 标准化交付:通过镜像(Image)封装代码、库和配置,消除"在我机器上能运行"的问题。
  3. 资源高效:共享宿主机内核,相比虚拟机(VM)更节省内存和计算资源,启动速度更快。
  4. 跨平台部署:一次构建的容器可在 Linux、Windows、云服务器等多种环境中运行。
  5. 简化运维:支持快速创建、复制、销毁容器,便于弹性扩展和持续集成/持续部署(CI/CD)。

Docker 已成为现代云原生应用开发和微服务架构的基础设施,显著提升了软件交付效率和系统可靠性。

一、Docker架构解析

  1. 核心组件

    REST API Client Docker Daemon Containers Images Networks Volumes

  2. 核心概念对比

    概念 说明 类比
    Image 只读模板,包含应用及其运行环境 虚拟机ISO镜像
    Container 镜像的运行实例,具有可写层 运行中的虚拟机
    Registry 镜像仓库(默认Docker Hub) 应用商店
    Volume 持久化数据存储方案 外接硬盘

二、容器生命周期管理

1. 基础操作命令
bash 复制代码
# 运行容器(示例运行Nginx)
docker run -d -p 8080:80 --name my_nginx nginx:1.23 

# 查看运行中的容器
docker ps
# 查看所有容器(含已停止)
docker ps -a

# 停止/启动容器
docker stop my_nginx
docker start my_nginx

# 删除容器
docker rm my_nginx
2. 容器交互模式
bash 复制代码
# 进入容器bash终端
docker exec -it my_nginx /bin/bash

# 查看容器日志
docker logs -f my_nginx

# 拷贝文件
docker cp local.txt my_nginx:/app/config.txt

三、镜像深度管理

1. 镜像操作全流程
bash 复制代码
# 拉取镜像(指定版本)
docker pull ubuntu:22.04

# 查看本地镜像
docker images

# 标记镜像
docker tag nginx:1.23 myrepo/nginx:v1

# 推送镜像到私有仓库
docker push myrepo/nginx:v1

# 删除镜像
docker rmi nginx:1.23
2. 镜像构建(Dockerfile)
dockerfile 复制代码
# 多阶段构建示例
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

FROM alpine:3.18
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]

构建命令:docker build -t myapp:v1 .


四、存储与网络配置

1. 数据持久化方案
类型 特点 适用场景
Volume Docker管理,存储在/var/lib/docker 数据库数据
Bind Mount 映射宿主机目录 配置文件同步
tmpfs mount 内存临时存储 敏感临时数据
bash 复制代码
# 创建数据卷
docker volume create db_vol

# 使用数据卷
docker run -v db_vol:/var/lib/mysql mysql:8.0
2. 网络模式详解
模式 特点
bridge 默认模式,NAT网络(172.17.0.0/16)
host 共享宿主机网络栈
none 无网络连接
overlay 跨主机容器通信(Swarm集群)
bash 复制代码
# 创建自定义网络
docker network create my_net

# 容器加入指定网络
docker run --net=my_net redis:7.0

五、多容器编排(Docker Compose)

1. 典型docker-compose.yml
yaml 复制代码
version: '3.8'

services:
  web:
    image: nginx:1.23
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - db

  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: example
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:
2. 常用命令
bash 复制代码
docker-compose up -d    # 启动服务
docker-compose down     # 停止并删除
docker-compose logs -f  # 查看日志

六、安全最佳实践

  1. 容器安全准则

    • 禁止使用--privileged特权模式

    • 设置用户权限:docker run -u 1001:1001 ...

    • 定期扫描镜像漏洞:docker scan nginx:1.23

    • 配置资源限制:

      bash 复制代码
      docker run -m 512m --cpus=1.5 ...
  2. 生产环境建议

    • 使用只读文件系统:--read-only

    • 配置健康检查:

      dockerfile 复制代码
      HEALTHCHECK --interval=30s --timeout=3s \
        CMD curl -f http://localhost/ || exit 1

七、高级应用场景

  1. 集群管理

    bash 复制代码
    # 初始化Swarm集群
    docker swarm init
    
    # 部署服务
    docker service create --replicas 3 nginx:1.23
  2. CI/CD集成示例

    bash 复制代码
    # Jenkins Pipeline片段
    stage('Build Image') {
      docker.build("myapp:${env.BUILD_ID}")
    }
    stage('Deploy') {
      docker.withRegistry('https://registry.example.com', 'docker-creds') {
        image.push()
      }
    }

知识拓展建议

  1. 容器运行时比较(containerd vs cri-o)
  2. 云原生技术栈(Kubernetes + Docker)
  3. 服务网格(Istio)与容器监控(Prometheus)
相关推荐
日月星辰Ace3 分钟前
蓝绿部署
运维·后端
余辉zmh7 分钟前
【Linux系统篇】:从匿名管道到命名管道--如何理解进程通信中的管道?
linux·运维·microsoft
小锋学长生活大爆炸11 分钟前
【教程】检查RDMA网卡状态和测试带宽 | 附测试脚本
运维·服务器·网络·ubuntu·网卡·rdma
程序设计实验室14 分钟前
Traefik,想说爱你不容易:一场动态反向代理的心累之旅
linux·docker·devops·traefik·caddy
may_一一29 分钟前
Jenkins插件下载慢解决办法
运维·jenkins
爱的叹息30 分钟前
AI应用开发平台 和 通用自动化工作流工具 的详细对比,涵盖定义、核心功能、典型工具、适用场景及优缺点分析
运维·人工智能·自动化
Pseudo…1 小时前
linux Shell编程之函数与数组(四)
linux·运维·服务器
杰瑞学AI1 小时前
Devops之GitOps:什么是Gitops,以及它有什么优势
运维·git·云原生·kubernetes·devops·argocd
写代码的小阿帆1 小时前
内网Windows挂载目录到公网服务器
运维·服务器
日日行不惧千万里1 小时前
远程登录一个Linux系统,如何用命令快速知道该系统属于Linux的哪个发行版,以及该服务器的各种配置参数,运行状态?
linux·运维·服务器