go docker sdk 调用运行docker内其他镜像服务
go docker sdk 调用其他镜像服务
·
做下记录
网上找了好久关于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容器内通过地址访问其他服务。
好了就记录到这里
更多推荐
已为社区贡献2条内容
所有评论(0)