做下记录

网上找了好久关于go docker sdk 使用情况,零零散散拼凑后,记录下完整使用情况。

        用go 写了两个服务 ,现在是使用一个服务启动后,根据消息任务再使用docker run命令拉起另一个镜像服务。 

        系统:ubuntu 22.0.4

1. 先做docker 镜像 ,编写dockerfile  。服务名称 node-manager

FROM golang:alpine as builder
MAINTAINER xxxxxx <xxxxx@i-xxxxx.com>
CMD mkdir /node-manager
COPY node-manager /node-manager
WORKDIR /node-manager
LABEL name=node-manager

RUN chmod +x ./main
CMD ./main -p 8586

2. docker build 打包服务镜像。(需要dockerfile 和node-manager目录同级)

docker build --rm -f dockerfile -t not-manager:last

3. 编写docker-compose.yml ,镜像启动脚本。

 services:
    node-manager:
        image: node-manager:${node_manager}
        container_name: node-manager
        restart: always
        privileged: true
        environment: 
            - DAG_KAFKA_ADDR=192.168.50.201:9092
        volumes:
            - ./logs/nodeManger:/node-manager/logs
            - /var/run/docker.sock:/var/run/docker.sock
            - /usr/bin/docker:/usr/bin/docker
        networks:
            - viid_hf-network
        ports:
            - 8101:8101
          
networks:
    viid_hf-network:
        external: true

注意:这里需要挂载映射docker守护目录以及docker命令执行权限目录

- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker

以上是docker 部署相关内容,下面来看看关于go 调用docker sdk的内容

package main

import (
	"context"
	"github.com/docker/docker/api/types"
	"github.com/docker/docker/api/types/container"
	"github.com/docker/docker/client"
)

func main() {
	// 创建 Docker 客户端
	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
	if err != nil {
		panic(err)
	}

	// 配置容器参数
	config := &container.Config{
		Image:  "node-manager:1.0.13",
		Hostname: "node-manager",
	}

	hostConfig := &container.HostConfig{
		Binds: []string{
			"/var/run/docker.sock:/var/run/docker.sock",
		},
		PortBindings: nat.PortMap{
			"7100/tcp": []nat.PortBinding{
				{
					HostIP:   "0.0.0.0",
					HostPort: "7100",
				},
			},
		},
		NetworkMode: "viid_hf-network",
	}

	// 创建容器
	resp, err := cli.ContainerCreate(context.Background(), config, hostConfig, nil, nil, "node-manager")
	if err != nil {
		panic(err)
	}

	// 启动容器
	err = cli.ContainerStart(context.Background(), resp.ID, types.ContainerStartOptions{})
	if err != nil {
		panic(err)
	}

	// 等待容器退出
	_, err = cli.ContainerWait(context.Background(), resp.ID)
	if err != nil {
		panic(err)
	}

	// 删除容器
	err = cli.ContainerRemove(context.Background(), resp.ID, types.ContainerRemoveOptions{})
	if err != nil {
		panic(err)
	}
}

 这部分代码执行的效果 ,同docker命令 :

docker run --network viid_hf-network -v /var/run/docker.sock:/var/run/docker.sock --name node-manager -h node-manager -p 7100:7100  node-manager:1.0.13

 --network viid_hf-network   是需要映射docker网络

 -v /var/run/docker.sock:/var/run/docker.sock  是映射docker容器内外docker守护

--name 容器名

-h   hostName

-p   docker内外映射端口

这里网络需要映射,不然无法在docker容器内通过地址访问其他服务。

好了就记录到这里

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐