github.com/docker/docker
https://docs.docker.com/engine/api/sdk
实例: https://docs.docker.com/engine/api/sdk/examples/
vim /usr/lib/systemd/system/docker.service
在[Service]部分,修改ExecStart参数,在最后增加-H tcp://0.0.0.0:2375
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
systemctl daemon-reload && systemctl restart docker
如果不能访问,可能是因为防火墙的原因,所以开放防火墙2357端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --r
Docker开启远程安全访问 请参考 https://blog.csdn.net/yuntiank/article/details/116520114
Docker 开启远程安全访问(脚本生成配置) 请参考 https://blog.csdn.net/cszzboy/article/details/123552589
package main
import (
"context"
"encoding/base64"
"encoding/json"
"io"
"log"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/client"
"github.com/docker/docker/pkg/stdcopy"
)
func main(){
case1()
case2()
case3()
case4()
case5()
}
// docker 客户端
func Client() *client.Client {
// 获取docker镜像列表
//cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) // 连接本地的docker
// 连接 开启了远程访问的docker
cli, err := client.NewClientWithOpts(client.WithHost("tcp://192.168.0.9:2375"), client.WithAPIVersionNegotiation())
// 连接 开启了远程访问的docker, 旧方法,已经弃用
//cli, err := client.NewClient("tcp://127.0.0.1:2375", "1.40", nil, nil)
if err != nil {
log.Println(err)
os.Exit(0)
}
return cli
}
// docker image ls
func case1(){
cli := Client()
images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
if err != nil {
log.Println(err)
os.Exit(0)
}
var imagesLib []string
for _, image := range images {
log.Println("image = ", image)
log.Println("_______________\n\n")
imagesLib = append(imagesLib, image.RepoTags[0])
}
log.Println(imagesLib)
}
// docker ps
func case2(){
cli := Client()
containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
if err != nil {
panic(err)
}
for _, container := range containers {
log.Print("container = ", container)
log.Println("_______________\n\n")
// 停止所有容器
//if err := cli.ContainerStop(context.Background(), container.ID, nil); err != nil {
// panic(err)
//}
}
}
// 运行一个容器
// docker run
func case3(){
cli := Client()
// 拉镜像
reader, err := cli.ImagePull(context.Background(), "docker.io/library/alpine", types.ImagePullOptions{})
if err != nil {
panic(err)
}
defer reader.Close()
io.Copy(os.Stdout, reader)
/*
container.Config:
Hostname string // 主机名
Domainname string // 域名
User string // 将在容器内运行命令的用户,还支持User:group
AttachStdin bool // 附加标准输入,实现用户交互
AttachStdout bool // 附加标准输出
AttachStderr bool // 附加标准误差
ExposedPorts nat.PortSet `json:",omitempty"` //暴露端口列表
Tty bool // 将标准流附加到Tty,如果Tty未关闭,则包括stdin。
OpenStdin bool // Open stdin
StdinOnce bool // 如果为true,请在连接的1个客户端断开连接后关闭stdin。
Env []string // 要在容器中设置的环境变量列表
Cmd strslice.StrSlice // 启动容器时要运行的命令
Healthcheck *HealthConfig `json:",omitempty"` // Healthcheck描述了如何检查容器是否健康
ArgsEscaped bool `json:",omitempty"` // True,如果命令已转义(意味着将其视为命令行)(特定于Windows)。
Image string // 操作传递的镜像的名称(例如,可以是符号)
Volumes map[string]struct{} // 用于容器的卷(装载)列表
WorkingDir string // 将启动命令中的当前目录(PWD)
Entrypoint strslice.StrSlice // 启动容器时要运行的入口点
NetworkDisabled bool `json:",omitempty"` // 已禁用网络
MacAddress string `json:",omitempty"` // 容器的Mac地址
OnBuild []string // image Dockerfile上定义的OnBuild元数据
Labels map[string]string // 设置到此容器的标签列表
StopSignal string `json:",omitempty"` // 停止容器的信号
StopTimeout *int `json:",omitempty"` // 停止容器的超时(秒)
Shell strslice.StrSlice `json:",omitempty"` // Shell表示RUN的Shell形式,CMD,ENTRYPOINT
*/
/*
container.HostConfig:
Binds []string // 此容器的卷绑定列表
ContainerIDFile string // 写入containerId的文件(路径)
LogConfig LogConfig // 此容器的日志配置
NetworkMode NetworkMode // 用于容器的网络模式
PortBindings nat.PortMap // 暴露端口(容器)和主机之间的端口映射
RestartPolicy RestartPolicy // 用于容器的重新启动策略
AutoRemove bool // 退出时自动删除容器
VolumeDriver string // 用于装载卷的卷驱动程序的名称
VolumesFrom []string // 从其他容器获取的卷列表
// Applicable to UNIX platforms
CapAdd strslice.StrSlice // 要添加到容器的内核功能列表
CapDrop strslice.StrSlice // 要从容器中删除的内核功能列表
CgroupnsMode CgroupnsMode // 用于容器的Cgroup命名空间模式
DNS []string `json:"Dns"` // 要查找的DNS服务器列表
DNSOptions []string `json:"DnsOptions"` // 要查找的DNS选项列表
DNSSearch []string `json:"DnsSearch"` // 要查找的DNS搜索列表
ExtraHosts []string // 额外主机列表
GroupAdd []string // 容器进程将作为其运行的其他组的列表
IpcMode IpcMode // 用于容器的IPC命名空间
Cgroup CgroupSpec // 用于容器的Cgroup
Links []string // 链接列表(名称:alias form)
OomScoreAdj int // OOM-killing的容器偏好
PidMode PidMode // 用于容器的PID命名空间
Privileged bool // 容器是否处于特权模式
PublishAllPorts bool // docker是否应该发布容器的所有暴露端口
ReadonlyRootfs bool // 容器根文件系统是只读的吗
SecurityOpt []string // 用于自定义MLS系统(如SELinux)标签的字符串值列表。
StorageOpt map[string]string `json:",omitempty"` // 每个容器的存储驱动程序选项。
Tmpfs map[string]string `json:",omitempty"` // 用于集装箱的tmpfs(支架)列表
UTSMode UTSMode // 用于容器的UTS命名空间
UsernsMode UsernsMode // 用于容器的用户命名空间
ShmSize int64 // shm内存使用总量
Sysctls map[string]string `json:",omitempty"` // 用于容器的命名空间sysctl列表
Runtime string `json:",omitempty"` // 与此容器一起使用的运行时
// Applicable to Windows
ConsoleSize [2]uint // 初始控制台尺寸(高度、宽度)
Isolation Isolation // 容器的隔离技术(例如默认、hyperv)
// 包含容器的资源(cgroup、ulimit)
Resources
// 安装容器使用的规格
Mounts []mount.Mount `json:",omitempty"`
// MaskedPaths是容器内要屏蔽的路径列表(这将覆盖默认路径集)
MaskedPaths []string
// ReadonlyPaths是要在容器内设置为只读的路径列表(这将覆盖默认路径集)
ReadonlyPaths []string
// 在容器内运行自定义init,如果为null,则使用守护进程的配置设置
Init *bool `json:",omitempty"`
*/
/*
network.NetworkingConfig:
EndpointsConfig map[string]*EndpointSettings // 为每个连接网络配置端点
*/
/*
specs.Platform:
// 架构字段指定CPU架构,例如
// `amd64` or `ppc64`.
Architecture string `json:"architecture"`
// 操作系统指定操作系统,例如“linux”或“windows”。
OS string `json:"os"`
// OSVersion是一个可选字段,用于指定操作系统
// 版本,例如在Windows“10.0.14393.1066”上。
OSVersion string `json:"os.version,omitempty"`
// OSFeatures是一个可选字段,用于指定字符串数组,
// 每个都列出了所需的操作系统功能(例如在Windows“win32k”上).
OSFeatures []string `json:"os.features,omitempty"`
// 变量是一个可选字段,用于指定CPU的变量
// 示例“v7”用于在体系结构为“arm”时指定ARMv7。
Variant string `json:"variant,omitempty"`
*/
// 创建容器
resp, err := cli.ContainerCreate(context.Background(), &container.Config{
Image: "alpine",
Cmd: []string{"echo", "hello world"},
Tty: false,
}, nil, nil, nil, "")
if err != nil {
panic(err)
}
// 启动容器
if err := cli.ContainerStart(context.Background(), resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
// 监听容器状态
statusCh, errCh := cli.ContainerWait(context.Background(), resp.ID, container.WaitConditionNotRunning)
select {
case err := <-errCh:
if err != nil {
panic(err)
}
case <-statusCh:
}
// 获取容器日志
out, err := cli.ContainerLogs(context.Background(), resp.ID, types.ContainerLogsOptions{ShowStdout: true})
if err != nil {
panic(err)
}
stdcopy.StdCopy(os.Stdout, os.Stderr, out)
}
// docker pull
// 通过身份验证拉取图像
func case4(){
cli := Client()
authConfig := types.AuthConfig{
Username: "username",
Password: "password",
}
encodedJSON, err := json.Marshal(authConfig)
if err != nil {
panic(err)
}
authStr := base64.URLEncoding.EncodeToString(encodedJSON)
out, err := cli.ImagePull(context.Background(), "alpine", types.ImagePullOptions{RegistryAuth: authStr})
if err != nil {
panic(err)
}
defer out.Close()
io.Copy(os.Stdout, out)
}
// docker push
func case5(){
cli := Client()
createResp, err := cli.ContainerCreate(context.Background(), &container.Config{
Image: "alpine",
Cmd: []string{"touch", "/helloworld"},
}, nil, nil, nil, "")
if err != nil {
panic(err)
}
if err := cli.ContainerStart(context.Background(), createResp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
statusCh, errCh := cli.ContainerWait(context.Background(), createResp.ID, container.WaitConditionNotRunning)
select {
case err := <-errCh:
if err != nil {
panic(err)
}
case <-statusCh:
}
commitResp, err := cli.ContainerCommit(context.Background(), createResp.ID, types.ContainerCommitOptions{Reference: "helloworld"})
if err != nil {
panic(err)
}
log.Println(commitResp.ID)
}
// 远程 ssh连接
// 如果有报错 exec /usr/lib/ssh/ssh-askpass : No such file or directory error.
// 安装 ssh-askpass
// sudo apt-get autoremove openssh-client
// sudo apt-get install openssh-client openssh-sftp-server openssh-server ssh
// sudo apt-get install ssh-askpass
func case6(){
helper, err := connhelper.GetConnectionHelper("ssh://root@192.168.0.192:22")
if err != nil {
log.Println(err)
return
}
httpClient := &http.Client{
Transport: &http.Transport{
DialContext: helper.Dialer,
},
}
cl, err := client.NewClientWithOpts(
client.WithHTTPClient(httpClient),
client.WithHost(helper.Host),
client.WithDialContext(helper.Dialer),
)
if err != nil {
log.Println("Unable to create docker client")
panic(err)
}
log.Println(cl.ImageList(context.Background(), types.ImageListOptions{}))
}
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],
我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源