Unapoamua kuandika baiskeli yako mwenyewe ili kupata kulabu kutoka kwa kitovu cha kizimbani au kutoka kwa rejista ili kusasisha kiotomatiki/kuendesha vyombo kwenye seva, unaweza kupata Docker Cli kuwa muhimu, ambayo itasaidia kudhibiti daemoni ya Docker kwenye mfumo wako.
Ili kufanya kazi utahitaji toleo la Go sio chini ya 1.9.4
Ikiwa bado haujabadilisha moduli, sakinisha Cli kwa amri ifuatayo:
go get github.com/docker/docker/client
Kuendesha chombo
Mfano ufuatao unaonyesha jinsi ya kuendesha chombo kwa kutumia Docker API. Kwenye mstari wa amri ungetumia amri docker run
, lakini tunaweza kukabiliana na kazi hii kwa urahisi katika huduma yetu.
Mfano huu ni sawa na kuendesha amri docker run alpine echo hello world
package main {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
// ΠΠ΅Π»Π°Π΅ΠΌ docker pull
reader, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{})
if err != nil {
panic(err)
}
io.Copy(os.Stdout, reader)
hostBinding := nat.PortBinding{
HostIP: "0.0.0.0",
HostPort: "8000",
}
containerPort, err := nat.NewPort("tcp", "80")
if err != nil {
panic("Unable to get the port")
}
portBinding := nat.PortMap{containerPort: []nat.PortBinding{hostBinding}}
// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ
resp, err := cli.ContainerCreate(ctx, &container.Config{
Image: "alpine",
Cmd: []string{"echo", "hello world"},
Tty: true,
}, &container.HostConfig{
PortBindings: portBinding,
}, nil, "")
if err != nil {
panic(err)
}
// ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
// ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π»ΠΎΠ³ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
if err != nil {
panic(err)
}
io.Copy(os.Stdout, out)
}
Kupata orodha ya vyombo vinavyoendesha
Mfano huu ni sawa na kuendesha amri docker ps
package main
import (
"context"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
func main() {
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° Π·Π°ΠΏΡΡΡΠ΅Π½Π½ΡΡ
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²(docker ps)
containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
if err != nil {
panic(err)
}
// ΠΡΠ²ΠΎΠ΄ Π²ΡΠ΅Ρ
ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²
for _, container := range containers {
fmt.Println(container.ID)
}
}
Kusimamisha vyombo vyote vinavyoendesha
Baada ya kujifunza jinsi ya kuunda na kuendesha vyombo, ni wakati wa kujifunza jinsi ya kuvidhibiti. Mfano ufuatao utasimamisha vyombo vyote vinavyoendesha.
Usikimbilie nambari hii kwenye seva ya uzalishaji!
package main
import (
"context"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
func main() {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° Π·Π°ΠΏΡΡΡΠ΅Π½Π½ΡΡ
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²(docker ps)
containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
if err != nil {
panic(err)
}
for _, c := range containers {
fmt.Print("Stopping container ", c.ID[:10], "... ")
if err := cli.ContainerStop(ctx, c.ID, nil); err != nil {
panic(err)
}
fmt.Println("Success")
}
}
Inaonyesha kumbukumbu za chombo kimoja
Unaweza kufanya kazi na vyombo vya mtu binafsi. Mfano ufuatao unaonyesha kumbukumbu za kontena zilizo na kitambulisho maalum. Kabla ya kuanza, unahitaji kubadilisha kitambulisho cha chombo ambacho magogo unayotaka kupokea.
package main
import (
"context"
"io"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
func main() {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
options := types.ContainerLogsOptions{ShowStdout: true}
// ΠΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ id ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π·Π΄Π΅ΡΡ
out, err := cli.ContainerLogs(ctx, "f1064a8a4c82", options)
if err != nil {
panic(err)
}
io.Copy(os.Stdout, out)
}
Kupata orodha ya picha
Mfano huu ni sawa na kuendesha amri docker image ls
package main
import (
"context"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
func main() {
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° ΠΎΠ±ΡΠ°Π·ΠΎΠ²
images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
if err != nil {
panic(err)
}
for _, image := range images {
fmt.Println(image.ID)
}
}
Kuvuta
Mfano huu ni sawa na kuendesha amri docker pull
package main
import (
"context"
"io"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
func main() {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
// docker pull alpine
out, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{})
if err != nil {
panic(err)
}
defer out.Close()
io.Copy(os.Stdout, out)
}
Inapakua picha na uthibitishaji wa mtumiaji
Mfano huu ni sawa na kuendesha amri docker pull
, pamoja na uthibitishaji.
Data ya uthibitishaji inatumwa kwa maandishi wazi. Usajili rasmi wa docker hutumia HTTPS,
sajili za kibinafsi lazima pia ziwekewe mipangilio ili kuhamisha data kwa kutumia HTTPS.
package main
import (
"context"
"encoding/base64"
"encoding/json"
"io"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
func main() {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³Π° Ρ Π΄Π°Π½Π½ΡΠΌΠΈ Π΄Π»Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
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(ctx, "docker.io/library/alpine", types.ImagePullOptions{RegistryAuth: authStr})
if err != nil {
panic(err)
}
defer out.Close()
io.Copy(os.Stdout, out)
}
Chanzo: mapenzi.com