自己动手写Docker系列 -- 6.2创建网络

本文是自己动手写Docker系列的一部分,主要介绍如何创建和管理虚拟网络。通过阅读源码,理解Docker网络的实现,并提供运行测试以验证功能,包括创建网络时设置网关IP,查看和删除网络的实现细节。

简介

在前面的文章中,我们完成了一个IP管理和分配的工具类,能自动分配和回收子网的IP,本篇将继续上篇,开始网络的创建部分

源码说明

同时放到了Gitee和Github上,都可进行获取

本章节对应的版本标签是:6.2,防止后面代码过多,不好查看,可切换到标签版本进行查看

代码实现

主要是实现思路如下:

  • 创建网络:读取用户输入的子网,如何取第一个作为网关ip,创建虚拟网络(或者网卡);创建成功后,将网络信息序列化成JSON保存到本地,便于后序读取
  • 删除网络:根据输入的虚拟网络名,删除对应的网络

下面是具体的实现:

network命令新增

首先增加相关的命令操作:

新增network命令操作

func main() {
   
   
	......
	
	app.Commands = []cli.Command{
   
   
		command.InitCommand,
		command.RunCommand,
		command.CommitCommand,
		command.ListCommand,
		command.LogCommand,
		command.ExecCommand,
		command.StopCommand,
		command.RemoveCommand,
		command.NetworkCommand,
	}
	......
}

network 相关详细命令


var NetworkCommand = cli.Command{
   
   
	Name:  "network",
	Usage: "container network commands",
	Subcommands: []cli.Command{
   
   
		{
   
   
			Name:  "create",
			Usage: "create a container network",
			Flags: []cli.Flag{
   
   
				cli.StringFlag{
   
   
					Name:  "driver",
					Usage: "network driver",
				},
				cli.StringFlag{
   
   
					Name:  "subnet",
					Usage: "subnet cidr",
				},
			},
			Action: func(context *cli.Context) error {
   
   
				if len(context.Args()) < 1 {
   
   
					return fmt.Errorf("missing network name")
				}

				err := network.Init()
				if err != nil {
   
   
					return err
				}

				driver := context.String("driver")
				subnet := context.String("subnet")
				name := context.Args()[0]
				if err := network.CreateNetwork(driver, subnet, name); err != nil {
   
   
					return err
				}
				return nil
			},
		},

		{
   
   
			Name:  "list",
			Usage: "list container network",
			Action: func(context *cli.Context) error {
   
   
				if err := network.Init(); err != nil {
   
   
					return err
				}
				return network.ListNetwork()
			},
		},

		{
   
   
			Name:  "remove",
			Usage: "remove container network",
			Action: func(context *cli.Context) error {
   
   
				if len(context.Args()) < 1 {
   
   
					return fmt.Errorf("missing network name")
				}
				if err := network.Init(); err != nil {
   
   
					return err
				}
				if err := network.DeleteNetwork(context.Args()[0]); err != nil {
   
   
					return err
				}
				return nil
			},
		},
	},
}

如上,新增了创建新的网络、查看网络列表和删除网络的操作

创建新网络

在命令启动的时候,传入子网和虚拟网络名,我们根据这些去创建虚拟网络

func CreateNetwork(driver, subnet, name string) error {
   
   
	nw, err := drivers[driver].Create
<think>我们正在解决DockerCompose启动时出现的连接错误:`errorduringconnect:Posthttp://.%2Fpipe%2FdockerDesktopLinuxEngine:EOF`根据引用[1][3]中提到的使用`docker-machine`和`pipe`的相关内容,以及引用[2]中提到的DockerToolbox方案,我们可以推断这个问题通常发生在使用DockerforWindows时,特别是当Docker服务没有正确运行或者环境变量未正确设置时。解决方案步骤:1.**确保Docker服务正在运行**:在Windows上,DockerDesktop需要在后台运行。检查任务栏右下角是否有Docker图标,并确认它是运行的(显示为鲸鱼图标且没有警告)。如果没有运行,手动启动它。2.**尝试重启Docker服务**:右键点击任务栏的Docker图标,选择“Restart”来重启Docker。3.**使用DockerToolbox的解决方案(如果使用的是旧版)**:如果您的环境不支持DockerDesktop(比如家庭版Windows),您可能需要使用DockerToolbox(如引用[2]所述)。但注意,DockerToolbox使用VirtualBox创建虚拟机,其环境管理通过`docker-machine`命令进行。如果已经安装了DockerToolbox,请尝试重启default虚拟机(引用[3]):```docker-machine.exerestartdefault```然后设置环境变量:```docker-machine.exeenvdefault|Invoke-Expression```4.**设置环境变量(针对DockerDesktop)**:有时,环境变量未设置正确也会导致问题。在PowerShell中尝试设置环境变量:```powershell$Env:DOCKER_HOST="npipe:////./pipe/docker_engine"```5.**检查DockerCompose文件**:确保您的`docker-compose.yml`文件没有语法错误。可以运行`docker-composeconfig`来验证。6.**使用管理员权限运行命令行**:确保您以管理员身份运行命令提示符或PowerShell。7.**重置DockerDesktop**:如果上述步骤无效,尝试重置DockerDesktop:右键点击系统托盘图标->Settings->Reset->Resettofactorydefaults。注意:这将删除所有容器和镜像,请谨慎操作。8.**其他可能的解决方案**-确保Windows的命名管道服务(NamedPipe)已启用(通常Docker会自动处理)。-检查防火墙设置,确保没有阻止Docker的通信。根据引用[1],如果使用Portainer,我们也可以通过命名管道连接,但这里我们主要解决compose的连接问题。如果问题仍然存在,请考虑更新DockerDesktop到最新版本。由于错误信息中提到了`http://.%2Fpipe%2FdockerDesktopLinuxEngine`,这通常是指向Docker引擎的管道地址。在DockerDesktop中,引擎通过一个命名管道(在Windows上是`npipe`)进行通信。因此,确保环境变量`DOCKER_HOST`指向正确的管道地址非常重要。下面给出一个在PowerShell中设置环境变量的示例:```powershell#设置DOCKER_HOST为Windows的命名管道$Env:DOCKER_HOST="npipe:////./pipe/docker_engine"#然后再次尝试运行docker-composeup-ddocker-composeup-d```如果上述方法都不奏效,请尝试卸载并重新安装DockerDesktop。注意:在DockerToolbox环境下,Docker引擎运行在名为default的Linux虚拟机中,此时DOCKER_HOST通常是TCP地址(如`tcp://192.168.99.100:2376`),而不是命名管道。因此,请根据您使用的Docker版本(DockerDesktop或DockerToolbox)来选择相应的解决方案。最后,生成相关问题供用户进一步参考。</think> ### 解决 Docker Compose 连接错误 `error during connect Post http://.%2Fpipe%2FdockerDesktopLinuxEngine EOF` 这个错误通常发生在 Docker 引擎没有正确响应请求时。以下是系统化的解决方案: #### 1. 重启 Docker 服务 ```powershell # 重启 Docker 守护进程 docker-machine.exe restart default ``` - 等待 30 秒确保服务完全启动 - 检查服务状态:`docker info`[^3] #### 2. 修复环境变量配置 ```powershell # 重新加载 Docker 环境配置 docker-machine.exe env default | Invoke-Expression # 验证管道连接 Test-NetConnection -ComputerName . -PipeName docker_engine ``` #### 3. 配置命名管道共享 1. 打开 Docker Desktop 设置 2. 进入 **Resources > File Sharing** 3. 添加管道路径:`\\.\pipe\docker_engine` 4. 点击 **Apply & Restart**[^1] #### 4. 重置 Docker 服务 ```powershell # 完全重置 Docker 环境 docker-machine.exe rm default docker-machine.exe create default --driver=hyperv ``` #### 5. 安装 Portainer 进行调试(可选) ```bash docker run -d --name portainer \ --restart always \ -p 9000:9000 \ -v \\.\pipe\docker_engine:\\.\pipe\docker_engine \ portainer/portainer ``` 访问 `http://localhost:9000` 查看容器状态[^1] #### 6. 降级使用 Docker Toolbox 如果仍无法解决: 1. [下载 Docker Toolbox](https://github.com/docker/toolbox/releases) 2. 运行安装程序 3. 启动 Docker Quickstart Terminal[^2] > **重要提示**:操作前备份所有容器:`docker save -o backup.tar <image_name>`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值