forked from brooklyncentral/clocker
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdocker.bom
571 lines (520 loc) · 22.1 KB
/
docker.bom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
brooklyn.catalog:
version: "2.1.0-SNAPSHOT" # CLOCKER_VERSION
publish:
description: |
Resources for working with Docker Engine from Apache Brooklyn
license_code: APACHE-2.0
overview: README.md
qa: tests/docker.tests.bom
items:
- classpath://common/common.bom
- classpath://common/ca.bom
- id: docker-engine
name: "Docker Engine"
description: |
The engine for running Docker containers
itemType: entity
iconUrl: classpath://io.brooklyn.clocker.common:icons/docker.png
item:
type: centos-software-process
id: docker-engine
brooklyn.parameters:
- name: docker.package
label: "Docker Package"
description: |
The Docker Engine package to install
type: string
- name: docker.version
label: "Docker Version"
description: |
The Docker Engine version to install
type: string
- name: docker.repository.url
label: "Docker Repository URL"
description: |
The Docker repository URL to use for installation
type: string
- name: docker.gpgkey.url
label: "Docker GPG Key URL"
description: |
The Docker GPG key URL to use to authenticate the installation
type: string
- name: docker.additionaloptions
label: "Docker Additional Options"
description: |
The additional options to pass to the engine on startup
type: string
- name: image.preinstall
label: "Image Pre-install"
description: |
A docker hub image id to pull after installation
type: string
default: brooklyncentral/centos:7
brooklyn.initializers:
- type: org.apache.brooklyn.entity.machine.AddMachineMetrics
- type: org.apache.brooklyn.core.sensor.ssh.SshCommandSensor
brooklyn.config:
name: docker.version
period: 5m
command: |
docker info | grep "^Server Version" | sed -e "s/^Server Version: //"
- type: org.apache.brooklyn.core.sensor.ssh.SshCommandSensor
brooklyn.config:
name: docker.container.count
period: 1m
targetType: integer
command: |
docker ps -q | wc -l
brooklyn.config:
defaultDisplayName: "docker-engine"
image.preinstall: brooklyncentral/centos:7
shell.env:
DOCKER_ADDITIONAL_OPTIONS: $brooklyn:config("docker.additionaloptions")
HOST_NAME: $brooklyn:attributeWhenReady("host.name")
HOST_ADDRESS: $brooklyn:attributeWhenReady("host.address")
DOCKER_IMAGE_PREINSTALL: $brooklyn:config("image.preinstall")
DOCKER_PACKAGE: $brooklyn:config("docker.package")
DOCKER_VERSION: $brooklyn:config("docker.version")
DOCKER_REPOSITORY_URL: $brooklyn:config("docker.repository.url")
DOCKER_GPG_KEY_URL: $brooklyn:config("docker.gpgkey.url")
ENTITY_ID: $brooklyn:attributeWhenReady("entity.id")
APPLICATION_ID: $brooklyn:attributeWhenReady("application.id")
CLOCKER_VERSION: "2.1.0-SNAPSHOT"
install.command: |
set -e # need all commands to execute successfully
sudo yum -y update
echo "[CLOCKER] Configuring package manager"
if [[ "${DOCKER_REPOSITORY_URL}" && "${DOCKER_GPG_KEY_URL}" ]] ; then
# Commercially Supported Docker Engine
sudo rpm --import "${DOCKER_GPG_KEY_URL}"
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo "${DOCKER_REPOSITORY_URL}"
else
# Open-Source Docker Engine
sudo tee /etc/yum.repos.d/docker.repo <<-EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/\$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
fi
if [[ "${DOCKER_VERSION}" ]] ; then
sudo yum -y install ${DOCKER_PACKAGE:-docker-engine}-${DOCKER_VERSION}
else
sudo yum -y install ${DOCKER_PACKAGE:-docker-engine}
fi
echo "[CLOCKER] Setting up Docker systemd service"
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/docker.conf <<-EOF
[Service]
# Need to clear the default first and then set a custom value
ExecStart=
ExecStart=/usr/bin/docker daemon \
-H unix:///var/run/docker.sock \
--api-cors-header="*" \
--config-file /etc/systemd/system/docker.service.d/daemon.json \
${DOCKER_ADDITIONAL_OPTIONS}
ExecStartPost=/usr/bin/chown ${USER}:docker /var/run/docker.sock
EOF
sudo tee /etc/systemd/system/docker.service.d/daemon.json <<-EOF
{
"labels": [
"org.label-schema.schema-version=1.0",
"org.label-schema.version=${CLOCKER_VERSION}",
"org.label-schema.name=${HOST_ADDRESS}",
"io.brooklyn.clocker.entity=${ENTITY_ID}",
"io.brooklyn.clocker.application=${APPLICATION_ID}"
]
}
EOF
if sudo systemctl list-unit-files | grep "rngd" ; then
echo "[CLOCKER] Fix 100% CPU issue on some VMs"
sudo service rngd stop || true
sudo systemctl disable rngd.service
fi
sudo systemctl enable docker.service
sudo systemctl daemon-reload
post.install.command: |
echo "[CLOCKER] Setting up user and group for Docker"
sudo groupadd -f docker
sudo usermod -aG docker ${USER}
launch.command: |
sudo service docker start &&
( [ -z "${DOCKER_IMAGE_PREINSTALL}" ] ||
docker images --format="{{.Repository}}:{{.Tag}}" | grep -q "${DOCKER_IMAGE_PREINSTALL}" ||
docker pull ${DOCKER_IMAGE_PREINSTALL} )
stop.command: |
sudo service docker stop
checkRunning.command: |
sudo service docker status
# ensure docker running before starting children
childStartMode: foreground_late
- id: docker-engine-tls
name: "Docker Engine with TLS"
description: |
A docker-engine customised with TLS
itemType: entity
iconUrl: classpath://io.brooklyn.clocker.common:icons/docker.png
item:
type: docker-engine
brooklyn.parameters:
- name: docker.port
label: "Docker Port"
description: |
The TCP port for Docker to listen on
type: integer
default: 2376
- name: docker.bindaddress
label: "Docker Bind Address"
description: |
The docker network address to to listen on.
type: string
default: 0.0.0.0
- name: ca.request.root.url
label: "CA Request Root URL"
description: |
Optional root URL for a CA server.
Use this or set the configuration for the certificate and key
URLs separately.
type: string
- name: ca.cert.url
label: "CA Certificate URL"
description: |
Optional URL for the CA certificate
type: string
- name: ca.cert
label: "CA Certificate"
description: |
Optional CA certificate data
type: string
- name: node.cert.url
label: "Node Certificate URL"
description: |
Optional URL for the TLS certificate for this Docker engine
type: string
- name: private.key.url
label: "Private Key URL"
description: |
Optional URL for the private key of this Docker engine
type: string
brooklyn.enrichers:
- type: org.apache.brooklyn.enricher.stock.Transformer
brooklyn.config:
uniqueTag: docker-public-endpoint-generator
enricher.suppressDuplicates: false
enricher.triggerSensors:
- $brooklyn:sensor("host.address")
enricher.targetSensor: $brooklyn:sensor("docker.endpoint.public")
enricher.targetValue:
$brooklyn:formatString:
- "%s:%d"
- $brooklyn:attributeWhenReady("host.address")
- $brooklyn:config("docker.port")
- type: org.apache.brooklyn.enricher.stock.Transformer
brooklyn.config:
uniqueTag: docker-endpoint-generator
enricher.suppressDuplicates: false
enricher.triggerSensors:
- $brooklyn:sensor("host.subnet.address")
enricher.targetSensor: $brooklyn:sensor("docker.endpoint")
enricher.targetValue:
$brooklyn:formatString:
- "%s:%d"
- $brooklyn:attributeWhenReady("host.subnet.address")
- $brooklyn:config("docker.port")
- type: org.apache.brooklyn.enricher.stock.Transformer
brooklyn.config:
uniqueTag: docker-url-generator
enricher.suppressDuplicates: false
enricher.triggerSensors:
- $brooklyn:sensor("docker.endpoint")
enricher.targetSensor: $brooklyn:sensor("docker.url")
enricher.targetValue:
$brooklyn:formatString:
- "tcp://%s"
- $brooklyn:attributeWhenReady("docker.endpoint")
brooklyn.config:
docker.cert.path:
$brooklyn:formatString:
- "%s/.certs"
- $brooklyn:attributeWhenReady("install.dir")
docker.tlsoptions:
$brooklyn:formatString:
- >-
--tlsverify
--tlscacert=%1$s/ca.pem
--tlscert=%1$s/cert.pem
--tlskey=%1$s/key.pem
- $brooklyn:config("docker.cert.path")
docker.additionaloptions.docker-engine-tls:
$brooklyn:formatString:
- "-H %s %s"
- $brooklyn:attributeWhenReady("docker.bind.url")
- $brooklyn:config("docker.tlsoptions")
docker.additionaloptions: $brooklyn:config("docker.additionaloptions.docker-engine-tls")
shell.env:
CA_REQUEST_ROOT_URL: $brooklyn:config("ca.request.root.url")
CA_CERT: $brooklyn:config("ca.cert")
CA_CERT_URL: $brooklyn:config("ca.cert.url")
NODE_CERT_URL: $brooklyn:config("node.cert.url")
PRIV_KEY_URL: $brooklyn:config("private.key.url")
HOST_ADDRESS: $brooklyn:attributeWhenReady("host.address")
SUBNET_ADDRESS: $brooklyn:attributeWhenReady("host.subnet.address")
INSTALL_DIR: $brooklyn:attributeWhenReady("install.dir")
TLS_OPTIONS: $brooklyn:config("docker.tlsoptions")
DOCKER_ENDPOINT: $brooklyn:attributeWhenReady("docker.endpoint")
DOCKER_HOST: $brooklyn:attributeWhenReady("docker.url")
DOCKER_TLS_VERIFY: true
DOCKER_CERT_PATH: $brooklyn:config("docker.cert.path")
latch.preInstall.resources: $brooklyn:entity("ca-server").attributeWhenReady("service.isUp")
files.preinstall:
"classpath://io.brooklyn.clocker.common:common/certificate-functions.sh": certificate-functions.sh
customize.command: |
set -e
source ${INSTALL_DIR}/certificate-functions.sh
echo "[CLOCKER] Creating ${DOCKER_CERT_PATH}"
mkdir -p ${DOCKER_CERT_PATH}
if [ "${CA_REQUEST_ROOT_URL}" ] ; then
#echo "$CA_CERT" > ${DOCKER_CERT_PATH}/ca.pem # commented out until after we get back to this.
getcert ${CA_REQUEST_ROOT_URL}/cacert/ca.pem ${DOCKER_CERT_PATH}/ca.pem
generate_key ${DOCKER_CERT_PATH}/key.pem
generate_conf ${DOCKER_CERT_PATH}/csr.cnf ${HOST_ADDRESS} ${SUBNET_ADDRESS}
generate_csr ${DOCKER_CERT_PATH}/csr.cnf ${DOCKER_CERT_PATH}/key.pem ${DOCKER_CERT_PATH}/csr.pem
echo "[CLOCKER] Requesting certificate from ${CA_REQUEST_ROOT_URL}"
curl -X POST --data-binary @${DOCKER_CERT_PATH}/csr.pem ${CA_REQUEST_ROOT_URL}/sign > ${DOCKER_CERT_PATH}/cert.pem
echo "[CLOCKER] Certifcate for ${HOST_ADDRESS} received"
else
echo "[CLOCKER] Downloading certificates from configuration settings"
getcert ${CA_CERT_URL} > ${DOCKER_CERT_PATH}/ca.pem
getcert ${NODE_CERT_URL} > ${DOCKER_CERT_PATH}/cert.pem
getcert ${PRIV_KEY_URL} > ${DOCKER_CERT_PATH}/key.pem
fi
# TODO verify certs with openssl
test -f ${DOCKER_CERT_PATH}/ca.pem || failwith "Failed to obtain ca.pem"
test -f ${DOCKER_CERT_PATH}/cert.pem || failwith "Failed to obtain cert.pem"
test -f ${DOCKER_CERT_PATH}/key.pem || failwith "Failed to obtain key.pem"
post.customize.command: |
echo "[CLOCKER] Set up Docker environment variables with TLS"
if ! grep docker_client ${HOME}/.bashrc ; then
echo ". docker_client.rc" >> ${HOME}/.bashrc
fi
cat > ${HOME}/docker_client.rc <<-EOF
DOCKER_TLS_VERIFY=${DOCKER_TLS_VERIFY}
DOCKER_CERT_PATH=${DOCKER_CERT_PATH}
DOCKER_HOST=${DOCKER_HOST}
export DOCKER_TLS_VERIFY DOCKER_CERT_PATH DOCKER_HOST
EOF
brooklyn.initializers:
- type: org.apache.brooklyn.core.sensor.ssh.SshCommandSensor
brooklyn.config:
name: docker.csr
period: 5m
command: |
cat ${DOCKER_CERT_PATH}/csr.pem
- type: org.apache.brooklyn.core.sensor.StaticSensor
brooklyn.config:
name: docker.bind.url
static.value:
$brooklyn:formatString:
- "tcp://%s:%d"
- $brooklyn:config("docker.bindaddress")
- $brooklyn:config("docker.port")
- id: docker-engine-with-resilience
name: "Docker Engine with Resilience"
description: |
A docker-engine configured with resilience policies
itemType: entity
iconUrl: classpath://io.brooklyn.clocker.common:icons/docker.png
item:
type: docker-engine-tls
brooklyn.parameters:
- name: docker.recovery.stabilizationDelay
label: "Stabilization Delay"
description: |
Time period for which the service must be consistently in the same state to trigger an action.
Should be long enough that a restart will not trigger failure
type: org.apache.brooklyn.util.time.Duration
default: 5m
- name: docker.recovery.failOnRecurringFailuresInThisDuration
label: "Fail Duration"
description: |
Reports entity as failed if it fails two or more times in this time window
type: org.apache.brooklyn.util.time.Duration
default: 15m
brooklyn.policies:
- type: org.apache.brooklyn.policy.ha.ServiceRestarter
brooklyn.config:
failOnRecurringFailuresInThisDuration:
$brooklyn:config("docker.recovery.failOnRecurringFailuresInThisDuration")
brooklyn.enrichers:
- type: org.apache.brooklyn.policy.ha.ServiceFailureDetector
brooklyn.config:
serviceOnFire.stabilizationDelay:
$brooklyn:config("docker.recovery.stabilizationDelay")
entityFailed.stabilizationDelay:
$brooklyn:config("docker.recovery.stabilizationDelay")
entityRecovered.stabilizationDelay:
$brooklyn:config("docker.recovery.stabilizationDelay")
- id: docker-engine-container
name: "Docker Container"
description: |
An easy way to launch a Docker container, as a child of a Docker Engine.
itemType: entity
iconUrl: classpath://io.brooklyn.clocker.common:icons/docker.png
item:
type: centos-software-process
brooklyn.parameters:
- name: image.details
label: "Image Details"
description: |
The Docker Container image details.
Either the name of a Docker Hub image or the id of an image that has
been pulled and is available on the Engine already.
type: string
brooklyn.config:
dontRequireTtyForSudo: true
# TODO advertise container id as a sensor.
shell.env:
IMAGE_DETAILS: $brooklyn:config("image.details")
launch.command: |
docker run -d ${IMAGE_DETAILS}
checkRunning.command: |
result="$(docker ps | grep ${IMAGE_DETAILS} | wc -l)"
if [ $result -ne 0 ]; then exit 0; else exit 1; fi;
- id: docker-vm-container
name: "Docker Entity"
description: |
An easy way to launch a single Docker container on a VM
itemType: entity
item:
type: docker-engine
brooklyn.parameters:
- name: docker.image
label: "Docker Image"
description: |
The docker image to use when running the container
- name: docker.run.arguments
label: "Docker Run Arguments"
description: |
Arguments to pass to the docker run command
- name: docker.run.volumes
label: "Container Volumns"
type: java.util.List
description: |
List of volumes to mount. Items follow the documented docker format
for the '-v' option
default: [ ]
- name: docker.run.env
label: "Container Environment"
type: java.util.Map
description: |
Map of environment variables to pass to the container
default: { }
- name: docker.restart
label: "Restart policy"
description: |
Restart policy on the container. One of no, on-failure[:max-retries],
always or unless-stopped
- name: docker.run.additionaloptions
label: "Run Additional Options"
description: |
Additional options to pass to the 'docker run' command
brooklyn.config:
defaultDisplayName: $brooklyn:config("docker.image")
image.preinstall:
shell.env:
DOCKER_IMAGE: $brooklyn:config("docker.image")
DOCKER_RUN_ARGUMENTS: $brooklyn:config("docker.run.arguments")
DOCKER_RUN_VOLUMES: $brooklyn:config("docker.run.volumes")
DOCKER_RUN_ENV: $brooklyn:config("docker.run.env")
DOCKER_RESTART: $brooklyn:config("docker.restart")
DOCKER_RUN_ADDITIONAL_OPTIONS: $brooklyn:config("docker.run.additionaloptions")
pre.install.command: |
sudo yum -y install epel-release
sudo yum -y install jq
pre.launch.command: |
if [ -z "${DOCKER_IMAGE}" ]; then
echo "[CLOCKER] 'docker.image' not configured on the entity" >&2
exit 1
fi
post.launch.command: |
set -e
# Won't escape quotes in the arguments, but those are not expected
function parse_docker_volumes {
echo ${DOCKER_RUN_VOLUMES} |
jq -r '["-v \"" + .[] + "\" "] | add'
}
function parse_docker_env {
echo ${DOCKER_RUN_ENV} |
jq -r 'to_entries | map("-e \"" + .key + "=" + .value + "\" ") | add'
}
rm -f "${PID_FILE}" # docker won't overwrite
DOCKER="docker run -d --cidfile \"${PID_FILE}\" --net=host"
[[ $DOCKER_RUN_VOLUMES != [] ]] && DOCKER="${DOCKER} $( parse_docker_volumes )"
[[ $DOCKER_RUN_ENV != {} ]] && DOCKER="${DOCKER} $( parse_docker_env )"
DOCKER="${DOCKER} --restart=${DOCKER_RESTART:-unless-stopped}"
[ "${DOCKER_RUN_ADDITIONAL_OPTIONS}" ] && DOCKER="${DOCKER} ${DOCKER_RUN_ADDITIONAL_OPTIONS}"
DOCKER="${DOCKER} \"${DOCKER_IMAGE}\""
[ "${DOCKER_RUN_ARGUMENTS}" ] && DOCKER="${DOCKER} ${DOCKER_RUN_ARGUMENTS}"
echo "${DOCKER}"
echo "${DOCKER}" | bash
checkRunning.command: |
STATE=$(docker inspect --format "{{ .State.Status }}" $(cat "${PID_FILE}"))
sudo service docker status && [ "${STATE}" = "running" ]
stop.command: |
docker stop $(cat "${PID_FILE}")
sudo service docker stop
rm -f "${PID_FILE}"
brooklyn.initializers:
- type: org.apache.brooklyn.core.sensor.ssh.SshCommandSensor
brooklyn.config:
name: container.id
period: 5m
targetType: String
command: |
test -f pid.txt &&
cat pid.txt
- type: org.apache.brooklyn.core.sensor.ssh.SshCommandSensor
brooklyn.config:
name: container.stats.cpu.percent
period: 1m
targetType: double
command: |
test -f pid.txt &&
( docker stats --no-stream --format "table {{.CPUPerc}}" $(cat pid.txt) |
sed -n '2s/%//p' )
- type: org.apache.brooklyn.core.sensor.ssh.SshCommandSensor
brooklyn.config:
name: container.stats.memory.percent
period: 1m
targetType: double
command: |
test -f pid.txt &&
( docker stats --no-stream --format "table {{.MemPerc}}" $(cat pid.txt) |
sed -n '2s/%//p' )
- id: docker-container-entity
name: "Docker Container"
description: |
An easy way to launch a Docker container
itemType: entity
iconUrl: classpath://io.brooklyn.clocker.common:icons/docker.png
item:
type: org.apache.brooklyn.container.entity.docker.DockerContainer
brooklyn.parameters:
- name: docker.container.imageName
label: "Docker Container Image Name"
description: |
The name of the image to use when starting the Docker container
type: string
- name: docker.container.inboundPorts
label: "Docker Container Inbound Ports"
description: |
A list of ports to be opened for inbound access to the container
type: java.util.List
- name: docker.container.environment
label: "Docker Container Environmrnt"
description: |
A map of the environment variables to be set when launching the Docker container
type: java.util.Map