首页>>后端>>Golang->golangdial

golangdial

时间:2023-12-02 本站 点击:0

如何部署 Docker Registry 服务

本节中,将创建一个 Container 来运行 Docker 的官方 Registry 镜像。你将推送(Push)一个镜像到这个 Registry 服务器,然后再从该 Registry 中拉取(Pull)同一个镜像。

这是个很好的练习,有助于理解客户端与本地 Registry 的基本交互。

1、安装 Docker。

2、从 Docker 公共 Registry 中运行 hello-world 镜像。

$ docker run hello-world

run 命令自动从 Docker 的官方镜像库中将 hello-world 镜像 pull 下来。

3、在 localhost 上启动 Registry 服务。

$ docker run -p 5000:5000 registry:2.0

这将在 DOCKER_HOST 上启动一个 Registry 服务,并在 5000 端口监听。

4、列出镜像。

$ docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

registry 2.0 bbf0b6ffe923 3 days ago 545.1 MB

golang 1.4 121a93c90463 5 days ago 514.9 MB

hello-world latest e45a5af57b00 3 months ago 910 B

这个列表应当包括一个由先前运行而得来的 hello-world 镜像。

5、为本地 repoistory 重新标记 hello-world 镜像。

$ docker tag hello-world:latest localhost:5000/hello-mine:latest

此命令使用 [REGISTRYHOST/]NAME[:TAG] 格式为 hello-world:latest 重新打标。REGISTRYHOST在此例中是 localhost。在 Mac OSX 环境中,得把 localhost 换成 $(boot2docker ip):5000。

6、列出新镜像。

$ docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

registry 2.0 bbf0b6ffe923 3 days ago 545.1 MB

golang 1.4 121a93c90463 5 days ago 514.9 MB

hello-world latest e45a5af57b00 3 months ago 910 B

localhost:5000/hello-mine latest ef5a5gf57b01 3 months ago 910 B

可以看到,新镜像已经出现在列表中。

7、推送新镜像到本地 Registry 中。

$ docker push localhost:5000/hello-mine:latest

The push refers to a repository [localhost:5000/hello-mine] (len: 1)

e45a5af57b00: Image already exists

31cbccb51277: Image successfully pushed

511136ea3c5a: Image already exists

Digest: sha256:a1b13bc01783882434593119198938b9b9ef2bd32a0a246f16ac99b01383ef7a

8、使用 curl 命令及 Docker Registry 服务 API v2 列出 Registry 中的镜像:

$ curl -v -X GET * Hostname was NOT found in DNS cache

* Trying 127.0.0.1...* Connected to localhost (127.0.0.1) port 5000 (#0) GET /v2/hello-mine/tags/list HTTP/1.1 User-Agent: curl/7.35.0 Host: localhost:5000 Accept: */*

HTTP/1.1 200 OK

Content-Type: application/json; charset=utf-8

Docker-Distribution-Api-Version: registry/2.0

Date: Sun, 12 Apr 2015 01:29:47 GMT

Content-Length: 40

{"name":"hello-mine","tags":["latest"]}

* Connection #0 to host localhost left intact

也可以通过在浏览器中访问以下地址来获取这些信息:

9、从你的本地环境中移除所有未使用的镜像:

$ docker rmi -f $(docker images -q -a )

此命令仅用于说明目的;移除镜像强制 run 从 Registry 而不是从本地缓存拉取。如果在这之后运行docker images,在你的镜像列表中,应该看不到任何 hello-world 或 hello-mine 的实例。

$ docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

registry 2.0 bbf0b6ffe923 3 days ago 545.1 MB

golang 1.4 121a93c90463 5 days ago 514.9 MB

10、试运行 hello-mine。

$ docker run hello-mine

Unable to find image 'hello-mine:latest' locally

Pulling repository hello-mine

FATA[0001] Error: image library/hello-mine:latest not found

命令 run 运行失败,因为你的新镜像在 Docker 公共 Registry 中是不存在的。

11、现在,尝试指定镜像的 Registry 来运行镜像:

$ docker run localhost:5000/hello-mine

如果你在这之后运行 docker images, 你会发现里面多了一个 hello-mine 的实例。

使 Docker 官方 Registry 镜像做好生产环境准备

Docker 的官方镜像只为简单的测试或除错准备。其配置对多数生产环境来讲都不适用。例如,任何能访问服务器 IP 的客户端,都能推送及拉取镜像。参看下一节,获取使该镜像做好生产环境准备的信息。

理解生产环境的部署

当部署一个用于生产环境发布的 Registry 时,须考虑如下因素:

BACKEND STORAGE 应在何处存储镜像?

ACCESS AND/OR AUTHENTICATION 用户是否应拥有全部或受控的访问权限?这取决于你为公众提供镜像服务,还是只为公司内部提供。

DEBUGGING 当问题或状况发生时,是否有解决这些它们的方法。日志由于可以看到问题动向,这使其很有用。

CACHING 快速提取镜像可能至关重要,如果依赖镜像进行测试、构建,或有其他自动化系统的话。

我们可以配置 Registry 功能特性,用以调整适配这些因素。可以在命令行里指定选项来干这个,或者更通常地,用一个 Registry 配置文件来完成此事。配置文件是 YAML 格式的。

Docker 的官方 Repository 镜像用以下配置文件做了预置:

version: 0.1

log:

level: debug

fields:

service: registry

environment: development

storage:

cache:

layerinfo: inmemory

filesystem:

rootdirectory: /tmp/registry-dev

http:

addr: :5000

secret: asecretforlocaldevelopment

debug:

addr: localhost:5001

redis:

addr: localhost:6379

pool:

maxidle: 16

maxactive: 64

idletimeout: 300s

dialtimeout: 10ms

readtimeout: 10ms

writetimeout: 10ms

notifications:

endpoints:

- name: local-8082

url:

headers:

Authorization: [Bearer an example token]

timeout: 1s

threshold: 10

backoff: 1s

disabled: true

- name: local-8083

url:

timeout: 1s

threshold: 10

backoff: 1s

disabled: true

这个配置非常基本,可以看到这在生产环境下会有一些问题。例如,http 区块详述了运行 Registry 的主机的 HTTP 服务器配置,但服务器没有使用甚至是最低要求的传输层安全性(TLS)配置。接下来我们将配置这些东西。

socket 通信粘包怎么处理

一、socket 通信粘包的处理方法:

1、对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;

2、对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;

3、由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。

二、实现代码:

三、方法注意事项:

1、第一种编程设置方法虽然可以避免发送方引起的粘包,但它关闭了优化算法,降低了网络发送效率,影响应用程序的性能,一般不建议使用。

2、第二种方法只能减少出现粘包的可能性,但并不能完全避免粘包,当发送频率较高时,或由于网络突发可能使某个时间段数据包到达接收方较快,接收方还是有可能来不及接收,从而导致粘包;

3、第三种方法虽然避免了粘包,但应用程序的效率较低,对实时应用的场合不适合。

四、实验环境

1、硬件环境:服务器:pentium 350 微机 、客户机:pentium 166微机、网络平台:由10兆共享式hub连接而成的局域网;

2、软件环境:操作系统:windows 98 、编程语言:visual c++ 5.0

如何使用Go语言实现远程执行命令

一般命令

所谓一般命令,就是在一定时间内会执行完的命令。比如 grep, cat 等等。 执行命令的步骤是:连接,执行,获取结果

连接

连接包含了认证,可以使用 password 或者 sshkey 2种方式来认证。下面的示例为了简单,使用了密码认证的方式来完成连接。

import (

"fmt"

"time"

"golang.org/x/crypto/ssh"

)

func connect(user, password, host string, port int) (*ssh.Session, error) {

var (

auth []ssh.AuthMethod

addr string

clientConfig *ssh.ClientConfig

client *ssh.Client

session *ssh.Session

err error

)

// get auth method

auth = make([]ssh.AuthMethod, 0)

auth = append(auth, ssh.Password(password))

clientConfig = ssh.ClientConfig{

User: user,

Auth: auth,

Timeout: 30 * time.Second,

}

// connet to ssh

addr = fmt.Sprintf("%s:%d", host, port)

if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {

return nil, err

}

// create session

if session, err = client.NewSession(); err != nil {

return nil, err

}

return session, nil

}

连接的方法很简单,只要提供登录主机的 用户*, *密码*, *主机名或者IP*, *SSH端口

执行,命令获取结果

连接成功后,执行命令很简单

import (

"fmt"

"log"

"os"

"time"

"golang.org/x/crypto/ssh"

)

func main() {

session, err := connect("root", "xxxxx", "127.0.0.1", 22)

if err != nil {

log.Fatal(err)

}

defer session.Close()

session.Run("ls /; ls /abc")

}

上面代码运行之后,虽然命令正常执行了,但是没有正常输出的结果,也没有异常输出的结果。 要想显示结果,需要将 session 的 Stdout 和 Stderr 重定向 修改 func main 为如下:

func main() {

session, err := connect("root", "xxxxx", "127.0.0.1", 22)

if err != nil {

log.Fatal(err)

}

defer session.Close()

session.Stdout = os.Stdout

session.Stderr = os.Stderr

session.Run("ls /; ls /abc")

}

这样就能在屏幕上显示正常,异常的信息了。

交互式命令

上面的方式无法远程执行交互式命令,比如 top , 远程编辑一个文件,比如 vi /etc/nginx/nginx.conf 如果要支持交互式的命令,需要当前的terminal来接管远程的 PTY。

func main() {

session, err := connect("root", "olordjesus", "dockers.iotalabs.io", 2210)

if err != nil {

log.Fatal(err)

}

defer session.Close()

fd := int(os.Stdin.Fd())

oldState, err := terminal.MakeRaw(fd)

if err != nil {

panic(err)

}

defer terminal.Restore(fd, oldState)

// excute command

session.Stdout = os.Stdout

session.Stderr = os.Stderr

session.Stdin = os.Stdin

termWidth, termHeight, err := terminal.GetSize(fd)

if err != nil {

panic(err)

}

// Set up terminal modes

modes := ssh.TerminalModes{

ssh.ECHO: 1, // enable echoing

ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud

ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud

}

// Request pseudo terminal

if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil {

log.Fatal(err)

}

session.Run("top")

}

我正在学习Go语言网络编程部分,太抽象了有点看不懂啊,哪位大神能够通俗易懂给我解释下这个代码的意思啊

本质上,是作为文件处理的,发送是“write,print”,接受是“read”。

连接相当于打开文件。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Golang/10062.html