diff --git a/libmachine/mcndockerclient/docker_client.go b/libmachine/mcndockerclient/docker_client.go index 828dc7614e5ded39c713a763213c52e4f7dd7107..fcbc4adcafd542433da168beeb679359bec1fc4f 100644 --- a/libmachine/mcndockerclient/docker_client.go +++ b/libmachine/mcndockerclient/docker_client.go @@ -1,14 +1,20 @@ package mcndockerclient import ( + "context" "fmt" + "net/http" + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/network" + "github.com/docker/docker/client" "github.com/docker/machine/libmachine/cert" - "github.com/samalba/dockerclient" + v1 "github.com/opencontainers/image-spec/specs-go/v1" ) // DockerClient creates a docker client for a given host. -func DockerClient(dockerHost DockerHost) (*dockerclient.DockerClient, error) { +func DockerClient(dockerHost DockerHost) (*client.Client, error) { url, err := dockerHost.URL() if err != nil { return nil, err @@ -19,27 +25,35 @@ func DockerClient(dockerHost DockerHost) (*dockerclient.DockerClient, error) { return nil, fmt.Errorf("Unable to read TLS config: %s", err) } - return dockerclient.NewDockerClient(url, tlsConfig) + httpClient := &http.Client{ + Transport: &http.Transport{TLSClientConfig: tlsConfig}, + CheckRedirect: client.CheckRedirect, + } + + return client.NewClientWithOpts( + client.WithHTTPClient(httpClient), + client.WithHost(url), + client.WithAPIVersionNegotiation(), + ) } // CreateContainer creates a docker container. -func CreateContainer(dockerHost DockerHost, config *dockerclient.ContainerConfig, name string) error { +func CreateContainer(dockerHost DockerHost, config *container.Config, hostConfig *container.HostConfig, name string) error { docker, err := DockerClient(dockerHost) if err != nil { return err } - if err = docker.PullImage(config.Image, nil); err != nil { + if _, err = docker.ImagePull(context.Background(), config.Image, types.ImagePullOptions{}); err != nil { return fmt.Errorf("Unable to pull image: %s", err) } - var authConfig *dockerclient.AuthConfig - containerID, err := docker.CreateContainer(config, name, authConfig) + containerCreateResp, err := docker.ContainerCreate(context.Background(), config, hostConfig, &network.NetworkingConfig{}, &v1.Platform{}, name) if err != nil { return fmt.Errorf("Error while creating container: %s", err) } - if err = docker.StartContainer(containerID, &config.HostConfig); err != nil { + if err = docker.ContainerStart(context.Background(), containerCreateResp.ID, types.ContainerStartOptions{}); err != nil { return fmt.Errorf("Error while starting container: %s", err) } diff --git a/libmachine/mcndockerclient/docker_versioner.go b/libmachine/mcndockerclient/docker_versioner.go index b8279c777e041f4b6e79b1f227ca17285c02b88a..5344dd5a14a711e3cf7de6666d59168839e7c397 100644 --- a/libmachine/mcndockerclient/docker_versioner.go +++ b/libmachine/mcndockerclient/docker_versioner.go @@ -1,6 +1,9 @@ package mcndockerclient -import "fmt" +import ( + "context" + "fmt" +) var CurrentDockerVersioner DockerVersioner = &defaultDockerVersioner{} @@ -20,7 +23,7 @@ func (dv *defaultDockerVersioner) DockerVersion(host DockerHost) (string, error) return "", fmt.Errorf("Unable to query docker version: %s", err) } - version, err := client.Version() + version, err := client.ServerVersion(context.Background()) if err != nil { return "", fmt.Errorf("Unable to query docker version: %s", err) } diff --git a/libmachine/provision/configure_swarm.go b/libmachine/provision/configure_swarm.go index 5d7545caecadd018f83fdb9d2192a16adc4b6817..cfb5923f3cb147be49ba8cbbc1ab137557241b54 100644 --- a/libmachine/provision/configure_swarm.go +++ b/libmachine/provision/configure_swarm.go @@ -6,12 +6,13 @@ import ( "strconv" "strings" + "github.com/docker/docker/api/types/container" + "github.com/docker/go-connections/nat" "github.com/docker/machine/libmachine/auth" "github.com/docker/machine/libmachine/engine" "github.com/docker/machine/libmachine/log" "github.com/docker/machine/libmachine/mcndockerclient" "github.com/docker/machine/libmachine/swarm" - "github.com/samalba/dockerclient" ) func configureSwarm(p Provisioner, swarmOptions swarm.Options, authOptions auth.Options) error { @@ -79,42 +80,41 @@ func configureSwarm(p Provisioner, swarmOptions swarm.Options, authOptions auth. cmdMaster = append(cmdMaster, swarmOptions.Discovery) hostBind := fmt.Sprintf("%s:%s", dockerDir, dockerDir) - masterHostConfig := dockerclient.HostConfig{ - RestartPolicy: dockerclient.RestartPolicy{ + masterHostConfig := &container.HostConfig{ + RestartPolicy: container.RestartPolicy{ Name: "always", MaximumRetryCount: 0, }, Binds: []string{hostBind}, - PortBindings: map[string][]dockerclient.PortBinding{ - fmt.Sprintf("%s/tcp", port): { + PortBindings: nat.PortMap{ + nat.Port(fmt.Sprintf("%s/tcp", port)): { { - HostIp: "0.0.0.0", + HostIP: "0.0.0.0", HostPort: port, }, }, }, } - swarmMasterConfig := &dockerclient.ContainerConfig{ + swarmMasterConfig := &container.Config{ Image: swarmOptions.Image, Env: swarmOptions.Env, - ExposedPorts: map[string]struct{}{ - "2375/tcp": {}, - fmt.Sprintf("%s/tcp", port): {}, + ExposedPorts: nat.PortSet{ + "2375/tcp": {}, + nat.Port(fmt.Sprintf("%s/tcp", port)): {}, }, - Cmd: cmdMaster, - HostConfig: masterHostConfig, + Cmd: cmdMaster, } - err = mcndockerclient.CreateContainer(dockerHost, swarmMasterConfig, "swarm-agent-master") + err = mcndockerclient.CreateContainer(dockerHost, swarmMasterConfig, masterHostConfig, "swarm-agent-master") if err != nil { return err } } if swarmOptions.Agent { - workerHostConfig := dockerclient.HostConfig{ - RestartPolicy: dockerclient.RestartPolicy{ + workerHostConfig := &container.HostConfig{ + RestartPolicy: container.RestartPolicy{ Name: "always", MaximumRetryCount: 0, }, @@ -130,17 +130,16 @@ func configureSwarm(p Provisioner, swarmOptions swarm.Options, authOptions auth. } cmdWorker = append(cmdWorker, swarmOptions.Discovery) - swarmWorkerConfig := &dockerclient.ContainerConfig{ - Image: swarmOptions.Image, - Env: swarmOptions.Env, - Cmd: cmdWorker, - HostConfig: workerHostConfig, + swarmWorkerConfig := &container.Config{ + Image: swarmOptions.Image, + Env: swarmOptions.Env, + Cmd: cmdWorker, } if swarmOptions.IsExperimental { swarmWorkerConfig.Cmd = append([]string{"--experimental"}, swarmWorkerConfig.Cmd...) } - err = mcndockerclient.CreateContainer(dockerHost, swarmWorkerConfig, "swarm-agent") + err = mcndockerclient.CreateContainer(dockerHost, swarmWorkerConfig, workerHostConfig, "swarm-agent") if err != nil { return err }