github.com/alibaba/sealer@v0.8.6-0.20220430115802-37a2bdaa8173/pkg/infra/container/client/docker/container_network.go (about) 1 // Copyright © 2021 Alibaba Group Holding Ltd. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package docker 16 17 import ( 18 "fmt" 19 20 "github.com/docker/docker/api/types" 21 "github.com/docker/docker/api/types/network" 22 ) 23 24 func (p *Provider) DeleteNetworkResource(id string) error { 25 return p.DockerClient.NetworkRemove(p.Ctx, id) 26 } 27 28 func (p *Provider) PrepareNetworkResource(networkName string) (string, error) { 29 networks, err := p.DockerClient.NetworkList(p.Ctx, types.NetworkListOptions{}) 30 if err != nil { 31 return "", err 32 } 33 var targetIDs []string 34 35 for _, net := range networks { 36 if net.Name == networkName { 37 if len(net.Containers) > 1 { 38 return "", fmt.Errorf("duplicate bridge name with default %s", net.Name) 39 } 40 targetIDs = append(targetIDs, net.ID) 41 } 42 } 43 44 if len(targetIDs) > 0 { 45 // reuse sealer network 46 for i := 1; i < len(targetIDs); i++ { 47 err = p.DeleteNetworkResource(targetIDs[i]) 48 if err != nil { 49 return "", err 50 } 51 } 52 return targetIDs[0], nil 53 } 54 55 defaultBridgeID := "" 56 mtu := "1500" 57 //get default bridge network id by name 58 for _, net := range networks { 59 if net.Name == "bridge" { 60 defaultBridgeID = net.ID 61 break 62 } 63 } 64 65 // get default network bridge config 66 if defaultBridgeID != "" { 67 defaultBridge, err := p.DockerClient.NetworkInspect(p.Ctx, defaultBridgeID, types.NetworkInspectOptions{}) 68 if err != nil { 69 return "", err 70 } 71 mtu = defaultBridge.Options["com.docker.network.driver.mtu"] 72 } 73 74 // create sealer network 75 resp, err := p.DockerClient.NetworkCreate(p.Ctx, networkName, types.NetworkCreate{ 76 Driver: "bridge", 77 EnableIPv6: true, 78 Options: map[string]string{ 79 "com.docker.network.bridge.enable_ip_masquerade": "true", 80 "com.docker.network.driver.mtu": mtu, 81 }, 82 IPAM: &network.IPAM{ 83 Config: []network.IPAMConfig{ 84 {Subnet: GenerateSubnetFromName(networkName, 0)}, 85 }, 86 }, 87 }) 88 89 if err != nil { 90 return "", err 91 } 92 return resp.ID, nil 93 } 94 95 func (p *Provider) GetNetworkResourceByID(id string) (*types.NetworkResource, error) { 96 net, err := p.DockerClient.NetworkInspect(p.Ctx, id, types.NetworkInspectOptions{}) 97 if err != nil { 98 return nil, err 99 } 100 101 return &net, err 102 }