Docker 必知必会(2)

举报
剑指南天 发表于 2026/09/17 13:24:47 2026/09/17
【摘要】 Docker 把"环境"变成了代码制品,把"部署"变成了拉镜像+跑容器,把"运维操作"变成了声明式配置。

1.概述

Docker 把"环境"变成了代码制品,把"部署"变成了拉镜像+跑容器,把"运维操作"变成了声明式配置。

2. 端口映射和容器互联

容器默认是隔离的网络环境,拥有独立的内网 IP(仅容器网络内可见),宿主机或外部设备无法直接访问容器内的服务,端口映射的作用就是将宿主机的端口与容器内的服务端口绑定,让外部请求通过宿主机端口转发到容器内部,实现外部对容器服务的访问。

多个容器需要相互协作(比如 Hadoop 的 NameNode 容器和 DataNode 容器、MySQL 容器和 Java 应用容器、Nginx 容器和后端服务容器),容器互联就是让多个容器处于同一网络域,实现容器之间通过容器名 / 别名(无需记复杂的容器内网 IP)直接通信的能力,是多容器集群架构的核心网络配置。

2.1 查看网络

2.2 网络模式

2.2.1 bridge(桥接模式)

Docker 默认的模式。给容器分配一个独立的 “小房子”(独立的网络空间、专属内网 IP),所有容器的 “小房子” 都连在宿主机的一个公共走廊(bridge 网桥) 上。走廊能让容器之间互相串门(容器互联),也能通过走廊的大门(端口映射) 让外部(宿主机 / 外网)进来找容器。

2.2.2 host(主机模式)

容器不再是独立的 “小房子”,而是直接住进了宿主机的 “大别墅”,宿主机的门牌号(IP)就是容器的门牌号,宿主机的窗户(端口)就是容器的窗户。容器用哪个端口,就直接占了宿主机的这个端口,不用任何映射,外部直接访问宿主机 IP + 端口就能找到容器。

2.2.3 none(无网络模式)

容器的 “禁闭模式”

2.3 查看 bridge 网络

docker network inspect bridge

2.4 自定义网络,解决容器间网络访问

Docker 内置 bridge 网络(默认叫 bridge)没有内置容器名的 DNS 解析功能,只能通过 IP 通信;而自定义 bridge 网络(哪怕驱动还是 bridge)默认开启了 DNS 解析,会自动把容器名映射为容器 IP,所以能 ping 通容器名。

创建自定义网络

docker network create --driver <网络模式> <网络名称>

docker network inspect <网络名称/网络id>

创建容器的时候,使用 --network 指定网络

3. Docker Compose

Docker Compose是用于定义和运行多容器应用程序的工具。通过 yml 文件定义多容器的 Docker 应用,再通过一条命令根据 yml 文件的定义去创建或管理多容器。

3.1 安装 docker compose

首先检查系统架构

uname -m

x86_64

sudo curl -L "https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose

arm64

sudo curl -L "https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-linux-aarch64" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

3.2 核心命令

功能描述 V2 版本命令(2.x,无短横线) 核心说明 & 适用场景

后台启动所有容器

docker compose up -d

日常开发 / 部署最常用,后台启动所有服务,容器退出不影响终端

查看容器运行状态

docker compose ps

快速检查容器是否正常运行(Up/Exit 状态)

实时查看容器日志

docker compose logs -f

排查问题核心命令,实时跟踪日志输出(类似 tail -f)

停止所有容器(保留数据)

docker compose stop

临时停止容器,不删除容器 / 数据卷,重启可用 restart

停止并删除容器 / 网络

docker compose down

清理环境常用,停止并删除容器、网络,保留数据卷

进入指定容器

docker compose exec 服务名 bash

进入容器调试(如 exec web_php bash),替代 docker exec

重启所有 / 指定容器

docker compose restart

重启所有容器;加「服务名」仅重启指定容器(如 restart web_nginx)

校验配置文件语法

docker compose config

启动前校验 docker-compose.yml,避免配置语法错误

启动前重新构建镜像

docker compose up -d --build

代码 / 配置修改后,重新构建镜像并启动容器

彻底清理环境(含数据卷)

docker compose down -v

测试环境清理,删除容器、网络、数据卷(谨慎使用,会丢失持久化数据)

仅启动指定服务

docker compose up -d 服务名

无需启动所有服务时使用(如仅启动数据库 up -d db)

查看 Compose 版本

docker compose version

验证安装 / 升级是否成功,V2 版本命令无 --

构建指定服务镜像

docker compose build 服务名

单独构建镜像,不启动容器

查看 Compose 管理的镜像

docker compose images

列出当前 Compose 项目关联的所有镜像

暂停 / 恢复容器进程

docker compose pause

临时暂停容器进程(恢复用 unpause)

删除停止的容器

docker compose rm

清理已停止的容器,需先执行 stop 再 rm

3.3 编写 docker-compose.yml

3.3.1 Compose 文件完整骨架

name: myproject          # 项目名,决定容器前缀和网络名(等价于 -p)

services:                # 核心,定义容器
  <服务名>:
    # 镜像 / 构建
    # 启动参数
    # 网络 / 端口
    # 存储
    # 环境变量
    # 健康检查 / 依赖
    # 资源 / 日志 / 安全

volumes:                 # 声明命名卷(数据持久化)
  <卷名>:

networks:                # 声明自定义网络(网络隔离)
  <网络名>:

configs:                 # 挂配置文件(不用 bind mount)
secrets:                 # 敏感信息(密码/证书)

3.3.2 全字段注释样板

name: shop          # 项目名(决定容器前缀)

services:
  web:
    image: nginx:1.27-alpine
    container_name: shop_web
    build:
      context: ./web
      target: prod
    ports:
      - "127.0.0.1:80:80"
    volumes:
      - ./nginx/conf:/etc/nginx/conf.d:ro
      - static:/usr/share/nginx/html/static
    env_file: [.env]
    depends_on:
      api:
        condition: service_healthy
    restart: unless-stopped
    init: true
    logging:
      driver: json-file
      options: { max-size: "10m", max-file: "3" }
    mem_limit: 256m
    cpus: "0.5"
    networks: [frontend]
    profiles: []

  api:
    image: myapi:3.4
    command: ["gunicorn", "app:app", "-b", "0.0.0.0:8000"]
    env_file: [.env, .env.prod]
    environment:
      WORKERS: "4"
    volumes:
      - uploads:/app/uploads
    expose: ["8000"]
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 15s
      timeout: 5s
      retries: 3
      start_period: 20s
    restart: unless-stopped
    logging: { driver: json-file, options: { max-size: "50m", max-file: "5" } }
    mem_limit: 1g
    cpus: "2"
    networks: [frontend, backend]

  db:
    image: postgres:15-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASS}
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${DB_USER}"]
      interval: 10s
      timeout: 3s
      retries: 5
    restart: unless-stopped
    networks: [backend]

volumes:
  pgdata:
  static:
  uploads:

networks:
  frontend:
  backend:
    internal: true

3.4 开发 vs 生产的关键差异 Checklist

场景

开发

生产

代码

volumes: ./src:/app热更新

别挂,COPY 进镜像

端口

映射 0.0.0.0:3000:3000

只绑 127.0.0.1:+ 走 Nginx

镜像 tag

:dev

锁版本号 :1.4.2,不用 :latest

restart

随便

unless-stopped

日志

随便

必配 max-size

资源

不限

必配 mem_limit/cpus

密码

.env

.env+ secrets:+ 不入 Git

调试工具

profiles: [dev]挂 mailhog/adminer

不 --profile就不起

4. 搭建私有仓库 register

4.1 创建 registry 容器

docker pull registry

4.2 服务端配置镜像源

修改 /etc/docker/daemon.json 文件

{
  "registry-mirrors": [
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.ccs.tencentyun.com"
  ],
  "insecure-registries": ["<宿主机ip或主机名>:5000"]
}

重启 docker 服务

systemctl restart docker

查看 docker 详情

docker info

4.3 创建数据卷

docker volume create registry

4.3 启动容器

docker run -d --name "my_registry" -p 5000:5000 -v registry:/var/lib/registry --restart=always registry:latest

浏览器访问

http://192.168.113.126:5000/v2/_catalog

4.4 docker 客户端使用指南

参考 4.2 修改 /etc/docker/daemon.json 文件的 insecure-registries

并且重启客户端 docker 服务

4.5 镜像标签

标准格式

4.6 推送和拉取私有镜像

将 vm1上面的镜像 vm2:5000/wlg/redis:6.0-alpine 推到 私有仓库

从私有仓库拉取 vm2:5000/wlg/redis:6.0-alpine 到 vm2 的本地仓库

5. 企业级镜像仓库可以使用 harbor 镜像仓库,可以图形化展示

6. 总结

Docker 解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。