【docker】网络基础和容器编排

文章目录

  • 【docker】网络基础和容器编排
    • 官方架构
    • 常见的网络类型
    • 命令
      • [docker network create 自建网络](#docker network create 自建网络)
      • [docker network inspect 查看网络详情](#docker network inspect 查看网络详情)
      • [docker network connect [OPTIONS] NETWORK CONTAINER 多插入一根网线](#docker network connect [OPTIONS] NETWORK CONTAINER 多插入一根网线)
      • [docker network disconnect"拔网线"](#docker network disconnect“拔网线”)
      • [docker network prune 删除不用的网络](#docker network prune 删除不用的网络)
      • [docker network rm 删除一个或者多个网络](#docker network rm 删除一个或者多个网络)
      • [docker network ls 显示创建的网络](#docker network ls 显示创建的网络)
      • [docker run --network](#docker run --network)
    • 网络详解
    • [docker compose](#docker compose)
      • docker-compose.yml参数
        • [image 指定容器运行的镜像](#image 指定容器运行的镜像)
        • [command 覆盖容器启动的默认命令](#command 覆盖容器启动的默认命令)
        • [entrypoint 覆盖容器默认entrypoint](#entrypoint 覆盖容器默认entrypoint)
        • [environment 添加环境变量](#environment 添加环境变量)
        • [networks 配置网络](#networks 配置网络)
        • [volumes 实现存储卷的配置](#volumes 实现存储卷的配置)
        • [ports 实现端口映射](#ports 实现端口映射)
        • [expose 声明端口要被暴露,但不会绑定](#expose 声明端口要被暴露,但不会绑定)
        • [build 和dockerfile一起理解](#build 和dockerfile一起理解)
        • [depends_on 设置依赖关系](#depends_on 设置依赖关系)
        • [env_file 从文件中添加环境变量](#env_file 从文件中添加环境变量)
      • [docker compose 命令](#docker compose 命令)
        • 命令格式
        • 参数
        • 常见COMMAND
          • [up 自动构建镜像、构建服务、启动服务、关联服务相关容器](#up 自动构建镜像、构建服务、启动服务、关联服务相关容器)
          • [down 停止所有容器、并删除容器和网络](#down 停止所有容器、并删除容器和网络)
          • [run 在指定服务容器上执行相关命令](#run 在指定服务容器上执行相关命令)
      • 操作案例

【docker】网络基础和容器编排

=本文docker compose示例代码的缩进有问题=

=应该缩进两个空格,本文写的缩进一个空格,注意修改=========

本文主要讲解docker为什么需要网络、网络架构的介绍。

官方架构

docker daemon还有负责网络管理的作用。为了让容器和容器、容器和外界主机、容器和宿主机之间通信。

  • CNM:Docker 提出的容器网络抽象模型,本质是一套「接口规范」,定义了 Docker 网络的核心组件、交互逻辑和生命周期

    • Sandbox:每个容器有多个Sandbox,一个Sandbox连接一个Network。类似一台物理机的网络子系统
    • Endpoint:负责将Sandbox接入Network。类似物理机上的网线 / 网口
    • Network:同一个Network内的Endpoint可以直接通信。类似一个交换机(二层广播域)
  • Libnetwork:Docker 官方基于 CNM 规范开发的核心网络组件(Go 语言编写)。CNM 告诉「应该怎么做」,Libnetwork 负责「实际去做」。

  • 驱动:Libnetwork 的「扩展插件」(内置 + 自定义)。可以让自己实现

常见的网络类型

  • bridge
  • host
  • container
  • none
  • overlay

命令

docker network create 自建网络

格式:

shell 复制代码
docker network create [OPTIONS] NETWORK 

参数

shell 复制代码
-d 网络驱动
--gateway 网关地址
--subnet 表示网段的CIDR格式的子网
--ipv6 

示例

shell 复制代码
docker network create mynet1 --subnet=192.168.0.0/18 # 格式 「IP 地址 / 子网掩码位数」,用于明确网段范围和可用 IP 数量;
docker network ls # 查看创建的网络
docker network inspect mynet1 # 查看详情,可以看到子网的网络地址的范围

docker network inspect 查看网络详情

shell 复制代码
# 这个命令可以查看哪些容器在网络里面
# 支持-f指定打印格式

docker network connect [OPTIONS] NETWORK CONTAINER 多插入一根网线

shell 复制代码
docker network ls # 查看网络情况
docker network create mynet2 --subnet=10.2.0.0/16 # 创建网络
docker images busybox # 查看busybox镜像有什么版本
docker run -dit --name busybox1 busybox # 创建容器
docker ps list # 查看容器情况
docker exec -it busybox1 sh # 进入容器
ifconfig # 查看容器bridge网络连接ip
exit # 退出容器
docker network connect mynet2 busybox1 # 添加网络
# 然后我们进入容器,ifconfig发现多了一个网络
# docker network inspect mynet2 可以发现多了一个busybox1容器

docker network disconnect"拔网线"

shell 复制代码
docker network disconnect mynet2 busybox1 # "拔网线"

docker network prune 删除不用的网络

shell 复制代码
docker network ls
docker network prune
docker network ls

docker network rm 删除一个或者多个网络

shell 复制代码
docker network ls
docker network create mynet1
docker network create mynet2
docker network create mynet3
# 创建网络完毕后,我们创建一个容器,然后使用docekr network connect连接容器到指定网络
# docker network rm 删除多个网络,发现已经使用docker network connect连接的网络不能删除

docker network ls 显示创建的网络

依旧是-f指定过滤,--format指定打印格式,--no-trunc不截断,-q仅仅显示id

docker run --network

shell 复制代码
docker run --network mynet2 -itd --name busybox11 busybox 
  • 创建容器时可以直接指定网络。可以使用docker network inspect mynet2查看有busybox11在网络里,使用docker inspect busybox11可以看到容器配置的Networks查看到对应的IP

  • 如果一开始不指定网络,创建容器后使用docker inspect +容器名,查看Network字段,可以发现默认情况下会加入bridge网络, 可以在shell使用ifconfig查看容器的网关,发现和docker0桥(也就是bridge)的ip一样

  • 注意的是,直接使用--network会发现没有bridge这个网线,但是使用默认创建后使用connect插网线,可以发现后者有bridge和connect两个网线

网络详解

bridge网络

图中eh0表示虚拟网络接口,docker0ocker container

我们创建多个容器使用bridge连接然后测试
shell 复制代码
docker run -dit --name b1 busybox # 我们使用busybox作为镜像创建容器b1,注意-dit保障在后台运行
docker run -dit --name b2 busybox # 创建容器b2
docker exec -it b1 sh # 运行b1容器
ifconfig # 查看b1 eth0连接的地址
docker exec -it b2 sh # 运行b2容器
ifconfig # 查看b2 eth0连接的地址

我们也可以使用network查看谁连接到了bridge------docker network inspect bridge(同时可以看到有一个网桥名称,为docker0)

创建自定义bridge试试
shell 复制代码
docker network ls # 查看当前网络
docker network create mynet4 # 默认创建桥接网络
docker run -dit --name b3 --network mynet4 busybox # 创建容器b3
docker run -dit --name b4 --network mynet4 busybox # 创建容器b4
DNS解析

如果我们使用docker 0桥接网络,使用ping可以ping通对应ip,但是如果希望容器名自动解析为ip,是不行的。不过使用docker network 指定bridge名称,就可以使用DNS解析了

端口的暴露和转发

我们使用-p选项可以在run容器的时候指定port映射,使用docker port + 容器名可以查看端口映射情况

host网络

网卡、端口全都使用宿主机的资源,与宿主机没有network namespace 隔离。所以如果容器希望使用宿主机已经使用的端口,就会报错

shell 复制代码
docker run -itd --name b10 --network=host busybox 

Container网络

和host网络只有一点不同,container网络是借助容器的网络、而不是宿主机的。与指定容器共享网络资源

shell 复制代码
docker run -itd --name b72 --network container:b71 busybox # 这两个容器的ip一摸一样
# 我们使用docker inspect b72 发现b72的网络配置是空的
  • 如果借的鸡退出了,那么服务都不可用了。当鸡重启了,才能再有网络信息

non网络

不能网络通信,只能网络环回

shell 复制代码
docker run -itd --name b73 --network none busybox # 此时不能使用网络服务,所有的ping都不行

docker compose

docker compose负责统帅service,service负责管理container,docker compose组成一个project

可以理解container就是乐队的一个人,service就是一个乐队,docker compose负责管理多个乐队一起演出,一个project有多个docker compose

容器一盘散沙的问题,由docker compose解决,但是docker compose负责单机,docker siromu可以负责集群化容器的编排。安装docker就会自动安装docker-compose-plugin。使用docker compose version可以检查

配置文件:docker-compose.yml。配置完毕后使用docker compose up就启动了

相关命令怎么查看?进入docker.com,找到Doc,找到reference,找到Compose file

docker-compose.yml参数

image 指定容器运行的镜像

我们在/data/maxhuo/mycompose/prj1创建docker-compose.yml文件,编辑内容如下:

shell 复制代码
version: "3.8"  # 冒号后加空格,版本号用引号(可选,但规范)
services:       # 复数形式(核心关键字)
  web:          # 服务名称(自定义,比如叫web、nginx都可以)
    image: nginx:1.24.0  # 单数image,冒号后加空格,镜像名+标签正确

然后我们就可以启动docker-compose了 ------docker compose up -d -d表示后台运行

我们看一下因此产生的相关镜像和网络:

shell 复制代码
docker network ls # 可以发现对于项目prj1有一个bridge网络,名称是prj1_default。工程里的网络都会加入这个网络里,防止与娶她容器会用
docker ps # 产生prj1-web-1容器
docker compose ps # 也可以看到对应compose

docker compose的删除

shell 复制代码
docker compose down # 根据配置文件进行相关内容的删除
command 覆盖容器启动的默认命令

修改docker-compose.yml文件

shell 复制代码
version: "3.8"  # 冒号后加空格,版本号用引号(可选,但规范)
services:       # 复数形式(核心关键字)
  web:          # 服务名称(自定义,比如叫web、nginx都可以)
    image: nginx:1.24.0  # 单数image,冒号后加空格,镜像名+标签正确
    command: ["tail","-f","/etc/hosts"] # 可以覆盖容器启动的默认命令
entrypoint 覆盖容器默认entrypoint
shell 复制代码
version: "3.8"  # 冒号后加空格,版本号用引号(可选,但规范)
services:       # 复数形式(核心关键字)
  web:          # 服务名称(自定义,比如叫web、nginx都可以)
    image: nginx:1.24.0  # 单数image,冒号后加空格,镜像名+标签正确
    entrypoint:
     - tail
     - -f
     - /etc/os-release
environment 添加环境变量
shell 复制代码
version: "3.8"  # 冒号后加空格,版本号用引号(可选,但规范)
services:       # 复数形式(核心关键字)
  web:          # 服务名称(自定义,比如叫web、nginx都可以)
    image: nginx:1.24.0  # 单数image,冒号后加空格,镜像名+标签正确
    environment:
     TEST: 1
networks 配置网络
shell 复制代码
version: "3.8"  # 冒号后加空格,版本号用引号(可选,但规范)
services:       # 复数形式(核心关键字)
  web:          # 服务名称(自定义,比如叫web、nginx都可以)
    image: nginx:1.24.0  # 单数image,冒号后加空格,镜像名+标签正确
    environment:
     TEST: 1
   networks:
    - mywebnet1
    - mywebnet2
networks:
 mywebnet1:
 mywebnet2:

使用docker compose config查看语法是否正确。正确的话就可以运行了。

然后我们查看以下容器的网络情况:docker inspect prj1-web-1

volumes 实现存储卷的配置
shell 复制代码
version: "3.8"  # 冒号后加空格,版本号用引号(可选,但规范)
services:       # 复数形式(核心关键字)
  web:          # 服务名称(自定义,比如叫web、nginx都可以)
    image: nginx:1.24.0  # 单数image,冒号后加空格,镜像名+标签正确
    environment:
     TEST: 1
    volumes:
     - /data/maxhou/voll:/usr/share/nginx/html # 这里使用短格式,还有长格式

然后使用docker compose config查看语法是否正确。正确的话就可以运行了。

ports 实现端口映射
shell 复制代码
version: "3.8"  # 冒号后加空格,版本号用引号(可选,但规范)
services:       # 复数形式(核心关键字)
  web:          # 服务名称(自定义,比如叫web、nginx都可以)
    image: nginx:1.24.0  # 单数image,冒号后加空格,镜像名+标签正确
    environment:
     TEST: 1
    ports:
     - 8977:80
expose 声明端口要被暴露,但不会绑定
shell 复制代码
version: "3.8"  # 冒号后加空格,版本号用引号(可选,但规范)
services:       # 复数形式(核心关键字)
  web:          # 服务名称(自定义,比如叫web、nginx都可以)
    image: nginx:1.24.0  # 单数image,冒号后加空格,镜像名+标签正确
    environment:
     TEST: 1
    expose:
     - 80
build 和dockerfile一起理解
depends_on 设置依赖关系

先启用mysql和redis,然后启动web容器。

shell 复制代码
version: "3.8"
services:
 web:
  image: nginx:1.24.0
  environment:
   TEST: 1
  depends_on:			# 依赖
   mysql:
    condition: service_healthy # mysql启动后,并且健康,此时才能启动nginx
 mysql:
  image: mysql:5.7
  environment:
   MYSQL_ROOT_PASSWD: 123 		# root密码 
  healthcheck:					# 设置健康的条件
   test: mysql -uroot -p123 -e 'select 1;' # 设置检测健康的指令,让 MySQL 客户端直接执行后面「字符串形式的 SQL 语句 / 命令」,执行完后自动退出,无需进入交互式
   interval: 10s # 间隔检测次数
   timeout: 5s # 超时时间
   retries: 10
env_file 从文件中添加环境变量
shell 复制代码
version: "3.8"
services:
 web:
  image: nginx:1.24.0
  environment:
   TEST: 1
  env_file
   - ./comenv
   - ./webenv # 环境变量的配置文件
   # 只需要在对应文件输入...=...格式即可设置容器环境变量

docker compose 命令

命令格式
shell 复制代码
docker compose [OPTIONS] COMMAND [ARGS...]
参数
shell 复制代码
-f 指定docker compose文件名,默认使用当前目录的docker-compose.yml作为配置文件
-p 指定项目名称,后面可以跟多个项目名,就可以根据一个docker-compose创建多个项目,比如就可以同时常见开发和测试环境。默认根据目录名创建项目名
常见COMMAND
up 自动构建镜像、构建服务、启动服务、关联服务相关容器
shell 复制代码
docker compose up [OPTIONS] [SERVICE...]

OPTIONS:

shell 复制代码
-d 容器在后台运行
--force-recreate 强制重启容器
--no-recreate 如果容器已经存在就不重新创建
down 停止所有容器、并删除容器和网络
shell 复制代码
docker compose down # -v会把卷也会删除掉 慎用-v
run 在指定服务容器上执行相关命令
shell 复制代码
docker compose run -d --name mytest web # 这个web是对应的compose文件里services: web。这个服务的名字 

相比docker run,参数少了很多,docker run是跑容器,docker compose run是跑服务

操作案例

我们使用Mysql Redist先启动,然后使用Nginx启动Web。

shell 复制代码
services:
  web:
    image: nginx:1.24.0
    environment:
      TEST: 1
    ports:
      - 8081:80
    networks:
      - mytestnetwork
    volumes:
      - ./nginxhome:/usr/share/nginx/html
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 123
    networks:
      - mytestnetwork
    volumes:
      - ./mysqllib:/var/lib/mysql        
    healthcheck:
      test: mysql -uroot -p123 -e 'select 1;'
      interval: 10s
      timeout: 5s
      retries: 10
  redis:
    image: redis:7
    networks:
      - mytestnetwork
    healthcheck:
      test: redis-cli ping
      interval: 10s
      timeout: 5s
      retries: 10

networks:
  mytestnetwork:
    driver: bridge
相关推荐
郝学胜-神的一滴2 小时前
Linux信号四要素详解:从理论到实践
linux·服务器·开发语言·网络·c++·程序人生
阿干tkl2 小时前
CentOS Stream 8 网络绑定(Bonding)配置方案
linux·网络·centos
互亿无线明明2 小时前
如何为全球业务构建可扩展的“群发国际短信接口”?
java·c++·python·golang·eclipse·php·erlang
pingzhuyan2 小时前
linux运维异常(总) - 排查与修复(系统yum,docker,网络dns解析等)
linux·运维·docker·centos·shell
Ribou2 小时前
LDAP安装docker版
运维·docker·容器
用户607320369452 小时前
PHP Parse error: syntax error 5分钟带你解决语法错误
php
深眸财经2 小时前
汽水音乐崛起的冷思考:抖音「附属业务」能否自立?
网络
-曾牛3 小时前
CSRF跨站请求伪造:原理、利用与防御全解析
前端·网络·web安全·网络安全·渗透测试·csrf·原理解析
孫治AllenSun3 小时前
【Doris】运维命令
运维·服务器·网络