=====
/* @Time : 2020/4/25 22:10 @Author : chenhao */ package controllers import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/swarm" docker "github.com/fsouza/go-dockerclient" //docker "github.com/fsouza/go-dockerclient" )
func CreateService() {
replicas := uint64(3)
serviceOptions := docker.CreateServiceOptions{
Auth: docker.AuthConfiguration{},
ServiceSpec: swarm.ServiceSpec{
Annotations: swarm.Annotations{
Name: "test-nginx", // service name
Labels: nil,
},
TaskTemplate: swarm.TaskSpec{ // TaskTemplate定義了在編排此服務時服務應如何構造新任務
ContainerSpec: &swarm.ContainerSpec{ // 與PluginSpec一起指定時無效。
Image: "nginx:1.17", // images:tag
Labels: nil, // 用戶定義的鍵/值數據。
Command: []string{}, // The command to be run in the image.
Args: nil, // Arguments to the command
Hostname: "", // 用於容器的主機名。這必須是有效的RFC 1123主機名
Env: []string{}, // 環境變量: A list of environment variables in the form VAR=value
Dir: "", // 運行命令的工作目錄: The working directory for commands to run in.( 。)
User: "", // 用於指定容器內的用戶
Groups: nil, // 容器進程將作為其運行的其他組的列表。: A list of additional groups that the container process will run as.
Privileges: &swarm.Privileges{
CredentialSpec: &swarm.CredentialSpec{
// CredentialSpec.File和CredentialSpec.Registry是互斥的
Config: "",
File: "", // 從此文件加載憑據規范。該文件由守護程序讀取,並且必須存在於docker數據目錄的CredentialSpecs子目錄中,該目錄在Windows上默認為C:\ProgramData\Docker\, 例如,指定spec.json將加載C:\ProgramData\Docker\CredentialSpecs\spec.json
Registry: "", // 從Windows注冊表中的該值加載憑據規范。指定的注冊表值必須位於 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs
}, // 托管服務帳戶的CredentialSpec(僅Windows)
SELinuxContext: &swarm.SELinuxContext{
Disable: false, // 禁用SELinux
User: "", // SELinux用戶標簽
Role: "", // SELinux角色標簽
Type: "", // SELinux類型標簽
Level: "", // SELinux級別標簽
}, // 容器的SELinux標簽
}, // 容器的安全性選項
Init: nil,
StopSignal: "", // 停止容器的信號
TTY: true, // 是否應分配偽TTY
OpenStdin: false, // Open stdin
ReadOnly: false, // 將容器的根文件系統掛載為只讀。
Mounts: []mount.Mount{ // 要添加到作為 服務一部分 創建的容器中的 掛載的規范。
mount.Mount{
//bind將主機上的文件或目錄掛載到容器中。在創建容器之前必須存在。
//volume用給定的名稱和選項創建一個卷(或使用具有相同名稱和選項的現有卷)。刪除容器時不會刪除這些內容。
//tmpfs使用給定的選項創建一個tmpfs。無法為tmpfs指定安裝源。
Type: "", // 掛載類型 Enum: bind, volume, tmpfs, npipe
Source: "", // 宿主機路徑,掛載源(例如卷名,主機路徑)。注意:每個節點機器都要存在這個路徑,
Target: "", // 容器路徑
ReadOnly: false, // 掛載是否為只讀。
Consistency: "", // 掛載的一致性要求:默認,一致,緩存或委托
BindOptions: &mount.BindOptions{
Propagation: "", // 綁定類型的可選配置,Enum: private, rprivate, shared, rshared, slave, rslave 值為[r] private,[r] shared或[r] slave的傳播模式。
NonRecursive: false,
},
VolumeOptions: &mount.VolumeOptions{
NoCopy: false, // 用目標數據填充volume
Labels: nil, // 用戶定義的鍵/值元數據
DriverConfig: &mount.Driver{
Name: "", // 用於創建卷的驅動程序的名稱
Options: nil, // 驅動程序特定選項的鍵/值映射
}, // 驅動程序特定選項的map
}, // 卷類型的可選配置
TmpfsOptions: &mount.TmpfsOptions{
SizeBytes: 0, // tmpfs的許可模式以整數形式掛載。
Mode: 0, // tmpfs的大小以字節為單位。
}, // tmpfs類型的可選配置
},
},
StopGracePeriod: nil, // 在強行殺死容器之前等待容器終止的時間。
Healthcheck: &container.HealthConfig{ // 進行檢查容器是否健康的測試。
// TEST:要執行的測試。可能的值為:
// - [] 從image或父image繼承健康檢查
// - ["NONE"] 禁用健康檢查
// - ["CMD", args...] 直接執行參數
// - ["CMD-SHELL", command] 使用系統的默認shell運行命令
Test: nil,
Interval: 0, // 兩次檢查之間等待的時間(以納秒為單位)。它應該是0或至少1000000(1 ms)。 0表示默認。
Timeout: 0, // 在考慮將check掛起之前需要等待的時間。它應該是0或至少1000000(1 ms)。 0表示默認
StartPeriod: 0, // 開始運行狀況重試倒計時之前,容器初始化的開始時間(以納秒為單位)。它應該是0或至少1000000(1 ms)。 0表示默認。
Retries: 0, // 認為容器不健康所需的連續失敗次數。 0表示默認。
}, // 進行檢查容器是否健康的測試
Hosts: nil, // 要添加到容器的主機文件中的主機名/ IP映射的列表。額外主機的格式在hosts(5)手冊頁中指定:http://man7.org/linux/man-pages/man5/hosts.5.html
Configs: nil, // 配置包含對將向服務公開的零個或多個配置的引用: Configs contains references to zero or more configs that will be exposed to the service.
Isolation: "",
Sysctls: nil,
Capabilities: nil,
DNSConfig: nil,
Secrets: nil,
},
PluginSpec: nil, // 與ContainerSpec一起指定時無效。 (僅實驗性發行。)
NetworkAttachmentSpec: nil,
Resources: &swarm.ResourceRequirements{
Limits: &swarm.Resources{
NanoCPUs: 0,
MemoryBytes: 0,
GenericResources: []swarm.GenericResource{
swarm.GenericResource{
NamedResourceSpec: &swarm.NamedGenericResource{
Kind: "",
Value: "",
},
DiscreteResourceSpec: &swarm.DiscreteGenericResource{
Kind: "",
Value: 0,
},
},
}, // 用戶定義的資源可以是整數資源(例如SSD = 3)或字符串資源(例如GPU = UUID1)
}, // 一個對象,描述可以由節點發布並由任務請求的資源
Reservations: nil, // 一個對象,描述可以由節點發布並由任務請求的資源.參考Limits
}, // 資源要求適用於作為服務的一部分創建的每個單獨的容器。
RestartPolicy: &swarm.RestartPolicy{
Condition: "", // 重新啟動的條件 Enum: none, on-failure, any
Delay: nil, // 重新啟動嘗試之間的延遲
MaxAttempts: nil, // 放棄之前最大嘗試重新啟動給定容器的次數(默認值為0,將被忽略)
Window: nil, // Windows是用於評估重新啟動策略的時間窗口(默認值為0,它是無界的)
}, // 重新啟動策略的規范,該策略適用於作為此服務的一部分創建的容器。
Placement: nil,
Networks: nil,
LogDriver: &swarm.Driver{
Name: "",
Options: nil,
}, // 指定用於根據此規范創建的任務的日志驅動程序。如果不存在,則將使用swarm群集的默認值,如果未指定,最終將降至engine引擎默認值。
ForceUpdate: 0, // 即使未更改相關參數也觸發更新的計數器
Runtime: "", // 運行時是為任務執行程序指定的運行時類型
},
Mode: swarm.ServiceMode{
Replicated: &swarm.ReplicatedService{
Replicas: &replicas, // --replicas 副本數
},
},
UpdateConfig: &swarm.UpdateConfig{
Parallelism: uint64(2), // --update-parallelism 更新時同時並行更新數量,默認1
Delay: 10000000000, // 10s --update-delay 每次容器與容器之間的更新時間間隔
FailureAction: "continue", // --update-failure-action 任務容器更新失敗時的模式,(“pause”停止|”continue“繼續),默認pause。
Monitor: nil, // --update-monitor 每次更新任務后的持續時間以監控故障(ns / us / ms / s / m / h)(默認為0)
MaxFailureRatio: 0, // --update-max-failure-ratio 更新期間容忍的故障率 .數值(列“.2”為%20)
Order: nil, // --update-order "start-first"|"stop-first" 默認"stop-first"
},
RollbackConfig: &swarm.UpdateConfig{
Parallelism: nil,
Delay: nil,
FailureAction: nil,
Monitor: nil,
MaxFailureRatio: 0, // --rollback-max-failure-ratio .數值(列“.2”為%20) 回滾故障率如果小於百分比允許運行
Order: nil,
},
Networks: []swarm.NetworkAttachmentConfig{ // --network my-net
swarm.NetworkAttachmentConfig{
Target: "", // 網絡名稱
Aliases: nil, // 別名
DriverOpts: nil, // bridge drive 類型
},
},
EndpointSpec: &swarm.EndpointSpec{
Mode: "",
Ports: []swarm.PortConfig{ // -p 9180:80
swarm.PortConfig{
Name: "",
Protocol: "tcp", // tcp udp sctp
TargetPort: 80, // 容器內部端口
PublishedPort: 9180, // 映射端口
PublishMode: "", // "ingress":路由網格進行入口負載平衡。 "host":
},
},
},
},
Context: nil,
}
_, _ = dockerCli.CreateService(serviceOptions)
}
