go -- go 程序 启动docker容器
package main import (
"io"
"log"
"os"
"time" "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/mount"
"github.com/docker/docker/client"
"github.com/docker/go-connections/nat"
"golang.org/x/net/context"
) const (
imageName string = "my-gin:latest" //镜像名称
containerName string = "mygin-latest" //容器名称
indexName string = "/" + containerName //容器索引名称,用于检查该容器是否存在是使用
cmd string = "./ginDocker2" //运行的cmd命令,用于启动container中的程序
workDir string = "/go/src/ginDocker2" //container工作目录
openPort nat.Port = "7070" //container开放端口
hostPort string = "7070" //container映射到宿主机的端口
containerDir string = "/go/src/ginDocker2" //容器挂在目录
hostDir string = "/home/youngblood/Go/src/ginDocker2" //容器挂在到宿主机的目录
n int = 5 //每5s检查一个容器是否在运行 ) func main() {
ctx := context.Background()
cli, err := client.NewEnvClient()
defer cli.Close()
if err != nil {
panic(err)
}
checkAndStartContainer(ctx, cli)
} //创建容器
func createContainer(ctx context.Context, cli *client.Client) {
//创建容器
cont, err := cli.ContainerCreate(ctx, &container.Config{
Image: imageName, //镜像名称
Tty: true, //docker run命令中的-t选项
OpenStdin: true, //docker run命令中的-i选项
Cmd: []string{cmd}, //docker 容器中执行的命令
WorkingDir: workDir, //docker容器中的工作目录
ExposedPorts: nat.PortSet{
openPort: struct{}{}, //docker容器对外开放的端口
},
}, &container.HostConfig{
PortBindings: nat.PortMap{
openPort: []nat.PortBinding{nat.PortBinding{
HostIP: "0.0.0.0", //docker容器映射的宿主机的ip
HostPort: hostPort, //docker 容器映射到宿主机的端口
}},
},
Mounts: []mount.Mount{ //docker 容器目录挂在到宿主机目录
mount.Mount{
Type: mount.TypeBind,
Source: hostDir,
Target: containerDir,
},
},
}, nil, containerName)
if err == nil {
log.Printf("success create container:%s\n", cont.ID)
} else {
log.Println("failed to create container!!!!!!!!!!!!!")
}
} //启动容器
func startContainer(ctx context.Context, containerID string, cli *client.Client) error {
err := cli.ContainerStart(ctx, containerID, types.ContainerStartOptions{})
if err == nil {
log.Printf("success start container:%s\n", containerID)
} else {
log.Printf("failed to start container:%s!!!!!!!!!!!!!\n", containerID)
}
return err
} //将容器的标准输出输出到控制台中
func printConsole(ctx context.Context, cli *client.Client, id string) {
//将容器的标准输出显示出来
out, err := cli.ContainerLogs(ctx, id, types.ContainerLogsOptions{ShowStdout: true})
if err != nil {
panic(err)
}
io.Copy(os.Stdout, out) //容器内部的运行状态
status, err := cli.ContainerStats(ctx, id, true)
if err != nil {
panic(err)
}
io.Copy(os.Stdout, status.Body)
} //检查容器是否存在并启动容器
func checkAndStartContainer(ctx context.Context, cli *client.Client) {
for {
select {
case <-isRuning(ctx, cli):
//该container没有在运行
//获取所有的container查看该container是否存在
contTemp := getContainer(ctx, cli, true)
if contTemp.ID == "" {
//该容器不存在,创建该容器
log.Printf("the container name[%s] is not exists!!!!!!!!!!!!!\n", containerName)
createContainer(ctx, cli)
} else {
//该容器存在,启动该容器
log.Printf("the container name[%s] is exists\n", containerName)
startContainer(ctx, contTemp.ID, cli)
} }
}
} //获取container
func getContainer(ctx context.Context, cli *client.Client, all bool) types.Container {
containerList, err := cli.ContainerList(ctx, types.ContainerListOptions{All: all})
if err != nil {
panic(err)
}
var contTemp types.Container
//找出名为“mygin-latest”的container并将其存入contTemp中
for _, v1 := range containerList {
for _, v2 := range v1.Names {
if v2 == indexName {
contTemp = v1
break
}
}
}
return contTemp
} //容器是否正在运行
func isRuning(ctx context.Context, cli *client.Client) <-chan bool {
isRun := make(chan bool)
var timer *time.Ticker
go func(ctx context.Context, cli *client.Client) {
for {
//每n s检查一次容器是否运行 timer = time.NewTicker(time.Duration(n) * time.Second)
select {
case <-timer.C:
//获取正在运行的container list
log.Printf("%s is checking the container[%s]is Runing??", os.Args[0], containerName)
contTemp := getContainer(ctx, cli, false)
if contTemp.ID == "" {
log.Print(":NO")
//说明container没有运行
isRun <- true
} else {
log.Print(":YES")
//说明该container正在运行
go printConsole(ctx, cli, contTemp.ID)
}
} }
}(ctx, cli)
return isRun
}
go -- go 程序 启动docker容器的更多相关文章
- Centos 配置开机启动脚本启动 docker 容器
Centos 配置开机启动脚本启动 docker 容器 Intro 我们的 Centos 服务器上部署了好多个 docker 容器,因故重启的时候就会导致还得手动去手动重启这些 docker 容器,为 ...
- 启动Docker容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动. 因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器. 新建并 ...
- 启动docker容器时的Error response from daemon: devmapper: Error mounting: invalid argument. 错误解决
错误出现 在一台物理机重启后,以前创建的容器无法启动了.一启动,则会报出错误. [root@217TN1V ~]# docker start e7e Error response from daemo ...
- 启动 docker 容器时报错
错误信息: iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9300 -j DNAT --to-dest ...
- 启动docker容器 防火墙问题报错 ! -i docker0' failed: iptables: No chain/target/match by that name.
COMMAND_FAILED: '/sbin/iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 8111 -j DNAT --to-destination ...
- windows上启动docker容器报错:standard_init_linux.go:211: exec user process caused “no such file or directory” - Docker
解决方案: standard_init_linux.go:190: exec user process caused "no such file or directory" - D ...
- Docker容器运行GUI程序的配置方法
0.环境说明 Ubuntu 16.04 docker 1.35 1.Docker的“可视化” Docker本身的工作模式是命令行的,因为主要的使用场景可能是做服务器后端方面的比较多. 但有时候我们会有 ...
- docker容器安装及使用技巧
关于docker前言 A)首先是关于虚拟化 虚拟化我们可以简单的理解为一种资源管理方式.有如下几种虚拟化的方式: 1.完全虚拟化:对底层硬件实现完全的虚拟.例如:Vmware Workstation ...
- 在Windows上弄一个redis的docker容器
[本文出自天外归云的博客园] Docker核心概念简介 镜像是一个面向docker引擎的只读模板,包含了文件系统. 镜像是创建容器的基础,容器类似于一个沙箱,用来运行和隔离应用. 容器是从镜像创建的应 ...
随机推荐
- 【TBarCode SDK教程】TBarCode SDK 如何在 Microsoft Office 中工作?
使用条形码软件组件 TBarCode SDK,你可以在 Microsoft Office 中快速且简便地创建各种条形码.都不需要任何编程的技巧,只需要点击几次鼠标就可以将TBarCode SDK集成到 ...
- 知识扩展——(转)一篇文章彻底弄懂Base64编码原理
在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. 一.Base64的由来 目前Base64已经成 ...
- day 04 预科
目录 变量 什么是变量 变量的组成 变量名的命名规范 注释 单行注释 多行注释 turtle库的使用 今日内容 数据类型基础 变量 具体的值 存不是目的,取才是目的 为了描述世界万物的状态,因此有了数 ...
- 【robotframework】pycharm+robotframe
一.环境搭建 二.框架介绍 1.settings 是这个测试套件的全局配置表 说明这个测试套件要使用的测试库.资源文件 测试套件的环境初始化(setup)和清除(teardown) 该套件内的标签等 ...
- ubuntu16.04+GTX2080Ti+torch7安装记录
环境说明 ubuntu16.04 cuda10.0 2080Ti显卡 拉取代码和修改编译脚本 拉取代码 用户先clone代码: git clone https://github.com/torch/d ...
- TensorFlow 2 快速教程,初学者入门必备
TensorFlow 2 简介 TensorFlow 是由谷歌在 2015 年 11 月发布的深度学习开源工具,我们可以用它来快速构建深度神经网络,并训练深度学习模型.运用 TensorFlow 及其 ...
- 使用flannel+canal实现k8s的NetworkPolicy
目录 1.NetworkPolicy概述 2.NetworkPolicy策略模型 3.NetworkPolicy默认策略 4.NetworkPolicy的实现 5.使用flannel+canal实现k ...
- 【Selenium-WebDriver实战篇】Java丨验证码图片去除干扰像素,方便验证码的识别(转)
参考地址:https://www.cnblogs.com/haojieli/p/6212627.html 1.先来看看效果: 原图 除去干扰像素后 2.解析代码: 1).读取文件夹里面的图片 1 St ...
- hdu4767 Bell——求第n项贝尔数
题意 设第 $n$ 个Bell数为 $B_n$,求 $B_n \ mod \ 95041567$.($1 \leq n \leq 2^{31}$) 分析 贝尔数的概念和性质,维基百科上有,这里 ...
- SQL SERVER错误:已超过了锁请求超时时段。
问题:远程连接数据库,无法打开视图,报错:SQL SERVER错误:已超过了锁请求超时时段. (Microsoft SQL Server,错误: 1222) 执行语句获取进程id select * f ...