Giriş
Aşağıdaki docker
VM sürümünü bir VM'de kullanmaya çalışıyorum ( uname -a
döner Linux xen 4.1.17-yocto-standard #1 SMP PREEMPT Thu Jun 2 13:29:47 PDT 2016 x86_64 GNU/Linux)
, docker_git
BitBake tarifinden oluşturulmuş) .
Çalıştırmaya çalışırsam docker version
aşağıdaki çıktıyı alıyorum:
Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.3
Git commit (client): 7c8fca2-dirty
OS/Arch (client): linux/amd64
Sonra komut kilitleniyor.
Nasıl olması gerektiği
docker version
Çalışan bir liman işçisi kurulumunda çalıştırmayı denedim (Ubuntu 14.04) ve aşağıdaki çıktıyı alıyorum:
Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.2.1
Git commit (client): 7c8fca2
OS/Arch (client): linux/amd64
Server version: 1.6.2
Server API version: 1.18
Go version (server): go1.2.1
Git commit (server): 7c8fca2
OS/Arch (server): linux/amd64
Yani, sunucu bilgisi alınırken bir çeşit hata olduğunu farz ediyorum.
Ek araştırma
Go ile aşina değilim, bu yüzden haltların neler olup bittiğini anlamaya çalışırken bu bölüm zorlayıcı olabilir.
api/client/version.go
Docker kaynak kodunun bu bölümüne bakmaya başladım :
var versionTemplate = `Client:
Version: {{.Client.Version}}
API version: {{.Client.APIVersion}}
Go version: {{.Client.GoVersion}}
Git commit: {{.Client.GitCommit}}
Built: {{.Client.BuildTime}}
OS/Arch: {{.Client.Os}}/{{.Client.Arch}}{{if .Client.Experimental}}
Experimental: {{.Client.Experimental}}{{end}}{{if .ServerOK}}
Server:
Version: {{.Server.Version}}
API version: {{.Server.APIVersion}}
Go version: {{.Server.GoVersion}}
Git commit: {{.Server.GitCommit}}
Built: {{.Server.BuildTime}}
OS/Arch: {{.Server.Os}}/{{.Server.Arch}}{{if .Server.Experimental}}
Experimental: {{.Server.Experimental}}{{end}}{{end}}`
bu bölüme devam ediyor:
vd := types.VersionResponse{
Client: &types.Version{
Version: dockerversion.Version,
APIVersion: cli.client.ClientVersion(),
GoVersion: runtime.Version(),
GitCommit: dockerversion.GitCommit,
BuildTime: dockerversion.BuildTime,
Os: runtime.GOOS,
Arch: runtime.GOARCH,
Experimental: utils.ExperimentalBuild(),
},
}
Kimden engine-api/types/client.go
:
// VersionResponse holds version information for the client and the server
type VersionResponse struct {
Client *Version
Server *Version
}
Dolayısıyla bu noktada yapılması gereken tek şey Server
üyeye bir şey atamaktır (tür *Version
). Bu vd
yukarıdan atamanın ardından gelen bölümde gerçekleşir :
serverVersion, err := cli.client.ServerVersion(context.Background())
if err == nil {
vd.Server = &serverVersion
}
İçin işlev tanımı ServerVersion
şudur:engine-api/client/version.go
// ServerVersion returns information of the docker client and server host.
func (cli *Client) ServerVersion(ctx context.Context) (types.Version, error) {
resp, err := cli.get(ctx, "/version", nil, nil)
if err != nil {
return types.Version{}, err
}
var server types.Version
err = json.NewDecoder(resp.body).Decode(&server)
ensureReaderClosed(resp)
return server, err
}
Anladığım kadarıyla, yukarıdaki get
işlev çağrısı noktaları client/request.go
Docker en dan engine API
repo
// getWithContext sends an http request to the docker API using the method GET with a specific go context.
func (cli *Client) get(ctx context.Context, path string, query url.Values, headers map[string][]string) (*serverResponse, error) {
return cli.sendRequest(ctx, "GET", path, query, nil, headers)
}
Nerede:
ctx
dır-dircontext.Background()
path
dır-dir/version
- Hayır
query
- Hayır
headers
Ve bu belgeler sendRequest
arasından vendor/src/google.golang.org/grpc/call.go
:
// sendRequest writes out various information of an RPC such as Context and Message.
func sendRequest(ctx context.Context, codec Codec, callHdr *transport.CallHdr, t transport.ClientTransport, args interface{}, opts *transport.Options) (_ *transport.Stream, err error) {
stream, err := t.NewStream(ctx, callHdr)
if err != nil {
return nil, err
}
defer func() {
if err != nil {
if _, ok := err.(transport.ConnectionError); !ok {
t.CloseStream(stream, err)
}
}
}()
// TODO(zhaoq): Support compression.
outBuf, err := encode(codec, args, compressionNone)
if err != nil {
return nil, transport.StreamErrorf(codes.Internal, "grpc: %v", err)
}
err = t.Write(stream, outBuf, opts)
if err != nil {
return nil, err
}
// Sent successfully.
return stream, nil
}
Bu bir süredir tahminde bulunuldu ve şimdi yanlış yere bakıyor olabileceğimden endişeleniyorum.
Sorular
- Yol açan nedir
docker version
,docker run hello-world
,docker images
,docker ps
, vedocker info
asmak ve nasıl tamir edilebilir? - Veya bu hatanın nedenini incelemenin daha etkili bir yolu var mı?
This package contains the daemon and client. Using docker.io on non-amd64 hosts is not supported at this time.
çok etkileyen şey AMD işlemcide Intel'den çalıştığınızdan emin misiniz?
strace
Sokette dinleyen bir işlem / arka plan programı yapmalısınız /var/run/docker.sock
. Kişisel docker info
sokete ve bir cevap için sonsuza kadar bekledi, ancak sunucu cevap vermedi: "GET /v1.18/info HTTP / 1.1 \ r \ nHost" komutu ile başlayan bir istekte bulundu.