桥下の民 - Docker
type: channel
link: https://www.wordplay.work/index.php/category/Docker
items: kafka - docker opt
items: Docker Machine
items: Docker Swarm
items: Harbor
items: Docker 容器监控 CIG
items: Docker 轻量级可视化工具 Portainer
items: Docker-Compose 容器编排
items: Docker 网络
items: DockerFile 解析
items: Docker 容器数据卷 & Docker 卷

kafka - docker opt
type: item
date: 2024-08-19T03:38:00+00:00
description: 一、docker compose Kafka 单机docker-compose.yml： version: "3.8" services: kafka: image: bitnami/kafka:4.0.0 container_name: kafka ports: - "9092:9092" environment: - KAFKA_ENABLE_KRAFT=yes - KAFKA_KRAFT_CLUSTER_ID=4L6g3nShT-eMCtK--X86sw - KAFKA_CFG_NODE_ID=1 - KAFKA_CFG_PROCESS_ROLES=broker,controller - KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://:9093 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.10.200:9092 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093 - KAFKA_CFG_LOG_DIRS=/bitnami/kafka/data volumes: - kafka-data:/bitnami/kafka volumes: kafka-data: 启动： docker compose up -d docker compose logs -f kafka version: "3.8": 使用 Compose 文件规范 3.8 版本。 services: 定义要运行的服务集合。 kafka: 服务名（同时也是默认的内部 DNS 名称）。 image: bitnami/kafka:4.0.0: 使用 Bitnami 的 Kafka 4.0.0 镜像（KRaft 模式支持）。 container_name: kafka: 指定容器名为 kafka（便于管理）。 ports: "9092:9092": 将宿主机 9092 暴露到容器 9092（客户端用 9092 连接 Kafka）。未暴露 9093，因为控制面只在容器网络内通信。 environment: Kafka 配置（通过环境变量注入） KAFKA_ENABLE_KRAFT=yes: 启用 KRaft 模式（不使用 Zookeeper）。 KAFKA_KRAFT_CLUSTER_ID=...: KRaft 集群 ID，需固定不变（初始化生成一次即可复用）。 KAFKA_CFG_NODE_ID=1: 当前节点 ID（单节点可为 1）。 KAFKA_CFG_PROCESS_ROLES=broker,controller: 同一进程同时扮演 broker 与 controller。 KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://:9093: 定义监听端口 PLAINTEXT://0.0.0.0:9092：客户端监听在所有网卡 9092。 CONTROLLER://:9093：控制面监听在 9093（对容器网络可见）。 KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.10.200:9092: 对客户端“宣告”的地址，客户端拿到元数据后按此地址回连；需填宿主机可达的 IP/域名与端口。 KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT: 将自定义监听名映射到安全协议（此处均为明文，无 TLS/SASL）。 KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER: 控制面使用名为 CONTROLLER 的监听器。 KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093: KRaft 控制器投票者列表（节点 ID@地址）；单节点为 1@kafka:9093，其中 kafka 为 Compose 内部主机名。 KAFKA_CFG_LOG_DIRS=/bitnami/kafka/data: Kafka 数据目录（分区/段文件等）在容器内的…

Docker Machine
type: item
date: 2024-02-24T06:37:00+00:00
description: 一、简介 Docker Machine 是Docker官方编排项目之一，使用go语言编写的，使用不同引擎在多种平台上快速的安装Docker环境。 Docker Machine 是一个工具，它允许你在虚拟宿主机上安装Docker，并使用docker-machine命令管理这个宿主机，可以使用Docker Machine在本地的MAC或者windows box、公司网络，数据中心或者AWS这样的云提供商上创建docker。 使用docker-machine命令，可以启动、审查、停止、重启托管的docker 也可以升级Docker客户端和守护程序并配置docker客户端和宿主机通信。 Docker Machine 也可以集中管理所以得docker主机。 二、为什么要使用 Docker Machine Docker Machine 使你能够在各种 Linux 上配置多个远程 Docker 宿主机。 此外，Machine 允许你在较早的 Mac 或 Windows 系统上运行 Docker，如上一主题所述。 Docker Engine Linux 系统上原生地运行。如果你有一个 Linux 作为你的主系统，并且想要运行 docker 命令，所有你需要做的就是下载并安装 Docker Engine 。然而，如果你想要在网络上、云中甚至本地配置多个 Docker 宿主机有一个有效的方式，你需要 Docker Machine。 无论你的主系统是 Mac、Windows 还是 Linux，你都可以在其上安装 Docker Machine，并使用 docker-machine 命令来配置和管理大量的 Docker 宿主机。它会自动创建宿主机、在其上安装 Docker Engine 、然后配置 docker 客户端。每个被管理的宿主机（“machine”）是 Docker 宿主机和配置好的客户端的结合 三、Docker和Docker Machine之间的区别 当人们说“Docker”时，他们通常是指 Docker Engine，它是一个客户端 - 服务器应用程序，由 Docker 守护进程、一个REST API指定与守护进程交互的接口、和一个命令行接口（CLI）与守护进程通信（通过封装REST API）。Docker Engine 从 CLI 中接受docker 命令，例如 docker run 、docker ps 来列出正在运行的容器、docker images 来列出镜像，等等。 Docker Machine 是一个用于配置和管理你的宿主机（上面具有 Docker Engine 的主机）的工具。通常，你在你的本地系统上安装 Docker Machine。Docker Machine有自己的命令行客户端 docker-machine 和 Docker Engine 客户端 docker。你可以使用 Machine 在一个或多个虚拟系统上安装 Docker Engine。 这些虚拟系统可以是本地的（就像你在 Mac 或 Windows 上使用 Machine 在 VirtualBox 中安装和运行 Docker Engine 一样）或远程的（就像你使用 Machine 在云提供商上 provision Dockerized 宿主机一样）。Dockerized 宿主机本身可以认为是，且有时就称为，被管理的“machines”。 四、安装 Docker Mechine 可以在多种平台上安装使用，包括Linux 、MacOS已经windows Docker Mechine 安装非常的简单：GitHub 地址:Releases。 安装 Docker Mechine： curl -L https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine && chmod +x /tmp/docker-machine && sudo cp /tmp/docker-machine /usr/local/bin/docker-machine 查看版本确认是否安装成功： docker-machine -v 五、常用命令参数 active 查看当前激活状态的Docker主机 config 查看当前激活状态Docker主机的连接信息 creat 创建Docker主机 env 显示连接到某个主机需要的环境变量 inspect 以json格式输出指定Docker的详细信息 ip 获取指定Docker主机的地址 kill 直接杀死指定的Docker主机 ls 列出所有的管理主机 provision 重新配置…

Docker Swarm
type: item
date: 2024-02-21T03:30:00+00:00
description: 一、前言 Swarm 是 Docker 公司推出的用来管理 docker 集群的平台，几乎全部用 GO 语言来完成的开发的，代码开源：https://github.com/docker/swarm Docker Swarm 和 Docker Compose 一样，都是 Docker 官方容器编排项目，但不同的是，Docker Compose 是一个在单个服务器或主机上创建多个容器的工具，而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务，对于微服务的部署，显然 Docker Swarm 会更加适合。从 Docker 1.12.0 版本开始，Docker Swarm 已经包含在 Docker 引擎中（docker swarm），并且已经内置了服务发现工具，就不需要像之前一样，再配置 Etcd 或者 Consul 来进行服务发现配置了。 上图可以看出，Swarm 是典型的 master-slave 结构，通过发现服务来选举 manager。manager 是中心管理节点，各个 node 上运行 agent 接受 manager 的统一管理，集群会自动通过 Raft 协议分布式选举出 manager 节点，无需额外的发现服务支持，避免了单点的瓶颈问题，同时也内置了 DNS 的负载均衡和对外部负载均衡机制的集成支持。 二、Docker Swarm 工作原理 2.1、Docker Engine client 通过 docker service create 命令去创建一个服务。 2.2、swarm manager API 这个请求直接由 Swarm manager 的 API 进行接收，接收命令并创建服务对象。 orchestrator 为服务创建一个任务。 allocater 为这个任务分配 IP 地址。 dispatcher 将任务分配到指定的节点。 scheduler 再该节点中下发指定命令。 2.3、worker node：接收manager任务后去运行这个任务 container 创建相应的容器。 worker 连接到调度程序以检查分配的任务。 executor 执行分配给工作节点的任务。 三、Swarm 重要概念 Swarm 集群的管理和编排是使用嵌入 docker 引擎的 SwarmKit，可以在 docker 初始化时启动 swarm 模式或者加入已存在的 swarm。 Node 每一个 docker engin 都是一个node（节点），分为 manager 和worker。Manager节点还执行维护所需群集状态所需的编排和集群管理功能。Work节点接收并执行从管理器节点分派的任务。 Service 一个服务是任务的定义，管理机或工作节点上执行。它是群体系统的中心结构，是用户与群体交互的主要根源。创建服务时，需要指定要使用的容器镜像。 Task 任务是在 docekr 容器中执行的命令，Manager 节点根据指定数量的任务副本分配任务给 worker 节点。一个任务包含了一个容器及其运行的命令。task 是 service 的执行实体，task 启动 docker 容器并在容器中执行任务。 3.1、Swarm 命令行说明 docker swarm 集群管理，子命令有 init, join, leave, update。（docker swarm --help查看帮助）； 执行集群的管理功能，维护集群的状态，选举一个 leader 节点去执行调度任务。 init #初始化集群 join #将节点加入集群 join-token #管理加入令牌 leave #从集群中删除某个节点，强制删除加参数--force update #更新集群 unlock #解锁集群 docker node 节点管理，子命令有 accept, promote, demote, inspect, update, tasks, ls, rm。（docker node --help 查看帮助） 接收和执行任务。参与容器集群负载调度，仅用于承载 task。 demote #将集群中一个或多个节点降级 inspect #显示一个或多个节点的详细信息 ls #列出集群中的节点 promote #将一个或多个节点提升为管理节点 rm #从集群中删除停止的节点，--force强制删除参数 ps #列出一个或多个节点上运行的任务 update #更新节点 docker service 服务创建，子命令有 create, inspect, update, remove, tasks。（docker service--help 查看帮助） 一个服务是 work 节点上执行任务的定义。创建一个服务，指定了容器所使用的镜像和容器运行的命令。 cre…

Harbor
type: item
date: 2024-02-19T09:41:00+00:00
description: 一、Harbor 简介 1.1、简介 Harbor 是 VMware 公司开源的企业级 Docker Registry 项目，其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。 Harbor 以 Docker 公司开源的 Registry 为基础，提供了图形管理 UI 、基于角色的访问控制(Role Based AccessControl) 、AD/LDAP 集成、以及审计日志(Auditlogging) 等企业用户需求的功能，同时还原生支持中文。 Harbor 的每个组件都是以 Docker 容器的形式构建的，使用 docker-compose 来对它进行部署。用于部署 Harbor 的 docker-compose 模板位于 harbor/docker-compose.yml。 1.2、Harbor 的特性 1、基于角色控制：用户和仓库都是基于项目进行组织的，而用户在项目中可以拥有不同的权限。 2、基于镜像的复制策略：镜像可以在多个 Harbor 实例之间进行复制（同步）。 3、支持 LDAP/AD：Harbor 可以集成企业内部已有的 AD/LDAP（类似数据库的一张表），用于对已经存在的用户认证和管理。 4、镜像删除和垃圾回收：镜像可以被删除，也可以回收镜像占用的空间。 5、图形化用户界面：用户可以通过浏览器来浏览，搜索镜像仓库以及对项目进行管理。 6、审计管理：所有针对镜 像仓库的操作都可以被记录追溯，用于审计管理。 7、支持 RESTful API：RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。 8、Harbor 和 docker registry 的关系：Harbor 实质上是对 docker registry 做了封装，扩展了自己的业务模板。 1.3、Harbor的构成 Harbor 在架构上主要有 Proxy、Registry、Core services、Database（Harbor-db）、Log collector（Harbor-log）、Job services 六个组件。 Docker Harbor 私有仓库操作的过程： 1、所有的请求或认为的操作都会首先交给 proxy（反向代理）。 2、proxy 会先将请求转发给后端Core services，Core services 中包含 UI、token（身份验证服务）、webhook（网站的一些服务功能）。 3、转发给registry（镜像存储），若需要下载镜像等权限操作，需要通过 Core services 中的 token 令牌的身份验证服务才行。 4、每一次下载和上传都产生操作记录，生成日志，保存至 database 中。 5、database 记录保存镜像的元信息及用户与组的身份信息，通过验证授权才能允许相关操作。 Proxy: 是一个 nginx 的前端代理，Harbor 的 Registry、UI、Token 服务等组件，都处在 nginx 反向代理后边。 该代理将来自浏览器、docker clients 的请求转发到后端不同的服务上。 Registry: 负责储存 Docker 镜像，并处理 Docker push/pull 命令。由于要对用户进行访问控制，即不同用户对 Docker 镜像 有不同的读写权限，Registry 会指向一个 Token 服务，强制用户的每次 Docker pull/push 请求都要携带一个合法的 Token， Registry 会通过公钥对 Token 进行解密验证。 Core services: Harbor的核心功能， UI（harbor-ui）: 提供图形化界面，帮助用户管理 Registry 上的镜像（image）, 并对用户进行授权。 WebHook：为了及时获取Registry上image 状态变化的情况，在Registry 上配置 Webhook，把状态变化传递给 UI 模块。 Token 服务：负责根据用户权限给每个 Docker push/pull 命令签发 Token。Docker 客户端向 Registry 服务发起的请求， 如果不包含 Token，会被重定向到 Token 服务，获得 Token 后再重新向 Registry 进行请求。 Database（harbor-db）：为core services提供数据库服务，负责储存用户权限、审计日志、Docker 镜像分组信息等数据。 Job services: 主要用于镜像复制，本地镜像可以被同步到远程 Harbor 实例上。 Log collector（harbor-log）: 负责收集其他组件的日志到一个地方。 二、部署Harbor 2.1、部署…

Docker 容器监控 CIG
type: item
date: 2022-02-28T05:12:00+00:00
description: 一、原生命令 docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS c1e2abb01b8c portainer 0.00% 14.42MiB / 3.842GiB 0.37% 322kB / 4.77MB 0B / 1.63MB 8 ddb92363b45d fervent_lederberg 0.17% 287.5MiB / 3.842GiB 7.31% 3.6kB / 2.06kB 0B / 0B 28 通过 docker stats 命令可以很方便的看到当前宿主机上所有容器的 CPU，内存以及网络流量等数据，一般小公司够用了。 但是，docker stats 统计结果只能是当前宿主机的全部容器，数据资料是实时的，没有地方存储、没有健康指标过线预警等功能。 二、CIG简介 容器监控 3 剑客 CAdvisor 监控收集 + InfluxDB 存储数据 + Granfana 展示图表。 2.1、CAdvisor CAdvisor 是一个容器资源监控工具，包括容器的内存，CPU，网络IO，磁盘IO 等监控，同时提供了一个 WEB 页面用于查看容器的实时运行状态。CAdvisor 默认存储 2 分钟的数据，而且只是针对单物理机。不过, CAdvisor 提供了很多数据集成接口，支持 InfluxDB，Redis，Kafka，Elasticsearch 等集成，可以加上对应配置将监控数据发往这些数据库存储起来。 CAdvisor功能主要有两点： 展示 Host 和容器两个层次的监控数据。 展示历史变化数据。 2.2、InfluxDB InfluxDB 是用 Go 语言编写的一个开源分布式时序、事件和指标数据库，无需外部依赖。CAdvisor 默认只在本机保存最近 2 分钟的数据，为了持久化存储数据和统一收集展示监控数据，需要将数据存储到 InfluxDB 中。InfluxDB 是一个时序数据库，专门用于存储时序相关数据，很适合存储 CAdvisor 的数据。而且，CAdvisor 本身已经提供了 InfluxDB 的集成方法，启动容器时指定配置即可。 InfluxDB主要功能: 基于时间序列：支持与时间有关的相关函数(如最大、最小、求和等)。 可度量性：你可以实时对大量数据进行计算。 基于事件：它支持任意的事件数据。 2.3、Granfana Grafana是一个开源的数据监控分析可视化平台,支持多种数据源配置(支持的数据源包括 InfluxDB，MySQL，Elasticsearch，OpenTSDB，Graphite 等)和丰富的插件及模板功能，支持图表权限控制和报警。 Grafan主要特性： 灵活丰富的图形化选项。 可以混合多种风格。 支持白天和夜间模式。 多个数据源。 总结： 三、实践 1、新建目录 [root@docker130 ~]# cd /mydocker/ [root@docker130 mydocker]# mkdir cig 2、新建 3 件套组合的 docker-compose.yml version: '3.1' volumes: grafana_data: {} services: influxdb: image: tutum/influxdb:0.9 restart: always environment: - PRE_CREATE_DB=cadvisor ports: - "8083:8083" - "8086:8086" volumes: - ./data/influxdb:/data cadvisor: image: google/cadvisor links: - influxdb:influxsrv command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086 restart: always ports: - "8080:8080" volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro grafana: user: "104" image: grafana/grafana user: "104" restart: always links: - influxdb:influxsrv ports: - "3000:3000" volumes: - grafana_data:/var/lib/grafana…

Docker 轻量级可视化工具 Portainer
type: item
date: 2022-02-28T04:52:00+00:00
description: 一、简介 Portainer 是一款轻量级的应用，它提供了图形化界面，用于方便地管理 Docker 环境，包括单机环境和集群环境。 二、安装 portainer.io Portainer Documentation 步骤： 1、docker 命令安装 docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer -v /var/run/docker.sock:/var/run/docker.sock： 这个选项将主机的 Docker 套接字文件挂载到容器内。这使得 Portainer 能够与 Docker 引擎进行通信，从而管理 Docker 容器和服务。 -v portainer_data:/data： 这个选项创建一个名为 portainer_data 的 Docker 卷，并将其挂载到容器的 /data 目录。这个卷用于持久化 Portainer 的数据，以便在容器重启或重新创建时保留数据。 2、第一次登录需创建 admin，访问地址：xxx.xxx.xxx.xxx:9000。 用户名，直接用默认 admin，密码记得 8 位，随便写。 设置 admin 用户和密码后首次登陆。 选择 local 选项卡后本地 docker 详细信息展示。

Docker-Compose 容器编排
type: item
date: 2022-02-28T04:44:00+00:00
description: 一、简介 Compose 是 Docker 公司推出的一个工具软件，可以管理多个 Docker 容器组成一个应用。需要定义一个 YAML 格式的配置文件 docker-compose.yml，写好多个容器之间的调用关系。然后，只要一个命令，就能同时启动 / 关闭这些容器。 Docker-Compose 是 Docker 官方的开源项目，负责实现对 Docker 容器集群的快速编排。 二、作用 docker 建议我们每一个容器中只运行一个服务，因为 docker 容器本身占用资源极少，所以最好是将每个服务单独的分割开来但是这样我们又面临了一个问题？ 如果我需要同时部署好多个服务，难道要每个服务单独写 Dockerfile 然后在构建镜像，构建容器。所以 docker 官方给我们提供了 docker-compose 多服务部署的工具。 Compose 允许用户通过一个单独的 docker-compose.yml 模板文件（YAML 格式）来定义一组相关联的应用容器为一个项目（project）。 可以很容易地用一个配置文件定义一个多容器的应用，然后使用一条指令安装这个应用的所有依赖，完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。 三、下载安装 官网：https://docs.docker.com/compose/compose-file/compose-file-v3/ 官网下载：https://docs.docker.com/compose/install/ curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose docker-compose --version CentOS/RHEL/Rocky/Alma（官方源）： sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl enable --now docker docker compose version 卸载步骤： 如果是使用 curl 以下方式安装，则卸载 docker-compose: sudo rm /usr/local/bin/docker-compose 四、Compose 核心概念 一文件：docker-compose.yml 两要素 服务（service） 一个个应用容器实例，比如订单微服务、库存微服务、mysql 容器、nginx 容器或者 redis 容器。 工程（project） 由一组关联的应用容器组成的一个完整业务单元，在 docker-compose.yml 文件中定义。 五、Compose 使用的三个步骤 编写 Dockerfile 定义各个微服务应用并构建出对应的镜像文件。 使用 docker-compose.yml 定义一个完整业务单元，安排好整体应用中的各个容器服务。 最后，执行 docker-compose up 命令来启动并运行整个应用程序，完成一键部署上线。 六、Compose 常用命令 docker compose -h 查看帮助。 docker compose up 启动所有 docker compose 服务。 docker compose up -d 启动所有 docker compose 服务并后台运行。指定文件：docker compose -f docker compose.yml up -d。 docker compose down 停止并删除容器、网络、卷、镜像。 docker compose exec yml 里面的服务 id 进入容器实例内部。 docker compose exec docker compose.yml 文件中写的服务 id /bin/bash 。 docker compose ps 展示当前 docker compose 编排过的运行的所有容器。 docker compose top 展示当前 docker compose 编排过的容器进程。 docke…

Docker 网络
type: item
date: 2022-02-28T04:33:00+00:00
description: 一、简介 docker不启动，默认网络情况。 即：ens33、lo、virbr0 在 CentOS7 的安装过程中如果有选择相关虚拟化的的服务安装系统后，启动网卡时会发现有一个以网桥连接的私网地址的 virbr0 网卡(virbr0 网卡：它还有一个固定的默认 IP 地址192.168.122.1)，是做虚拟机网桥的使用的，其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能。 Linux 安装，勾选安装系统的时候附带了 libvirt 服务才会生成的一个东西，如果不需要可以直接将 libvirtd 服务卸载，yum remove libvirt-libs.x86_64。 docker 启动后，网络情况。 会产生一个名为docker0的虚拟网桥 查看 docker 网络模式命令。 默认创建3大网络模式 二、常用基本命令 1、All 命令 2、查看网络 docker network ls 3、查看网络源数据 docker network inspect XXX网络名字 4、删除网络 docker network rm XXX网络名字 5、案例 三、作用 容器间的互联和通信以及端口映射。 容器 IP 变动时候可以通过服务名直接网络通信而不受到影响。 四、网络模式 4.1、总体介绍 bridge模式：使用--network bridge指定，默认使用docker0。 host模式：使用--network host指定。 none模式：使用--network none指定。 container模式：使用--network container:NAME或者容器ID指定。 4.2、容器实例内默认网络 IP 生产规则 1、先启动两个 ubuntu 容器实例。 2、docker inspect 容器ID or 容器名字。 3、关闭 u2 实例，新建 u3，查看 ip 变化 结论： docker 容器内部的 ip 是有可能会发生改变的。 4.3、案例说明 4.3.1、bridge Docker 服务默认会创建一个 docker0 网桥（其上有一个 docker0 内部接口），该桥接网络的名称为 docker0，它在内核层连通了其他的物理或虚拟网卡，这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口的 IP 地址和子网掩码，让主机和容器之间可以通过网桥相互通信。 查看 bridge 网络的详细信息，并通过 grep 获取名称项 docker network inspect bridge | grep name [root@docker130 ~]# docker network inspect bridge | grep name "com.docker.network.bridge.name": "docker0", ifconfig [root@docker130 ~]# ifconfig | grep docker docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 说明： 1、Docker 使用 Linux 桥接，在宿主机虚拟一个Docker容器网桥(docker0)，Docker 启动一个容器时会根据 Docker 网桥的网段分配给容器一个 IP 地址，称为Container-IP，同时 Docker 网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥，这样容器之间就能够通过容器的Container-IP直接通信。 2、docker run 的时候，没有指定 network 的话默认使用的网桥模式就是 bridge，使用的就是docker0。在宿主机 ifconfig，就可以看到 docker0 和自己 create 的 network eth0，eth1，eth2……代表网卡一，网卡二，网卡三……，lo代表127.0.0.1，即 localhost，inet addr 用来表示网卡的IP地址。 3、网桥 docker0 创建一对对等虚拟设备接口一个叫 veth，另一个叫 eth0，成对匹配。 3.1、整个宿主机的网桥模式都是 docker0 ，类似一个交换机有一堆接口，每个接口叫 veth，在本地主机和容器内分别创建一个虚拟接口，并让他们彼此联通（这样一对接口叫 veth pair）； 3.2、每个容器实例内部也有一块网卡，每个接口叫 eth0； 3.3、docker0 上面的每个 veth 匹配某个容器实例内部的 eth0，两两配对，一一匹配。 通过上述，将宿主机上的所有容器都连接到这个内部网络上，两个容器在同一个网络下,会从这个网关下各自拿到分配的 ip，此时两个容器的网络是互通 代码 docker …

DockerFile 解析
type: item
date: 2022-02-28T03:40:00+00:00
description: 一、简介 Dockerfile是用来构建 Docker 镜像的文本文件，是由一条条构建镜像所需的指令和参数构成的脚本。 官网：https://docs.docker.com/engine/reference/builder/ 构建三步骤： 编写 Dockerfile 文件。 docker build命令构建镜像。 docker run依镜像运行容器实例。 二、DockerFile 构建过程解析 Dockerfile 内容基础知识： 1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数。 2、指令按照从上到下，顺序执行。 3、#表示注释。 4、每条指令都会创建一个新的镜像层并对镜像进行提交。 Docker 执行 Dockerfile 的大致流程： 1、docker 从基础镜像运行一个容器 2、执行一条指令并对容器作出修改。 3、执行类似 docker commit 的操作提交一个新的镜像层。 4、docker 再基于刚提交的镜像运行一个新容器。 5、执行 dockerfile 中的下一条指令直到所有指令都执行完成。 总结： 从应用软件的角度来看，Dockerfile、Docker 镜像与 Docker 容器分别代表软件的三个不同阶段。 Dockerfile 是软件的原材料。 Docker 镜像是软件的交付品。 Docker 容器则可以认为是软件镜像的运行态，也即依照镜像运行的容器实例。 Dockerfile面向开发，Docker 镜像成为交付标准，Docker 容器则涉及部署与运维，三者缺一不可，合力充当 Docker体系的基石。 1、Dockerfile，需要定义一个 Dockerfile，Dockerfile 定义了进程需要的一切东西。Dockerfile 涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道，这时需要考虑如何设计 namespace 的权限控制)等等; 2、Docker 镜像，在用 Dockerfile 定义一个文件之后，docker build 时会产生一个 Docker 镜像，当运行 Docker 镜像时会真正开始提供服务; 3、Docker 容器，容器是直接提供服务的。 三、DockerFile常用保留字指令 参考 tomcat8 的 dockerfile 入门：https://github.com/docker-library/tomcat 3.1、FROM 基础镜像，当前新镜像是基于哪个镜像的，指定一个已经存在的镜像作为模板，第一条必须是 from 。 3.2、MAINTAINER 镜像维护者的姓名和邮箱地址 3.3、RUN 容器构建时需要运行的命令。 两种格式： shell格式 RUN <命令行命令> # <命令行命令>等同于，在终端操作的shell命令。 RUN yum -y install vim exec格式 RUN ["可执行文件","参数1","参数2"] # 例如 # RUN ["./test.php","dev","offline"] 等价于 RUN ./test.php dev offline RUN是在 docker build 时运行。 3.4、EXPOSE 当前容器对外暴露出的端口。 3.5、WORKDIR 指定在创建容器后，终端默认登陆的进来工作目录，一个落脚点。 3.6、USER 指定该镜像以什么样的用户去执行，如果都不指定，默认是root。 3.7、ENV 用来在构建镜像过程中设置环境变量。 ENV MY_PATH /usr/mytest 这个环境变量可以在后续的任何 RUN 指令中使用，这就如同在命令前面指定了环境变量前缀一样； 也可以在其它指令中直接使用这些环境变量，比如：WORKDIR $MY_PATH。 3.8、ADD 将宿主机目录下的文件拷贝进镜像且会自动处理 URL 和解压 tar 压缩包。 3.9、COPY 类似 ADD，拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置 COPY src dest COPY ["src", "dest"] <src源路径>：源文件或者源目录 <dest目标路径>：容器内的指定路径，该路径不用事先建好，路径不存在的话，会自动创建。 3.10、VOLUME 容器数据卷，用于数据保存和持久化工作。 3.11、CMD 指定容器启动后的要干的事情。 CMD 容器启动命令 CMD 指令的格式和 RUN 相似，也是两种格式: shell 格式：CMD <命令> exec格式：CMD ["可执行文件"，"参数1"，"参数2"...] 参数列表格式：CMD ["参数…

Docker 容器数据卷 & Docker 卷
type: item
date: 2022-02-28T03:32:00+00:00
description: 一、问题 Docker 挂载主机目录访问如果出现 cannot open directory .: Permission denied 解决办法： 在挂载目录后多加一个 --privileged=true 参数即可。 如果是 CentOS7 安全模块会比之前系统版本加强，不安全的会先禁止，所以目录挂载的情况被默认为不安全的行为。 在 SELinux 里面挂载目录被禁止掉了，如果要开启，一般使用 --privileged=true 命令，扩大容器的权限解决挂载目录没有权限的问题，也即使用该参数，container 内的 root 拥有真正的 root 权限，否则，container 内的 root 只是外部的一个普通用户权限。 二、参数 -v docker run -d -p 5000:5000 -v /deploy/registry/:/var/lib/registry --privileged=true registry 默认情况下，仓库被创建再容器的 /var/lib/registry 目录下，建议自行用容器卷映射，方便于主机联调。 三、容器数据卷 卷就是目录或文件，存在于一个或多个容器中，由 docker 挂载到容器，但不属于联合文件系统，因此能够绕过 Union File System 提供一些用于持续存储或共享数据的特性： 卷的设计目的就是数据的持久化，完全独立于容器的生存周期，因此 Docker 不会在容器删除时删除其挂载的数据卷。 将 docker 容器内的数据保存进宿主机的磁盘中： 运行一个带有容器卷存储功能的容器实例 docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名 四、作用 将运用与运行的环境打包镜像，run 后形成容器实例运行，但是我们对数据的要求希望是持久化的。 Docker 容器产生的数据，如果不备份，那么当容器实例删除后，容器内的数据自然也就没有了。 为了能保存数据在 docker 中我们使用卷。 特点： 数据卷可在容器之间共享或重用数据。 卷中的更改可以直接实时生效。 数据卷中的更改不会包含在镜像的更新中。 数据卷的生命周期一直持续到没有容器使用它为止。 五、案例 5.1、宿主 vs 容器之间映射添加容器卷 命令： docker run -it -v /宿主机目录:/容器内目录 镜像名 /bin/bash docker run -it --name myu3 --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash 查看数据卷是否挂载成功： docker inspect 容器ID [root@docker130 ~]# docker inspect 99890896222b "Mounts": [ { "Type": "bind", "Source": "/tmp/myHostData", "Destination": "/tmp/myDockerData", "Mode": "", "RW": true, "Propagation": "rprivate" } ] 容器和宿主机之间数据共享 docker 修改，主机同步获得。 主机修改，docker 同步获得。 docker 容器stop，主机修改，docker 容器重启数据同步。 5.2、读写规则映射添加说明 读写(默认)rw rw = read + write ro = read only：此时如果宿主机写入内容，可以同步给容器内，容器可以读取到。 docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名 docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 docker run -it --name myu3 --privileged=true -v /tmp/myHostData:/tmp/myDockerData:rw ubuntu /bin/bash 5.3、卷的继承和共享 1、容器1完成和宿主机的映射 docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu 2、容器2继承容器1的卷规则 docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu 六、Docker 卷 Docker 卷是一种用于持久化和共享容器数据的机制。它允许您将数据存储在宿主机的文件系统中，而不是仅仅存储在容器内部。这样，即使容…