diff --git a/docs/index.html b/docs/index.html index 580b7008..845cbdfd 100644 --- a/docs/index.html +++ b/docs/index.html @@ -7242,6 +7242,9 @@ class: prom-manual - Then we will create a service using this image +Note: it is also possible to use a `config` to inject that configuration file +without having to create this ad-hoc image. + --- class: prom-manual @@ -7330,6 +7333,175 @@ Their state should be "UP". --- +class: prom-auto, config + +## Injecting a configuration file + +(New in Docker Engine 17.06) + +- We are creating a custom image *just to inject a configuration* + +- Instead, we could use the base Prometheus image + a `config` + +- A `config` is a blob (usually, a configuration file) that: + + - is created and managed through the Docker API (and CLI) + + - gets persisted into the Raft log (i.e. safely) + + - can be associated to a service +
+ (this injects the blob as a plain file in the service's containers) + +--- + +class: prom-auto, config + +## Differences between `config` and `secret` + +The two are very similar, but ... + +- `configs`: + + - can be injected to any filesystem location + + - can be viewed and extracted using the Docker API or CLI + +- `secrets`: + + - can only be injected into `/run/secrets` + + - are never stored in clear text on disk + + - cannot be viewed or extracted with the Docker API or CLI + +--- + +class: prom-auto, config + +## Deploying Prometheus with a `config` + +- The `config` can be created manually or declared in the Compose file + +- This is what our new Compose file looks like: + +.small[ +```yaml +version: "3.3" + +services: + +prometheus: + image: prom/prometheus:v1.4.1 + ports: + - "9090:9090" + configs: + - source: prometheus + target: /etc/prometheus/prometheus.yml + +... + +configs: + prometheus: + file: ../prom/prometheus.yml +``` +] + +(This is from `prometheus+config.yml`) + +--- + +class: prom-auto, config + +## Specifying a `config` in a Compose file + +- In each service, an optional `configs` section can list as many configs as you want + +- Each config can specify: + + - an optional `target` (path to inject the configuration; by default: root of the container) + + - ownership and permissions (by default, the file will be owned by UID 0, i.e. `root`) + +- These configs reference top-level `configs` elements + +- The top-level configs can be declared as: + + - *external*, meaning that it is supposed to be created before you deploy the stack + + - referencing a file, whose content is used to initialize the config + +--- + +class: prom-auto, config + +## Re-deploying Prometheus with a config + +- We will update the existing stack using `prometheus+config.yml` + +.exercise[ + +- Redeploy the `prometheus` stack: + ```bash + docker stack deploy -c prometheus+config.yml prometheus + ``` + +- Check that Prometheus still works as intended + + (By connecting to any node of the cluster, on port 9090) + +] + +--- + +class: prom-auto, config + +## Accessing the config object from the Docker CLI + +- Config objects can be viewed from the CLI (or API) + +.exercise[ + +- List existing config objects: + ```bash + docker config ls + ``` + +- View details about our config object: + ```bash + docker config inspect prometheus_prometheus + ``` + +] + +Note: the content of the config blob is shown with BASE64 encoding. +
+(It doesn't have to be text; it could be an image or any kind of binary content!) + +--- + +class: prom-auto, config + +## Extracting a config blob + +- Let's retrieve that Prometheus configuration! + +.exercise[ + +- Extract the BASE64 payload with `jq`: + ```bash + docker config inspect prometheus_prometheus | jq -r .[0].Spec.Data + ``` + +- Decode it with `base64 -d`: + ```bash + docker config inspect prometheus_prometheus | jq -r .[0].Spec.Data | base64 -d + ``` + +] + +--- + class: prom ## Displaying metrics directly from Prometheus diff --git a/stacks/prometheus+config.yml b/stacks/prometheus+config.yml new file mode 100644 index 00000000..3d3129c0 --- /dev/null +++ b/stacks/prometheus+config.yml @@ -0,0 +1,35 @@ +version: "3.3" + +services: + + prometheus: + image: prom/prometheus:v1.4.1 + ports: + - "9090:9090" + configs: + - source: prometheus + target: /etc/prometheus/prometheus.yml + + node: + image: prom/node-exporter + command: -collector.procfs /host/proc -collector.sysfs /host/proc -collector.filesystem.ignored-mount-points "^(sys|proc|dev|host|etc)($$|/)" + deploy: + mode: global + volumes: + - "/proc:/host/proc" + - "/sys:/host/sys" + - "/:/rootfs" + + cadvisor: + image: google/cadvisor + deploy: + mode: global + volumes: + - "/:/rootfs" + - "/var/run:/var/run" + - "/sys:/sys" + - "/var/lib/docker:/var/lib/docker" + +configs: + prometheus: + file: ../prom/prometheus.yml