Initial commit
159
vendor/github.com/hyperhq/hypercli/docs/admin/ambassador_pattern_linking.md
generated
vendored
Normal file
@@ -0,0 +1,159 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/articles/ambassador_pattern_linking/"]
|
||||
title = "Link via an ambassador container"
|
||||
description = "Using the Ambassador pattern to abstract (network) services"
|
||||
keywords = ["Examples, Usage, links, docker, documentation, examples, names, name, container naming"]
|
||||
[menu.main]
|
||||
parent = "engine_admin"
|
||||
weight = 6
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Link via an ambassador container
|
||||
|
||||
Rather than hardcoding network links between a service consumer and
|
||||
provider, Docker encourages service portability, for example instead of:
|
||||
|
||||
(consumer) --> (redis)
|
||||
|
||||
Requiring you to restart the `consumer` to attach it to a different
|
||||
`redis` service, you can add ambassadors:
|
||||
|
||||
(consumer) --> (redis-ambassador) --> (redis)
|
||||
|
||||
Or
|
||||
|
||||
(consumer) --> (redis-ambassador) ---network---> (redis-ambassador) --> (redis)
|
||||
|
||||
When you need to rewire your consumer to talk to a different Redis
|
||||
server, you can just restart the `redis-ambassador` container that the
|
||||
consumer is connected to.
|
||||
|
||||
This pattern also allows you to transparently move the Redis server to a
|
||||
different docker host from the consumer.
|
||||
|
||||
Using the `svendowideit/ambassador` container, the link wiring is
|
||||
controlled entirely from the `docker run` parameters.
|
||||
|
||||
## Two host example
|
||||
|
||||
Start actual Redis server on one Docker host
|
||||
|
||||
big-server $ docker run -d --name redis crosbymichael/redis
|
||||
|
||||
Then add an ambassador linked to the Redis server, mapping a port to the
|
||||
outside world
|
||||
|
||||
big-server $ docker run -d --link redis:redis --name redis_ambassador -p 6379:6379 svendowideit/ambassador
|
||||
|
||||
On the other host, you can set up another ambassador setting environment
|
||||
variables for each remote port we want to proxy to the `big-server`
|
||||
|
||||
client-server $ docker run -d --name redis_ambassador --expose 6379 -e REDIS_PORT_6379_TCP=tcp://192.168.1.52:6379 svendowideit/ambassador
|
||||
|
||||
Then on the `client-server` host, you can use a Redis client container
|
||||
to talk to the remote Redis server, just by linking to the local Redis
|
||||
ambassador.
|
||||
|
||||
client-server $ docker run -i -t --rm --link redis_ambassador:redis relateiq/redis-cli
|
||||
redis 172.17.0.160:6379> ping
|
||||
PONG
|
||||
|
||||
## How it works
|
||||
|
||||
The following example shows what the `svendowideit/ambassador` container
|
||||
does automatically (with a tiny amount of `sed`)
|
||||
|
||||
On the Docker host (192.168.1.52) that Redis will run on:
|
||||
|
||||
# start actual redis server
|
||||
$ docker run -d --name redis crosbymichael/redis
|
||||
|
||||
# get a redis-cli container for connection testing
|
||||
$ docker pull relateiq/redis-cli
|
||||
|
||||
# test the redis server by talking to it directly
|
||||
$ docker run -t -i --rm --link redis:redis relateiq/redis-cli
|
||||
redis 172.17.0.136:6379> ping
|
||||
PONG
|
||||
^D
|
||||
|
||||
# add redis ambassador
|
||||
$ docker run -t -i --link redis:redis --name redis_ambassador -p 6379:6379 alpine:3.2 sh
|
||||
|
||||
In the `redis_ambassador` container, you can see the linked Redis
|
||||
containers `env`:
|
||||
|
||||
/ # env
|
||||
REDIS_PORT=tcp://172.17.0.136:6379
|
||||
REDIS_PORT_6379_TCP_ADDR=172.17.0.136
|
||||
REDIS_NAME=/redis_ambassador/redis
|
||||
HOSTNAME=19d7adf4705e
|
||||
SHLVL=1
|
||||
HOME=/root
|
||||
REDIS_PORT_6379_TCP_PORT=6379
|
||||
REDIS_PORT_6379_TCP_PROTO=tcp
|
||||
REDIS_PORT_6379_TCP=tcp://172.17.0.136:6379
|
||||
TERM=xterm
|
||||
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
PWD=/
|
||||
/ # exit
|
||||
|
||||
This environment is used by the ambassador `socat` script to expose Redis
|
||||
to the world (via the `-p 6379:6379` port mapping):
|
||||
|
||||
$ docker rm redis_ambassador
|
||||
$ CMD="apk update && apk add socat && sh"
|
||||
$ docker run -t -i --link redis:redis --name redis_ambassador -p 6379:6379 alpine:3.2 sh -c "$CMD"
|
||||
[...]
|
||||
/ # socat -t 100000000 TCP4-LISTEN:6379,fork,reuseaddr TCP4:172.17.0.136:6379
|
||||
|
||||
Now ping the Redis server via the ambassador:
|
||||
|
||||
Now go to a different server:
|
||||
|
||||
$ CMD="apk update && apk add socat && sh"
|
||||
$ docker run -t -i --expose 6379 --name redis_ambassador alpine:3.2 sh -c "$CMD"
|
||||
[...]
|
||||
/ # socat -t 100000000 TCP4-LISTEN:6379,fork,reuseaddr TCP4:192.168.1.52:6379
|
||||
|
||||
And get the `redis-cli` image so we can talk over the ambassador bridge.
|
||||
|
||||
$ docker pull relateiq/redis-cli
|
||||
$ docker run -i -t --rm --link redis_ambassador:redis relateiq/redis-cli
|
||||
redis 172.17.0.160:6379> ping
|
||||
PONG
|
||||
|
||||
## The svendowideit/ambassador Dockerfile
|
||||
|
||||
The `svendowideit/ambassador` image is based on the `alpine:3.2` image with
|
||||
`socat` installed. When you start the container, it uses a small `sed`
|
||||
script to parse out the (possibly multiple) link environment variables
|
||||
to set up the port forwarding. On the remote host, you need to set the
|
||||
variable using the `-e` command line option.
|
||||
|
||||
--expose 1234 -e REDIS_PORT_1234_TCP=tcp://192.168.1.52:6379
|
||||
|
||||
Will forward the local `1234` port to the remote IP and port, in this
|
||||
case `192.168.1.52:6379`.
|
||||
|
||||
#
|
||||
# do
|
||||
# docker build -t svendowideit/ambassador .
|
||||
# then to run it (on the host that has the real backend on it)
|
||||
# docker run -t -i -link redis:redis -name redis_ambassador -p 6379:6379 svendowideit/ambassador
|
||||
# on the remote host, you can set up another ambassador
|
||||
# docker run -t -i -name redis_ambassador -expose 6379 -e REDIS_PORT_6379_TCP=tcp://192.168.1.52:6379 svendowideit/ambassador sh
|
||||
# you can read more about this process at https://docs.docker.com/articles/ambassador_pattern_linking/
|
||||
|
||||
# use alpine because its a minimal image with a package manager.
|
||||
# prettymuch all that is needed is a container that has a functioning env and socat (or equivalent)
|
||||
FROM alpine:3.2
|
||||
MAINTAINER SvenDowideit@home.org.au
|
||||
|
||||
RUN apk update && \
|
||||
apk add socat && \
|
||||
rm -r /var/cache/
|
||||
|
||||
CMD env | grep _TCP= | (sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat -t 100000000 TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' && echo wait) | sh
|
||||
BIN
vendor/github.com/hyperhq/hypercli/docs/admin/b2d_volume_images/add_cd.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
vendor/github.com/hyperhq/hypercli/docs/admin/b2d_volume_images/add_new_controller.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
vendor/github.com/hyperhq/hypercli/docs/admin/b2d_volume_images/add_volume.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
vendor/github.com/hyperhq/hypercli/docs/admin/b2d_volume_images/boot_order.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
vendor/github.com/hyperhq/hypercli/docs/admin/b2d_volume_images/gparted.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
vendor/github.com/hyperhq/hypercli/docs/admin/b2d_volume_images/gparted2.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
vendor/github.com/hyperhq/hypercli/docs/admin/b2d_volume_images/verify.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
165
vendor/github.com/hyperhq/hypercli/docs/admin/b2d_volume_resize.md
generated
vendored
Normal file
@@ -0,0 +1,165 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
draft = "true"
|
||||
title = "Resizing a Boot2Docker volume "
|
||||
description = "Resizing a Boot2Docker volume in VirtualBox with GParted"
|
||||
keywords = ["boot2docker, volume, virtualbox"]
|
||||
[menu.main]
|
||||
parent = "smn_win_osx"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Getting “no space left on device” errors with Boot2Docker?
|
||||
|
||||
If you're using Boot2Docker with a large number of images, or the images you're
|
||||
working with are very large, your pulls might start failing with "no space left
|
||||
on device" errors when the Boot2Docker volume fills up. There are two solutions
|
||||
you can try.
|
||||
|
||||
## Solution 1: Add the `DiskImage` property in boot2docker profile
|
||||
|
||||
The `boot2docker` command reads its configuration from the `$BOOT2DOCKER_PROFILE` if set, or `$BOOT2DOCKER_DIR/profile` or `$HOME/.boot2docker/profile` (on Windows this is `%USERPROFILE%/.boot2docker/profile`).
|
||||
|
||||
1. View the existing configuration, use the `boot2docker config` command.
|
||||
|
||||
$ boot2docker config
|
||||
# boot2docker profile filename: /Users/mary/.boot2docker/profile
|
||||
Init = false
|
||||
Verbose = false
|
||||
Driver = "virtualbox"
|
||||
Clobber = true
|
||||
ForceUpgradeDownload = false
|
||||
SSH = "ssh"
|
||||
SSHGen = "ssh-keygen"
|
||||
SSHKey = "/Users/mary/.ssh/id_boot2docker"
|
||||
VM = "boot2docker-vm"
|
||||
Dir = "/Users/mary/.boot2docker"
|
||||
ISOURL = "https://api.github.com/repos/boot2docker/boot2docker/releases"
|
||||
ISO = "/Users/mary/.boot2docker/boot2docker.iso"
|
||||
DiskSize = 20000
|
||||
Memory = 2048
|
||||
CPUs = 8
|
||||
SSHPort = 2022
|
||||
DockerPort = 0
|
||||
HostIP = "192.168.59.3"
|
||||
DHCPIP = "192.168.59.99"
|
||||
NetMask = [255, 255, 255, 0]
|
||||
LowerIP = "192.168.59.103"
|
||||
UpperIP = "192.168.59.254"
|
||||
DHCPEnabled = true
|
||||
Serial = false
|
||||
SerialFile = "/Users/mary/.boot2docker/boot2docker-vm.sock"
|
||||
Waittime = 300
|
||||
Retries = 75
|
||||
|
||||
The configuration shows you where `boot2docker` is looking for the `profile` file. It also output the settings that are in use.
|
||||
|
||||
|
||||
2. Initialize a default file to customize using `boot2docker config > ~/.boot2docker/profile` command.
|
||||
|
||||
3. Add the following lines to `$HOME/.boot2docker/profile`:
|
||||
|
||||
# Disk image size in MB
|
||||
DiskSize = 50000
|
||||
|
||||
4. Run the following sequence of commands to restart Boot2Docker with the new settings.
|
||||
|
||||
$ boot2docker poweroff
|
||||
$ boot2docker destroy
|
||||
$ boot2docker init
|
||||
$ boot2docker up
|
||||
|
||||
## Solution 2: Increase the size of boot2docker volume
|
||||
|
||||
This solution increases the volume size by first cloning it, then resizing it
|
||||
using a disk partitioning tool. We recommend
|
||||
[GParted](http://gparted.sourceforge.net/download.php/index.php). The tool comes
|
||||
as a bootable ISO, is a free download, and works well with VirtualBox.
|
||||
|
||||
1. Stop Boot2Docker
|
||||
|
||||
Issue the command to stop the Boot2Docker VM on the command line:
|
||||
|
||||
$ boot2docker stop
|
||||
|
||||
2. Clone the VMDK image to a VDI image
|
||||
|
||||
Boot2Docker ships with a VMDK image, which can't be resized by VirtualBox's
|
||||
native tools. We will instead create a VDI volume and clone the VMDK volume to
|
||||
it.
|
||||
|
||||
3. Using the command line VirtualBox tools, clone the VMDK image to a VDI image:
|
||||
|
||||
$ vboxmanage clonehd /full/path/to/boot2docker-hd.vmdk /full/path/to/<newVDIimage>.vdi --format VDI --variant Standard
|
||||
|
||||
4. Resize the VDI volume
|
||||
|
||||
Choose a size that will be appropriate for your needs. If you're spinning up a
|
||||
lot of containers, or your containers are particularly large, larger will be
|
||||
better:
|
||||
|
||||
$ vboxmanage modifyhd /full/path/to/<newVDIimage>.vdi --resize <size in MB>
|
||||
|
||||
5. Download a disk partitioning tool ISO
|
||||
|
||||
To resize the volume, we'll use [GParted](http://gparted.sourceforge.net/download.php/).
|
||||
Once you've downloaded the tool, add the ISO to the Boot2Docker VM IDE bus.
|
||||
You might need to create the bus before you can add the ISO.
|
||||
|
||||
> **Note:**
|
||||
> It's important that you choose a partitioning tool that is available as an ISO so
|
||||
> that the Boot2Docker VM can be booted with it.
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td><img src="/articles/b2d_volume_images/add_new_controller.png"><br><br></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="/articles/b2d_volume_images/add_cd.png"></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
6. Add the new VDI image
|
||||
|
||||
In the settings for the Boot2Docker image in VirtualBox, remove the VMDK image
|
||||
from the SATA controller and add the VDI image.
|
||||
|
||||
<img src="/articles/b2d_volume_images/add_volume.png">
|
||||
|
||||
7. Verify the boot order
|
||||
|
||||
In the **System** settings for the Boot2Docker VM, make sure that **CD/DVD** is
|
||||
at the top of the **Boot Order** list.
|
||||
|
||||
<img src="/articles/b2d_volume_images/boot_order.png">
|
||||
|
||||
8. Boot to the disk partitioning ISO
|
||||
|
||||
Manually start the Boot2Docker VM in VirtualBox, and the disk partitioning ISO
|
||||
should start up. Using GParted, choose the **GParted Live (default settings)**
|
||||
option. Choose the default keyboard, language, and XWindows settings, and the
|
||||
GParted tool will start up and display the VDI volume you created. Right click
|
||||
on the VDI and choose **Resize/Move**.
|
||||
|
||||
<img src="/articles/b2d_volume_images/gparted.png">
|
||||
|
||||
9. Drag the slider representing the volume to the maximum available size.
|
||||
|
||||
10. Click **Resize/Move** followed by **Apply**.
|
||||
|
||||
<img src="/articles/b2d_volume_images/gparted2.png">
|
||||
|
||||
11. Quit GParted and shut down the VM.
|
||||
|
||||
12. Remove the GParted ISO from the IDE controller for the Boot2Docker VM in
|
||||
VirtualBox.
|
||||
|
||||
13. Start the Boot2Docker VM
|
||||
|
||||
Fire up the Boot2Docker VM manually in VirtualBox. The VM should log in
|
||||
automatically, but if it doesn't, the credentials are `docker/tcuser`. Using
|
||||
the `df -h` command, verify that your changes took effect.
|
||||
|
||||
<img src="/articles/b2d_volume_images/verify.png">
|
||||
|
||||
You're done!
|
||||
150
vendor/github.com/hyperhq/hypercli/docs/admin/cfengine_process_management.md
generated
vendored
Normal file
@@ -0,0 +1,150 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/articles/cfengine/"]
|
||||
title = "Process management with CFEngine"
|
||||
description = "Managing containerized processes with CFEngine"
|
||||
keywords = ["cfengine, process, management, usage, docker, documentation"]
|
||||
[menu.main]
|
||||
parent = "engine_admin"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Process management with CFEngine
|
||||
|
||||
Create Docker containers with managed processes.
|
||||
|
||||
Docker monitors one process in each running container and the container
|
||||
lives or dies with that process. By introducing CFEngine inside Docker
|
||||
containers, we can alleviate a few of the issues that may arise:
|
||||
|
||||
- It is possible to easily start multiple processes within a
|
||||
container, all of which will be managed automatically, with the
|
||||
normal `docker run` command.
|
||||
- If a managed process dies or crashes, CFEngine will start it again
|
||||
within 1 minute.
|
||||
- The container itself will live as long as the CFEngine scheduling
|
||||
daemon (cf-execd) lives. With CFEngine, we are able to decouple the
|
||||
life of the container from the uptime of the service it provides.
|
||||
|
||||
## How it works
|
||||
|
||||
CFEngine, together with the cfe-docker integration policies, are
|
||||
installed as part of the Dockerfile. This builds CFEngine into our
|
||||
Docker image.
|
||||
|
||||
The Dockerfile's `ENTRYPOINT` takes an arbitrary
|
||||
amount of commands (with any desired arguments) as parameters. When we
|
||||
run the Docker container these parameters get written to CFEngine
|
||||
policies and CFEngine takes over to ensure that the desired processes
|
||||
are running in the container.
|
||||
|
||||
CFEngine scans the process table for the `basename` of the commands given
|
||||
to the `ENTRYPOINT` and runs the command to start the process if the `basename`
|
||||
is not found. For example, if we start the container with
|
||||
`docker run "/path/to/my/application parameters"`, CFEngine will look for a
|
||||
process named `application` and run the command. If an entry for `application`
|
||||
is not found in the process table at any point in time, CFEngine will execute
|
||||
`/path/to/my/application parameters` to start the application once again. The
|
||||
check on the process table happens every minute.
|
||||
|
||||
Note that it is therefore important that the command to start your
|
||||
application leaves a process with the basename of the command. This can
|
||||
be made more flexible by making some minor adjustments to the CFEngine
|
||||
policies, if desired.
|
||||
|
||||
## Usage
|
||||
|
||||
This example assumes you have Docker installed and working. We will
|
||||
install and manage `apache2` and `sshd`
|
||||
in a single container.
|
||||
|
||||
There are three steps:
|
||||
|
||||
1. Install CFEngine into the container.
|
||||
2. Copy the CFEngine Docker process management policy into the
|
||||
containerized CFEngine installation.
|
||||
3. Start your application processes as part of the `docker run` command.
|
||||
|
||||
### Building the image
|
||||
|
||||
The first two steps can be done as part of a Dockerfile, as follows.
|
||||
|
||||
FROM ubuntu
|
||||
MAINTAINER Eystein Måløy Stenberg <eytein.stenberg@gmail.com>
|
||||
|
||||
RUN apt-get update && apt-get install -y wget lsb-release unzip ca-certificates
|
||||
|
||||
# install latest CFEngine
|
||||
RUN wget -qO- http://cfengine.com/pub/gpg.key | apt-key add -
|
||||
RUN echo "deb http://cfengine.com/pub/apt $(lsb_release -cs) main" > /etc/apt/sources.list.d/cfengine-community.list
|
||||
RUN apt-get update && apt-get install -y cfengine-community
|
||||
|
||||
# install cfe-docker process management policy
|
||||
RUN wget https://github.com/estenberg/cfe-docker/archive/master.zip -P /tmp/ && unzip /tmp/master.zip -d /tmp/
|
||||
RUN cp /tmp/cfe-docker-master/cfengine/bin/* /var/cfengine/bin/
|
||||
RUN cp /tmp/cfe-docker-master/cfengine/inputs/* /var/cfengine/inputs/
|
||||
RUN rm -rf /tmp/cfe-docker-master /tmp/master.zip
|
||||
|
||||
# apache2 and openssh are just for testing purposes, install your own apps here
|
||||
RUN apt-get update && apt-get install -y openssh-server apache2
|
||||
RUN mkdir -p /var/run/sshd
|
||||
RUN echo "root:password" | chpasswd # need a password for ssh
|
||||
|
||||
ENTRYPOINT ["/var/cfengine/bin/docker_processes_run.sh"]
|
||||
|
||||
By saving this file as Dockerfile to a working directory, you can then build
|
||||
your image with the docker build command, e.g.,
|
||||
`docker build -t managed_image`.
|
||||
|
||||
### Testing the container
|
||||
|
||||
Start the container with `apache2` and `sshd` running and managed, forwarding
|
||||
a port to our SSH instance:
|
||||
|
||||
$ docker run -p 127.0.0.1:222:22 -d managed_image "/usr/sbin/sshd" "/etc/init.d/apache2 start"
|
||||
|
||||
We now clearly see one of the benefits of the cfe-docker integration: it
|
||||
allows to start several processes as part of a normal `docker run` command.
|
||||
|
||||
We can now log in to our new container and see that both `apache2` and `sshd`
|
||||
are running. We have set the root password to "password" in the Dockerfile
|
||||
above and can use that to log in with ssh:
|
||||
|
||||
ssh -p222 root@127.0.0.1
|
||||
|
||||
ps -ef
|
||||
UID PID PPID C STIME TTY TIME CMD
|
||||
root 1 0 0 07:48 ? 00:00:00 /bin/bash /var/cfengine/bin/docker_processes_run.sh /usr/sbin/sshd /etc/init.d/apache2 start
|
||||
root 18 1 0 07:48 ? 00:00:00 /var/cfengine/bin/cf-execd -F
|
||||
root 20 1 0 07:48 ? 00:00:00 /usr/sbin/sshd
|
||||
root 32 1 0 07:48 ? 00:00:00 /usr/sbin/apache2 -k start
|
||||
www-data 34 32 0 07:48 ? 00:00:00 /usr/sbin/apache2 -k start
|
||||
www-data 35 32 0 07:48 ? 00:00:00 /usr/sbin/apache2 -k start
|
||||
www-data 36 32 0 07:48 ? 00:00:00 /usr/sbin/apache2 -k start
|
||||
root 93 20 0 07:48 ? 00:00:00 sshd: root@pts/0
|
||||
root 105 93 0 07:48 pts/0 00:00:00 -bash
|
||||
root 112 105 0 07:49 pts/0 00:00:00 ps -ef
|
||||
|
||||
If we stop apache2, it will be started again within a minute by
|
||||
CFEngine.
|
||||
|
||||
service apache2 status
|
||||
Apache2 is running (pid 32).
|
||||
service apache2 stop
|
||||
* Stopping web server apache2 ... waiting [ OK ]
|
||||
service apache2 status
|
||||
Apache2 is NOT running.
|
||||
# ... wait up to 1 minute...
|
||||
service apache2 status
|
||||
Apache2 is running (pid 173).
|
||||
|
||||
## Adapting to your applications
|
||||
|
||||
To make sure your applications get managed in the same manner, there are
|
||||
just two things you need to adjust from the above example:
|
||||
|
||||
- In the Dockerfile used above, install your applications instead of
|
||||
`apache2` and `sshd`.
|
||||
- When you start the container with `docker run`,
|
||||
specify the command line arguments to your applications rather than
|
||||
`apache2` and `sshd`.
|
||||
75
vendor/github.com/hyperhq/hypercli/docs/admin/chef.md
generated
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/articles/chef/"]
|
||||
title = "Using Chef"
|
||||
description = "Installation and using Docker via Chef"
|
||||
keywords = ["chef, installation, usage, docker, documentation"]
|
||||
[menu.main]
|
||||
parent = "engine_admin"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Using Chef
|
||||
|
||||
> **Note**:
|
||||
> Please note this is a community contributed installation path.
|
||||
|
||||
## Requirements
|
||||
|
||||
To use this guide you'll need a working installation of
|
||||
[Chef](https://www.chef.io/). This cookbook supports a variety of
|
||||
operating systems.
|
||||
|
||||
## Installation
|
||||
|
||||
The cookbook is available on the [Chef Supermarket](https://supermarket.chef.io/cookbooks/docker) and can be
|
||||
installed using your favorite cookbook dependency manager.
|
||||
|
||||
The source can be found on
|
||||
[GitHub](https://github.com/someara/chef-docker).
|
||||
|
||||
Usage
|
||||
-----
|
||||
- Add ```depends 'docker', '~> 2.0'``` to your cookbook's metadata.rb
|
||||
- Use resources shipped in cookbook in a recipe, the same way you'd
|
||||
use core Chef resources (file, template, directory, package, etc).
|
||||
|
||||
```ruby
|
||||
docker_service 'default' do
|
||||
action [:create, :start]
|
||||
end
|
||||
|
||||
docker_image 'busybox' do
|
||||
action :pull
|
||||
end
|
||||
|
||||
docker_container 'an echo server' do
|
||||
repo 'busybox'
|
||||
port '1234:1234'
|
||||
command "nc -ll -p 1234 -e /bin/cat"
|
||||
end
|
||||
```
|
||||
|
||||
## Getting Started
|
||||
Here's a quick example of pulling the latest image and running a
|
||||
container with exposed ports.
|
||||
|
||||
```ruby
|
||||
# Pull latest image
|
||||
docker_image 'nginx' do
|
||||
tag 'latest'
|
||||
action :pull
|
||||
end
|
||||
|
||||
# Run container exposing ports
|
||||
docker_container 'my_nginx' do
|
||||
repo 'nginx'
|
||||
tag 'latest'
|
||||
port '80:80'
|
||||
binds [ '/some/local/files/:/etc/nginx/conf.d' ]
|
||||
host_name 'www'
|
||||
domain_name 'computers.biz'
|
||||
env 'FOO=bar'
|
||||
subscribes :redeploy, 'docker_image[nginx]'
|
||||
end
|
||||
```
|
||||
262
vendor/github.com/hyperhq/hypercli/docs/admin/configuring.md
generated
vendored
Normal file
@@ -0,0 +1,262 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/articles/configuring/"]
|
||||
title = "Configuring and running Docker"
|
||||
description = "Configuring and running the Docker daemon on various distributions"
|
||||
keywords = ["docker, daemon, configuration, running, process managers"]
|
||||
[menu.main]
|
||||
parent = "engine_admin"
|
||||
weight = 3
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Configuring and running Docker on various distributions
|
||||
|
||||
After successfully installing Docker, the `docker` daemon runs with its default
|
||||
configuration.
|
||||
|
||||
In a production environment, system administrators typically configure the
|
||||
`docker` daemon to start and stop according to an organization's requirements. In most
|
||||
cases, the system administrator configures a process manager such as `SysVinit`, `Upstart`,
|
||||
or `systemd` to manage the `docker` daemon's start and stop.
|
||||
|
||||
### Running the docker daemon directly
|
||||
|
||||
The `docker` daemon can be run directly using the `docker daemon` command. By default it listens on
|
||||
the Unix socket `unix:///var/run/docker.sock`
|
||||
|
||||
$ docker daemon
|
||||
|
||||
INFO[0000] +job init_networkdriver()
|
||||
INFO[0000] +job serveapi(unix:///var/run/docker.sock)
|
||||
INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
|
||||
...
|
||||
...
|
||||
|
||||
### Configuring the docker daemon directly
|
||||
|
||||
If you're running the `docker` daemon directly by running `docker daemon` instead
|
||||
of using a process manager, you can append the configuration options to the `docker` run
|
||||
command directly. Other options can be passed to the `docker` daemon to configure it.
|
||||
|
||||
Some of the daemon's options are:
|
||||
|
||||
| Flag | Description |
|
||||
|-----------------------|-----------------------------------------------------------|
|
||||
| `-D`, `--debug=false` | Enable or disable debug mode. By default, this is false. |
|
||||
| `-H`,`--host=[]` | Daemon socket(s) to connect to. |
|
||||
| `--tls=false` | Enable or disable TLS. By default, this is false. |
|
||||
|
||||
|
||||
Here is a an example of running the `docker` daemon with configuration options:
|
||||
|
||||
$ docker daemon -D --tls=true --tlscert=/var/docker/server.pem --tlskey=/var/docker/serverkey.pem -H tcp://192.168.59.3:2376
|
||||
|
||||
These options :
|
||||
|
||||
- Enable `-D` (debug) mode
|
||||
- Set `tls` to true with the server certificate and key specified using `--tlscert` and `--tlskey` respectively
|
||||
- Listen for connections on `tcp://192.168.59.3:2376`
|
||||
|
||||
The command line reference has the [complete list of daemon flags](../reference/commandline/daemon.md)
|
||||
with explanations.
|
||||
|
||||
## Ubuntu
|
||||
|
||||
As of `14.04`, Ubuntu uses Upstart as a process manager. By default, Upstart jobs
|
||||
are located in `/etc/init` and the `docker` Upstart job can be found at `/etc/init/docker.conf`.
|
||||
|
||||
After successfully [installing Docker for Ubuntu](../installation/linux/ubuntulinux.md),
|
||||
you can check the running status using Upstart in this way:
|
||||
|
||||
$ sudo status docker
|
||||
|
||||
docker start/running, process 989
|
||||
|
||||
### Running Docker
|
||||
|
||||
You can start/stop/restart the `docker` daemon using
|
||||
|
||||
$ sudo start docker
|
||||
|
||||
$ sudo stop docker
|
||||
|
||||
$ sudo restart docker
|
||||
|
||||
|
||||
### Configuring Docker
|
||||
|
||||
The instructions below depict configuring Docker on a system that uses `upstart`
|
||||
as the process manager. As of Ubuntu 15.04, Ubuntu uses `systemd` as its process
|
||||
manager. For Ubuntu 15.04 and higher, refer to [control and configure Docker with systemd](systemd.md).
|
||||
|
||||
You configure the `docker` daemon in the `/etc/default/docker` file on your
|
||||
system. You do this by specifying values in a `DOCKER_OPTS` variable.
|
||||
|
||||
To configure Docker options:
|
||||
|
||||
1. Log into your host as a user with `sudo` or `root` privileges.
|
||||
|
||||
2. If you don't have one, create the `/etc/default/docker` file on your host. Depending on how
|
||||
you installed Docker, you may already have this file.
|
||||
|
||||
3. Open the file with your favorite editor.
|
||||
|
||||
```
|
||||
$ sudo vi /etc/default/docker
|
||||
```
|
||||
|
||||
4. Add a `DOCKER_OPTS` variable with the following options. These options are appended to the
|
||||
`docker` daemon's run command.
|
||||
|
||||
```
|
||||
DOCKER_OPTS="-D --tls=true --tlscert=/var/docker/server.pem --tlskey=/var/docker/serverkey.pem -H tcp://192.168.59.3:2376"
|
||||
```
|
||||
|
||||
These options :
|
||||
|
||||
- Enable `-D` (debug) mode
|
||||
- Set `tls` to true with the server certificate and key specified using `--tlscert` and `--tlskey` respectively
|
||||
- Listen for connections on `tcp://192.168.59.3:2376`
|
||||
|
||||
The command line reference has the [complete list of daemon flags](../reference/commandline/daemon.md)
|
||||
with explanations.
|
||||
|
||||
|
||||
5. Save and close the file.
|
||||
|
||||
6. Restart the `docker` daemon.
|
||||
|
||||
```
|
||||
$ sudo restart docker
|
||||
```
|
||||
|
||||
7. Verify that the `docker` daemon is running as specified with the `ps` command.
|
||||
|
||||
```
|
||||
$ ps aux | grep docker | grep -v grep
|
||||
```
|
||||
|
||||
### Logs
|
||||
|
||||
By default logs for Upstart jobs are located in `/var/log/upstart` and the logs for `docker` daemon
|
||||
can be located at `/var/log/upstart/docker.log`
|
||||
|
||||
$ tail -f /var/log/upstart/docker.log
|
||||
INFO[0000] Loading containers: done.
|
||||
INFO[0000] docker daemon: 1.6.0 4749651; execdriver: native-0.2; graphdriver: aufs
|
||||
INFO[0000] +job acceptconnections()
|
||||
INFO[0000] -job acceptconnections() = OK (0)
|
||||
INFO[0000] Daemon has completed initialization
|
||||
|
||||
|
||||
## CentOS / Red Hat Enterprise Linux / Fedora
|
||||
|
||||
As of `7.x`, CentOS and RHEL use `systemd` as the process manager. As of `21`, Fedora uses
|
||||
`systemd` as its process manager.
|
||||
|
||||
After successfully installing Docker for [CentOS](../installation/linux/centos.md)/[Red Hat Enterprise Linux](../installation/linux/rhel.md)/[Fedora](../installation/linux/fedora.md), you can check the running status in this way:
|
||||
|
||||
$ sudo systemctl status docker
|
||||
|
||||
### Running Docker
|
||||
|
||||
You can start/stop/restart the `docker` daemon using
|
||||
|
||||
$ sudo systemctl start docker
|
||||
|
||||
$ sudo systemctl stop docker
|
||||
|
||||
$ sudo systemctl restart docker
|
||||
|
||||
If you want Docker to start at boot, you should also:
|
||||
|
||||
$ sudo systemctl enable docker
|
||||
|
||||
### Configuring Docker
|
||||
|
||||
For CentOS 7.x and RHEL 7.x you can [control and configure Docker with systemd](systemd.md).
|
||||
|
||||
Previously, for CentOS 6.x and RHEL 6.x you would configure the `docker` daemon in
|
||||
the `/etc/sysconfig/docker` file on your system. You would do this by specifying
|
||||
values in a `other_args` variable. For a short time in CentOS 7.x and RHEL 7.x you
|
||||
would specify values in a `OPTIONS` variable. This is no longer recommended in favor
|
||||
of using systemd directly.
|
||||
|
||||
For this section, we will use CentOS 7.x as an example to configure the `docker` daemon.
|
||||
|
||||
To configure Docker options:
|
||||
|
||||
1. Log into your host as a user with `sudo` or `root` privileges.
|
||||
|
||||
2. Create the `/etc/systemd/system/docker.service.d` directory.
|
||||
|
||||
```
|
||||
$ sudo mkdir /etc/systemd/system/docker.service.d
|
||||
```
|
||||
|
||||
3. Create a `/etc/systemd/system/docker.service.d/docker.conf` file.
|
||||
|
||||
4. Open the file with your favorite editor.
|
||||
|
||||
```
|
||||
$ sudo vi /etc/systemd/system/docker.service.d/docker.conf
|
||||
```
|
||||
|
||||
5. Override the `ExecStart` configuration from your `docker.service` file to customize
|
||||
the `docker` daemon. To modify the `ExecStart` configuration you have to specify
|
||||
an empty configuration followed by a new one as follows:
|
||||
|
||||
```
|
||||
[Service]
|
||||
ExecStart=
|
||||
ExecStart=/usr/bin/docker daemon -H fd:// -D --tls=true --tlscert=/var/docker/server.pem --tlskey=/var/docker/serverkey.pem -H tcp://192.168.59.3:2376
|
||||
```
|
||||
|
||||
These options :
|
||||
|
||||
- Enable `-D` (debug) mode
|
||||
- Set `tls` to true with the server certificate and key specified using `--tlscert` and `--tlskey` respectively
|
||||
- Listen for connections on `tcp://192.168.59.3:2376`
|
||||
|
||||
The command line reference has the [complete list of daemon flags](../reference/commandline/daemon.md)
|
||||
with explanations.
|
||||
|
||||
6. Save and close the file.
|
||||
|
||||
7. Flush changes.
|
||||
|
||||
```
|
||||
$ sudo systemctl daemon-reload
|
||||
```
|
||||
|
||||
8. Restart the `docker` daemon.
|
||||
|
||||
```
|
||||
$ sudo systemctl restart docker
|
||||
```
|
||||
|
||||
9. Verify that the `docker` daemon is running as specified with the `ps` command.
|
||||
|
||||
```
|
||||
$ ps aux | grep docker | grep -v grep
|
||||
```
|
||||
|
||||
### Logs
|
||||
|
||||
systemd has its own logging system called the journal. The logs for the `docker` daemon can
|
||||
be viewed using `journalctl -u docker`
|
||||
|
||||
$ sudo journalctl -u docker
|
||||
May 06 00:22:05 localhost.localdomain systemd[1]: Starting Docker Application Container Engine...
|
||||
May 06 00:22:05 localhost.localdomain docker[2495]: time="2015-05-06T00:22:05Z" level="info" msg="+job serveapi(unix:///var/run/docker.sock)"
|
||||
May 06 00:22:05 localhost.localdomain docker[2495]: time="2015-05-06T00:22:05Z" level="info" msg="Listening for HTTP on unix (/var/run/docker.sock)"
|
||||
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="+job init_networkdriver()"
|
||||
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="-job init_networkdriver() = OK (0)"
|
||||
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="Loading containers: start."
|
||||
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="Loading containers: done."
|
||||
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="docker daemon: 1.5.0-dev fc0329b/1.5.0; execdriver: native-0.2; graphdriver: devicemapper"
|
||||
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="+job acceptconnections()"
|
||||
May 06 00:22:06 localhost.localdomain docker[2495]: time="2015-05-06T00:22:06Z" level="info" msg="-job acceptconnections() = OK (0)"
|
||||
|
||||
_Note: Using and configuring journal is an advanced topic and is beyond the scope of this article._
|
||||
174
vendor/github.com/hyperhq/hypercli/docs/admin/dsc.md
generated
vendored
Normal file
@@ -0,0 +1,174 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/articles/dsc/"]
|
||||
title = "PowerShell DSC Usage"
|
||||
description = "Using DSC to configure a new Docker host"
|
||||
keywords = ["powershell, dsc, installation, usage, docker, documentation"]
|
||||
[menu.main]
|
||||
parent = "engine_admin"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Using PowerShell DSC
|
||||
|
||||
Windows PowerShell Desired State Configuration (DSC) is a configuration
|
||||
management tool that extends the existing functionality of Windows PowerShell.
|
||||
DSC uses a declarative syntax to define the state in which a target should be
|
||||
configured. More information about PowerShell DSC can be found at
|
||||
[http://technet.microsoft.com/en-us/library/dn249912.aspx](http://technet.microsoft.com/en-us/library/dn249912.aspx).
|
||||
|
||||
## Requirements
|
||||
|
||||
To use this guide you'll need a Windows host with PowerShell v4.0 or newer.
|
||||
|
||||
The included DSC configuration script also uses the official PPA so
|
||||
only an Ubuntu target is supported. The Ubuntu target must already have the
|
||||
required OMI Server and PowerShell DSC for Linux providers installed. More
|
||||
information can be found at [https://github.com/MSFTOSSMgmt/WPSDSCLinux](https://github.com/MSFTOSSMgmt/WPSDSCLinux).
|
||||
The source repository listed below also includes PowerShell DSC for Linux
|
||||
installation and init scripts along with more detailed installation information.
|
||||
|
||||
## Installation
|
||||
|
||||
The DSC configuration example source is available in the following repository:
|
||||
[https://github.com/anweiss/DockerClientDSC](https://github.com/anweiss/DockerClientDSC). It can be cloned with:
|
||||
|
||||
$ git clone https://github.com/anweiss/DockerClientDSC.git
|
||||
|
||||
## Usage
|
||||
|
||||
The DSC configuration utilizes a set of shell scripts to determine whether or
|
||||
not the specified Docker components are configured on the target node(s). The
|
||||
source repository also includes a script (`RunDockerClientConfig.ps1`) that can
|
||||
be used to establish the required CIM session(s) and execute the
|
||||
`Set-DscConfiguration` cmdlet.
|
||||
|
||||
More detailed usage information can be found at
|
||||
[https://github.com/anweiss/DockerClientDSC](https://github.com/anweiss/DockerClientDSC).
|
||||
|
||||
### Install Docker
|
||||
The Docker installation configuration is equivalent to running:
|
||||
|
||||
```
|
||||
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys\
|
||||
36A1D7869245C8950F966E92D8576A8BA88D21E9
|
||||
sh -c "echo deb https://apt.dockerproject.org/repo ubuntu-trusty main\
|
||||
> /etc/apt/sources.list.d/docker.list"
|
||||
apt-get update
|
||||
apt-get install docker-engine
|
||||
```
|
||||
|
||||
Ensure that your current working directory is set to the `DockerClientDSC`
|
||||
source and load the DockerClient configuration into the current PowerShell
|
||||
session
|
||||
|
||||
```powershell
|
||||
. .\DockerClient.ps1
|
||||
```
|
||||
|
||||
Generate the required DSC configuration .mof file for the targeted node
|
||||
|
||||
```powershell
|
||||
DockerClient -Hostname "myhost"
|
||||
```
|
||||
|
||||
A sample DSC configuration data file has also been included and can be modified
|
||||
and used in conjunction with or in place of the `Hostname` parameter:
|
||||
|
||||
```powershell
|
||||
DockerClient -ConfigurationData .\DockerConfigData.psd1
|
||||
```
|
||||
|
||||
Start the configuration application process on the targeted node
|
||||
|
||||
```powershell
|
||||
.\RunDockerClientConfig.ps1 -Hostname "myhost"
|
||||
```
|
||||
|
||||
The `RunDockerClientConfig.ps1` script can also parse a DSC configuration data
|
||||
file and execute configurations against multiple nodes as such:
|
||||
|
||||
```powershell
|
||||
.\RunDockerClientConfig.ps1 -ConfigurationData .\DockerConfigData.psd1
|
||||
```
|
||||
|
||||
### Images
|
||||
Image configuration is equivalent to running: `docker pull [image]` or
|
||||
`docker rmi -f [IMAGE]`.
|
||||
|
||||
Using the same steps defined above, execute `DockerClient` with the `Image`
|
||||
parameter and apply the configuration:
|
||||
|
||||
```powershell
|
||||
DockerClient -Hostname "myhost" -Image "node"
|
||||
.\RunDockerClientConfig.ps1 -Hostname "myhost"
|
||||
```
|
||||
|
||||
You can also configure the host to pull multiple images:
|
||||
|
||||
```powershell
|
||||
DockerClient -Hostname "myhost" -Image "node","mongo"
|
||||
.\RunDockerClientConfig.ps1 -Hostname "myhost"
|
||||
```
|
||||
|
||||
To remove images, use a hashtable as follows:
|
||||
|
||||
```powershell
|
||||
DockerClient -Hostname "myhost" -Image @{Name="node"; Remove=$true}
|
||||
.\RunDockerClientConfig.ps1 -Hostname $hostname
|
||||
```
|
||||
|
||||
### Containers
|
||||
Container configuration is equivalent to running:
|
||||
|
||||
```
|
||||
docker run -d --name="[containername]" -p '[port]' -e '[env]' --link '[link]'\
|
||||
'[image]' '[command]'
|
||||
```
|
||||
or
|
||||
|
||||
```
|
||||
docker rm -f [containername]
|
||||
```
|
||||
|
||||
To create or remove containers, you can use the `Container` parameter with one
|
||||
or more hashtables. The hashtable(s) passed to this parameter can have the
|
||||
following properties:
|
||||
|
||||
- Name (required)
|
||||
- Image (required unless Remove property is set to `$true`)
|
||||
- Port
|
||||
- Env
|
||||
- Link
|
||||
- Command
|
||||
- Remove
|
||||
|
||||
For example, create a hashtable with the settings for your container:
|
||||
|
||||
```powershell
|
||||
$webContainer = @{Name="web"; Image="anweiss/docker-platynem"; Port="80:80"}
|
||||
```
|
||||
|
||||
Then, using the same steps defined above, execute
|
||||
`DockerClient` with the `-Image` and `-Container` parameters:
|
||||
|
||||
```powershell
|
||||
DockerClient -Hostname "myhost" -Image node -Container $webContainer
|
||||
.\RunDockerClientConfig.ps1 -Hostname "myhost"
|
||||
```
|
||||
|
||||
Existing containers can also be removed as follows:
|
||||
|
||||
```powershell
|
||||
$containerToRemove = @{Name="web"; Remove=$true}
|
||||
DockerClient -Hostname "myhost" -Container $containerToRemove
|
||||
.\RunDockerClientConfig.ps1 -Hostname "myhost"
|
||||
```
|
||||
|
||||
Here is a hashtable with all of the properties that can be used to create a
|
||||
container:
|
||||
|
||||
```powershell
|
||||
$containerProps = @{Name="web"; Image="node:latest"; Port="80:80"; `
|
||||
Env="PORT=80"; Link="db:db"; Command="grunt"}
|
||||
```
|
||||
88
vendor/github.com/hyperhq/hypercli/docs/admin/host_integration.md
generated
vendored
Normal file
@@ -0,0 +1,88 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/articles/host_integration/"]
|
||||
title = "Automatically start containers"
|
||||
description = "How to generate scripts for upstart, systemd, etc."
|
||||
keywords = ["systemd, upstart, supervisor, docker, documentation, host integration"]
|
||||
[menu.main]
|
||||
parent = "engine_admin"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Automatically start containers
|
||||
|
||||
As of Docker 1.2,
|
||||
[restart policies](../reference/run.md#restart-policies-restart) are the
|
||||
built-in Docker mechanism for restarting containers when they exit. If set,
|
||||
restart policies will be used when the Docker daemon starts up, as typically
|
||||
happens after a system boot. Restart policies will ensure that linked containers
|
||||
are started in the correct order.
|
||||
|
||||
If restart policies don't suit your needs (i.e., you have non-Docker processes
|
||||
that depend on Docker containers), you can use a process manager like
|
||||
[upstart](http://upstart.ubuntu.com/),
|
||||
[systemd](http://freedesktop.org/wiki/Software/systemd/) or
|
||||
[supervisor](http://supervisord.org/) instead.
|
||||
|
||||
|
||||
## Using a process manager
|
||||
|
||||
Docker does not set any restart policies by default, but be aware that they will
|
||||
conflict with most process managers. So don't set restart policies if you are
|
||||
using a process manager.
|
||||
|
||||
When you have finished setting up your image and are happy with your
|
||||
running container, you can then attach a process manager to manage it.
|
||||
When you run `docker start -a`, Docker will automatically attach to the
|
||||
running container, or start it if needed and forward all signals so that
|
||||
the process manager can detect when a container stops and correctly
|
||||
restart it.
|
||||
|
||||
Here are a few sample scripts for systemd and upstart to integrate with
|
||||
Docker.
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
The examples below show configuration files for two popular process managers,
|
||||
upstart and systemd. In these examples, we'll assume that we have already
|
||||
created a container to run Redis with `--name=redis_server`. These files define
|
||||
a new service that will be started after the docker daemon service has started.
|
||||
|
||||
|
||||
### upstart
|
||||
|
||||
description "Redis container"
|
||||
author "Me"
|
||||
start on filesystem and started docker
|
||||
stop on runlevel [!2345]
|
||||
respawn
|
||||
script
|
||||
/usr/bin/docker start -a redis_server
|
||||
end script
|
||||
|
||||
### systemd
|
||||
|
||||
[Unit]
|
||||
Description=Redis container
|
||||
Requires=docker.service
|
||||
After=docker.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
ExecStart=/usr/bin/docker start -a redis_server
|
||||
ExecStop=/usr/bin/docker stop -t 2 redis_server
|
||||
|
||||
[Install]
|
||||
WantedBy=local.target
|
||||
|
||||
If you need to pass options to the redis container (such as `--env`),
|
||||
then you'll need to use `docker run` rather than `docker start`. This will
|
||||
create a new container every time the service is started, which will be stopped
|
||||
and removed when the service is stopped.
|
||||
|
||||
[Service]
|
||||
...
|
||||
ExecStart=/usr/bin/docker run --env foo=bar --name redis_server redis
|
||||
ExecStop=/usr/bin/docker stop -t 2 redis_server ; /usr/bin/docker rm -f redis_server
|
||||
...
|
||||
11
vendor/github.com/hyperhq/hypercli/docs/admin/index.md
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
<!-- [metadata]>
|
||||
+++
|
||||
title = "Administrate"
|
||||
description = "Administrate"
|
||||
keywords = ["Administrate"]
|
||||
[menu.main]
|
||||
parent="engine_use"
|
||||
identifier="engine_admin"
|
||||
weight="-70"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
90
vendor/github.com/hyperhq/hypercli/docs/admin/logging/awslogs.md
generated
vendored
Normal file
@@ -0,0 +1,90 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/reference/logging/awslogs/"]
|
||||
title = "Amazon CloudWatch Logs logging driver"
|
||||
description = "Describes how to use the Amazon CloudWatch Logs logging driver."
|
||||
keywords = ["AWS, Amazon, CloudWatch, logging, driver"]
|
||||
[menu.main]
|
||||
parent = "smn_logging"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Amazon CloudWatch Logs logging driver
|
||||
|
||||
The `awslogs` logging driver sends container logs to
|
||||
[Amazon CloudWatch Logs](https://aws.amazon.com/cloudwatch/details/#log-monitoring).
|
||||
Log entries can be retrieved through the [AWS Management
|
||||
Console](https://console.aws.amazon.com/cloudwatch/home#logs:) or the [AWS SDKs
|
||||
and Command Line Tools](http://docs.aws.amazon.com/cli/latest/reference/logs/index.html).
|
||||
|
||||
## Usage
|
||||
|
||||
You can configure the default logging driver by passing the `--log-driver`
|
||||
option to the Docker daemon:
|
||||
|
||||
docker daemon --log-driver=awslogs
|
||||
|
||||
You can set the logging driver for a specific container by using the
|
||||
`--log-driver` option to `docker run`:
|
||||
|
||||
docker run --log-driver=awslogs ...
|
||||
|
||||
## Amazon CloudWatch Logs options
|
||||
|
||||
You can use the `--log-opt NAME=VALUE` flag to specify Amazon CloudWatch Logs logging driver options.
|
||||
|
||||
### awslogs-region
|
||||
|
||||
The `awslogs` logging driver sends your Docker logs to a specific region. Use
|
||||
the `awslogs-region` log option or the `AWS_REGION` environment variable to set
|
||||
the region. By default, if your Docker daemon is running on an EC2 instance
|
||||
and no region is set, the driver uses the instance's region.
|
||||
|
||||
docker run --log-driver=awslogs --log-opt awslogs-region=us-east-1 ...
|
||||
|
||||
### awslogs-group
|
||||
|
||||
You must specify a
|
||||
[log group](http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchLogs.html)
|
||||
for the `awslogs` logging driver. You can specify the log group with the
|
||||
`awslogs-group` log option:
|
||||
|
||||
docker run --log-driver=awslogs --log-opt awslogs-region=us-east-1 --log-opt awslogs-group=myLogGroup ...
|
||||
|
||||
### awslogs-stream
|
||||
|
||||
To configure which
|
||||
[log stream](http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchLogs.html)
|
||||
should be used, you can specify the `awslogs-stream` log option. If not
|
||||
specified, the container ID is used as the log stream.
|
||||
|
||||
> **Note:**
|
||||
> Log streams within a given log group should only be used by one container
|
||||
> at a time. Using the same log stream for multiple containers concurrently
|
||||
> can cause reduced logging performance.
|
||||
|
||||
## Credentials
|
||||
|
||||
You must provide AWS credentials to the Docker daemon to use the `awslogs`
|
||||
logging driver. You can provide these credentials with the `AWS_ACCESS_KEY_ID`,
|
||||
`AWS_SECRET_ACCESS_KEY`, and `AWS_SESSION_TOKEN` environment variables, the
|
||||
default AWS shared credentials file (`~/.aws/credentials` of the root user), or
|
||||
(if you are running the Docker daemon on an Amazon EC2 instance) the Amazon EC2
|
||||
instance profile.
|
||||
|
||||
Credentials must have a policy applied that allows the `logs:CreateLogStream`
|
||||
and `logs:PutLogEvents` actions, as shown in the following example.
|
||||
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Action": [
|
||||
"logs:CreateLogStream",
|
||||
"logs:PutLogEvents"
|
||||
],
|
||||
"Effect": "Allow",
|
||||
"Resource": "*"
|
||||
}
|
||||
]
|
||||
}
|
||||
127
vendor/github.com/hyperhq/hypercli/docs/admin/logging/fluentd.md
generated
vendored
Normal file
@@ -0,0 +1,127 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/reference/logging/fluentd/"]
|
||||
title = "Fluentd logging driver"
|
||||
description = "Describes how to use the fluentd logging driver."
|
||||
keywords = ["Fluentd, docker, logging, driver"]
|
||||
[menu.main]
|
||||
parent = "smn_logging"
|
||||
weight=2
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Fluentd logging driver
|
||||
|
||||
The `fluentd` logging driver sends container logs to the
|
||||
[Fluentd](http://www.fluentd.org/) collector as structured log data. Then, users
|
||||
can use any of the [various output plugins of
|
||||
Fluentd](http://www.fluentd.org/plugins) to write these logs to various
|
||||
destinations.
|
||||
|
||||
In addition to the log message itself, the `fluentd` log
|
||||
driver sends the following metadata in the structured log message:
|
||||
|
||||
| Field | Description |
|
||||
-------------------|-------------------------------------|
|
||||
| `container_id` | The full 64-character container ID. |
|
||||
| `container_name` | The container name at the time it was started. If you use `docker rename` to rename a container, the new name is not reflected in the journal entries. |
|
||||
| `source` | `stdout` or `stderr` |
|
||||
|
||||
The `docker logs` command is not available for this logging driver.
|
||||
|
||||
## Usage
|
||||
|
||||
Some options are supported by specifying `--log-opt` as many times as needed:
|
||||
|
||||
- `fluentd-address`: specify `host:port` to connect `localhost:24224`
|
||||
- `tag`: specify tag for fluentd message, which interpret some markup, ex `{{.ID}}`, `{{.FullID}}` or `{{.Name}}` `docker.{{.ID}}`
|
||||
- `fail-on-startup-error`: true/false; Should the logging driver fail container startup in case of connect error during startup. Default: true (backwards compatible)
|
||||
- `buffer-limit`: Size limit (bytes) for the buffer which is used to buffer messages in case of connection outages. Default: 1M
|
||||
|
||||
Configure the default logging driver by passing the
|
||||
`--log-driver` option to the Docker daemon:
|
||||
|
||||
docker daemon --log-driver=fluentd
|
||||
|
||||
To set the logging driver for a specific container, pass the
|
||||
`--log-driver` option to `docker run`:
|
||||
|
||||
docker run --log-driver=fluentd ...
|
||||
|
||||
Before using this logging driver, launch a Fluentd daemon. The logging driver
|
||||
connects to this daemon through `localhost:24224` by default. Use the
|
||||
`fluentd-address` option to connect to a different address.
|
||||
|
||||
docker run --log-driver=fluentd --log-opt fluentd-address=myhost.local:24224
|
||||
|
||||
If container cannot connect to the Fluentd daemon, the container stops
|
||||
immediately.
|
||||
|
||||
## Options
|
||||
|
||||
Users can use the `--log-opt NAME=VALUE` flag to specify additional Fluentd logging driver options.
|
||||
|
||||
### fluentd-address
|
||||
|
||||
By default, the logging driver connects to `localhost:24224`. Supply the
|
||||
`fluentd-address` option to connect to a different address.
|
||||
|
||||
docker run --log-driver=fluentd --log-opt fluentd-address=myhost.local:24224
|
||||
|
||||
### tag
|
||||
|
||||
By default, Docker uses the first 12 characters of the container ID to tag log messages.
|
||||
Refer to the [log tag option documentation](log_tags.md) for customizing
|
||||
the log tag format.
|
||||
|
||||
|
||||
### labels and env
|
||||
|
||||
The `labels` and `env` options each take a comma-separated list of keys. If there is collision between `label` and `env` keys, the value of the `env` takes precedence. Both options add additional fields to the extra attributes of a logging message.
|
||||
|
||||
### fail-on-startup-error
|
||||
|
||||
By default, if the logging driver cannot connect to the backend it will fail the entire startup of the container. If you wish to ignore potential connect error during container startup supply the `fail-on-startup-error` flag.
|
||||
|
||||
docker run --log-driver=fluentd --log-opt fail-on-startup-error=false
|
||||
|
||||
|
||||
### buffer-limit
|
||||
|
||||
When fluent driver loses connection, or cannot connect at container startup, it will buffer the log events locally for re-transmission. Buffer limit option controls how much data will be buffered locally, **per container**. Specified in bytes.
|
||||
|
||||
docker run --log-driver=fluentd --log-opt buffer-limit=5242880
|
||||
|
||||
The above would result to use 5M buffer locally. Keep in mind that during possible connection errors all your containers will start buffering locally and thus might result in considerable memory usage.
|
||||
|
||||
## Fluentd daemon management with Docker
|
||||
|
||||
About `Fluentd` itself, see [the project webpage](http://www.fluentd.org)
|
||||
and [its documents](http://docs.fluentd.org/).
|
||||
|
||||
To use this logging driver, start the `fluentd` daemon on a host. We recommend
|
||||
that you use [the Fluentd docker
|
||||
image](https://registry.hub.docker.com/u/fluent/fluentd/). This image is
|
||||
especially useful if you want to aggregate multiple container logs on a each
|
||||
host then, later, transfer the logs to another Fluentd node to create an
|
||||
aggregate store.
|
||||
|
||||
### Testing container loggers
|
||||
|
||||
1. Write a configuration file (`test.conf`) to dump input logs:
|
||||
|
||||
<source>
|
||||
@type forward
|
||||
</source>
|
||||
|
||||
<match docker.**>
|
||||
@type stdout
|
||||
</match>
|
||||
|
||||
2. Launch Fluentd container with this configuration file:
|
||||
|
||||
$ docker run -it -p 24224:24224 -v /path/to/conf/test.conf:/fluentd/etc -e FLUENTD_CONF=test.conf fluent/fluentd:latest
|
||||
|
||||
3. Start one or more containers with the `fluentd` logging driver:
|
||||
|
||||
$ docker run --log-driver=fluentd your/application
|
||||
22
vendor/github.com/hyperhq/hypercli/docs/admin/logging/index.md
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/reference/logging/"]
|
||||
title = "Logging"
|
||||
description = "Logging and Logging Drivers"
|
||||
keywords = [" docker, logging, driver"]
|
||||
[menu.main]
|
||||
parent = "engine_admin"
|
||||
identifier = "smn_logging"
|
||||
weight=8
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
|
||||
# Logging Drivers
|
||||
|
||||
* [Configuring logging drivers](overview.md)
|
||||
* [Configuring log tags](log_tags.md)
|
||||
* [Fluentd logging driver](fluentd.md)
|
||||
* [Journald logging driver](journald.md)
|
||||
* [Amazon CloudWatch Logs logging driver](awslogs.md)
|
||||
* [Splunk logging driver](splunk.md)
|
||||
92
vendor/github.com/hyperhq/hypercli/docs/admin/logging/journald.md
generated
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/reference/logging/journald/"]
|
||||
title = "journald logging driver"
|
||||
description = "Describes how to use the fluentd logging driver."
|
||||
keywords = ["Fluentd, docker, logging, driver"]
|
||||
[menu.main]
|
||||
parent = "smn_logging"
|
||||
weight = 2
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Journald logging driver
|
||||
|
||||
The `journald` logging driver sends container logs to the [systemd
|
||||
journal](http://www.freedesktop.org/software/systemd/man/systemd-journald.service.html). Log entries can be retrieved using the `journalctl`
|
||||
command, through use of the journal API, or using the `docker logs` command.
|
||||
|
||||
In addition to the text of the log message itself, the `journald` log
|
||||
driver stores the following metadata in the journal with each message:
|
||||
|
||||
| Field | Description |
|
||||
----------------------|-------------|
|
||||
| `CONTAINER_ID` | The container ID truncated to 12 characters. |
|
||||
| `CONTAINER_ID_FULL` | The full 64-character container ID. |
|
||||
| `CONTAINER_NAME` | The container name at the time it was started. If you use `docker rename` to rename a container, the new name is not reflected in the journal entries. |
|
||||
| `CONTAINER_TAG` | The container tag ([log tag option documentation](log_tags.md)). |
|
||||
|
||||
## Usage
|
||||
|
||||
You can configure the default logging driver by passing the
|
||||
`--log-driver` option to the Docker daemon:
|
||||
|
||||
docker daemon --log-driver=journald
|
||||
|
||||
You can set the logging driver for a specific container by using the
|
||||
`--log-driver` option to `docker run`:
|
||||
|
||||
docker run --log-driver=journald ...
|
||||
|
||||
## Options
|
||||
|
||||
Users can use the `--log-opt NAME=VALUE` flag to specify additional
|
||||
journald logging driver options.
|
||||
|
||||
### tag
|
||||
|
||||
Specify template to set `CONTAINER_TAG` value in journald logs. Refer to
|
||||
[log tag option documentation](log_tags.md) for customizing the log tag format.
|
||||
|
||||
### labels and env
|
||||
|
||||
The `labels` and `env` options each take a comma-separated list of keys. If there is collision between `label` and `env` keys, the value of the `env` takes precedence. Both options add additional metadata in the journal with each message.
|
||||
|
||||
## Note regarding container names
|
||||
|
||||
The value logged in the `CONTAINER_NAME` field is the container name
|
||||
that was set at startup. If you use `docker rename` to rename a
|
||||
container, the new name will not be reflected in the journal entries.
|
||||
Journal entries will continue to use the original name.
|
||||
|
||||
## Retrieving log messages with journalctl
|
||||
|
||||
You can use the `journalctl` command to retrieve log messages. You
|
||||
can apply filter expressions to limit the retrieved messages to a
|
||||
specific container. For example, to retrieve all log messages from a
|
||||
container referenced by name:
|
||||
|
||||
# journalctl CONTAINER_NAME=webserver
|
||||
|
||||
You can make use of additional filters to further limit the messages
|
||||
retrieved. For example, to see just those messages generated since
|
||||
the system last booted:
|
||||
|
||||
# journalctl -b CONTAINER_NAME=webserver
|
||||
|
||||
Or to retrieve log messages in JSON format with complete metadata:
|
||||
|
||||
# journalctl -o json CONTAINER_NAME=webserver
|
||||
|
||||
## Retrieving log messages with the journal API
|
||||
|
||||
This example uses the `systemd` Python module to retrieve container
|
||||
logs:
|
||||
|
||||
import systemd.journal
|
||||
|
||||
reader = systemd.journal.Reader()
|
||||
reader.add_match('CONTAINER_NAME=web')
|
||||
|
||||
for msg in reader:
|
||||
print '{CONTAINER_ID_FULL}: {MESSAGE}'.format(**msg)
|
||||
51
vendor/github.com/hyperhq/hypercli/docs/admin/logging/log_tags.md
generated
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/reference/logging/log_tags/"]
|
||||
title = "Log tags for logging driver"
|
||||
description = "Describes how to format tags for."
|
||||
keywords = ["docker, logging, driver, syslog, Fluentd, gelf, journald"]
|
||||
[menu.main]
|
||||
parent = "smn_logging"
|
||||
weight = 1
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Log Tags
|
||||
|
||||
The `tag` log option specifies how to format a tag that identifies the
|
||||
container's log messages. By default, the system uses the first 12 characters of
|
||||
the container id. To override this behavior, specify a `tag` option:
|
||||
|
||||
```
|
||||
docker run --log-driver=fluentd --log-opt fluentd-address=myhost.local:24224 --log-opt tag="mailer"
|
||||
```
|
||||
|
||||
Docker supports some special template markup you can use when specifying a tag's value:
|
||||
|
||||
| Markup | Description |
|
||||
|--------------------|------------------------------------------------------|
|
||||
| `{{.ID}}` | The first 12 characters of the container id. |
|
||||
| `{{.FullID}}` | The full container id. |
|
||||
| `{{.Name}}` | The container name. |
|
||||
| `{{.ImageID}}` | The first 12 characters of the container's image id. |
|
||||
| `{{.ImageFullID}}` | The container's full image identifier. |
|
||||
| `{{.ImageName}}` | The name of the image used by the container. |
|
||||
|
||||
For example, specifying a `--log-opt tag="{{.ImageName}}/{{.Name}}/{{.ID}}"` value yields `syslog` log lines like:
|
||||
|
||||
```
|
||||
Aug 7 18:33:19 HOSTNAME docker/hello-world/foobar/5790672ab6a0[9103]: Hello from Docker.
|
||||
```
|
||||
|
||||
At startup time, the system sets the `container_name` field and `{{.Name}}` in
|
||||
the tags. If you use `docker rename` to rename a container, the new name is not
|
||||
reflected in the log messages. Instead, these messages continue to use the
|
||||
original container name.
|
||||
|
||||
For advanced usage, the generated tag's use [go
|
||||
templates](http://golang.org/pkg/text/template/) and the container's [logging
|
||||
context](https://github.com/docker/docker/blob/master/daemon/logger/context.go).
|
||||
|
||||
>**Note**:The driver specific log options `syslog-tag`, `fluentd-tag` and
|
||||
>`gelf-tag` still work for backwards compatibility. However, going forward you
|
||||
>should standardize on using the generic `tag` log option instead.
|
||||
206
vendor/github.com/hyperhq/hypercli/docs/admin/logging/overview.md
generated
vendored
Normal file
@@ -0,0 +1,206 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/reference/logging/overview/"]
|
||||
title = "Configuring Logging Drivers"
|
||||
description = "Configure logging driver."
|
||||
keywords = ["docker, logging, driver, Fluentd"]
|
||||
[menu.main]
|
||||
parent = "smn_logging"
|
||||
weight=-1
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
|
||||
# Configure logging drivers
|
||||
|
||||
The container can have a different logging driver than the Docker daemon. Use
|
||||
the `--log-driver=VALUE` with the `docker run` command to configure the
|
||||
container's logging driver. The following options are supported:
|
||||
|
||||
| `none` | Disables any logging for the container. `docker logs` won't be available with this driver. |
|
||||
|-------------|-------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `json-file` | Default logging driver for Docker. Writes JSON messages to file. |
|
||||
| `syslog` | Syslog logging driver for Docker. Writes log messages to syslog. |
|
||||
| `journald` | Journald logging driver for Docker. Writes log messages to `journald`. |
|
||||
| `gelf` | Graylog Extended Log Format (GELF) logging driver for Docker. Writes log messages to a GELF endpoint likeGraylog or Logstash. |
|
||||
| `fluentd` | Fluentd logging driver for Docker. Writes log messages to `fluentd` (forward input). |
|
||||
| `awslogs` | Amazon CloudWatch Logs logging driver for Docker. Writes log messages to Amazon CloudWatch Logs. |
|
||||
| `splunk` | Splunk logging driver for Docker. Writes log messages to `splunk` using HTTP Event Collector. |
|
||||
|
||||
The `docker logs`command is available only for the `json-file` and `journald`
|
||||
logging drivers.
|
||||
|
||||
The `labels` and `env` options add additional attributes for use with logging drivers that accept them. Each option takes a comma-separated list of keys. If there is collision between `label` and `env` keys, the value of the `env` takes precedence.
|
||||
|
||||
To use attributes, specify them when you start the Docker daemon.
|
||||
|
||||
```
|
||||
docker daemon --log-driver=json-file --log-opt labels=foo --log-opt env=foo,fizz
|
||||
```
|
||||
|
||||
Then, run a container and specify values for the `labels` or `env`. For example, you might use this:
|
||||
|
||||
```
|
||||
docker run --label foo=bar -e fizz=buzz -d -P training/webapp python app.py
|
||||
```
|
||||
|
||||
This adds additional fields to the log depending on the driver, e.g. for
|
||||
`json-file` that looks like:
|
||||
|
||||
"attrs":{"fizz":"buzz","foo":"bar"}
|
||||
|
||||
|
||||
## json-file options
|
||||
|
||||
The following logging options are supported for the `json-file` logging driver:
|
||||
|
||||
--log-opt max-size=[0-9+][k|m|g]
|
||||
--log-opt max-file=[0-9+]
|
||||
--log-opt labels=label1,label2
|
||||
--log-opt env=env1,env2
|
||||
|
||||
Logs that reach `max-size` are rolled over. You can set the size in kilobytes(k), megabytes(m), or gigabytes(g). eg `--log-opt max-size=50m`. If `max-size` is not set, then logs are not rolled over.
|
||||
|
||||
`max-file` specifies the maximum number of files that a log is rolled over before being discarded. eg `--log-opt max-file=100`. If `max-size` is not set, then `max-file` is not honored.
|
||||
|
||||
If `max-size` and `max-file` are set, `docker logs` only returns the log lines from the newest log file.
|
||||
|
||||
|
||||
## syslog options
|
||||
|
||||
The following logging options are supported for the `syslog` logging driver:
|
||||
|
||||
--log-opt syslog-address=[tcp|udp|tcp+tls]://host:port
|
||||
--log-opt syslog-address=unix://path
|
||||
--log-opt syslog-facility=daemon
|
||||
--log-opt syslog-tls-ca-cert=/etc/ca-certificates/custom/ca.pem
|
||||
--log-opt syslog-tls-cert=/etc/ca-certificates/custom/cert.pem
|
||||
--log-opt syslog-tls-key=/etc/ca-certificates/custom/key.pem
|
||||
--log-opt syslog-tls-skip-verify=true
|
||||
--log-opt tag="mailer"
|
||||
|
||||
`syslog-address` specifies the remote syslog server address where the driver connects to.
|
||||
If not specified it defaults to the local unix socket of the running system.
|
||||
If transport is either `tcp` or `udp` and `port` is not specified it defaults to `514`
|
||||
The following example shows how to have the `syslog` driver connect to a `syslog`
|
||||
remote server at `192.168.0.42` on port `123`
|
||||
|
||||
$ docker run --log-driver=syslog --log-opt syslog-address=tcp://192.168.0.42:123
|
||||
|
||||
The `syslog-facility` option configures the syslog facility. By default, the system uses the
|
||||
`daemon` value. To override this behavior, you can provide an integer of 0 to 23 or any of
|
||||
the following named facilities:
|
||||
|
||||
* `kern`
|
||||
* `user`
|
||||
* `mail`
|
||||
* `daemon`
|
||||
* `auth`
|
||||
* `syslog`
|
||||
* `lpr`
|
||||
* `news`
|
||||
* `uucp`
|
||||
* `cron`
|
||||
* `authpriv`
|
||||
* `ftp`
|
||||
* `local0`
|
||||
* `local1`
|
||||
* `local2`
|
||||
* `local3`
|
||||
* `local4`
|
||||
* `local5`
|
||||
* `local6`
|
||||
* `local7`
|
||||
|
||||
`syslog-tls-ca-cert` specifies the absolute path to the trust certificates
|
||||
signed by the CA. This option is ignored if the address protocol is not `tcp+tls`.
|
||||
|
||||
`syslog-tls-cert` specifies the absolute path to the TLS certificate file.
|
||||
This option is ignored if the address protocol is not `tcp+tls`.
|
||||
|
||||
`syslog-tls-key` specifies the absolute path to the TLS key file.
|
||||
This option is ignored if the address protocol is not `tcp+tls`.
|
||||
|
||||
`syslog-tls-skip-verify` configures the TLS verification.
|
||||
This verification is enabled by default, but it can be overriden by setting
|
||||
this option to `true`. This option is ignored if the address protocol is not `tcp+tls`.
|
||||
|
||||
By default, Docker uses the first 12 characters of the container ID to tag log messages.
|
||||
Refer to the [log tag option documentation](log_tags.md) for customizing
|
||||
the log tag format.
|
||||
|
||||
|
||||
## journald options
|
||||
|
||||
The `journald` logging driver stores the container id in the journal's `CONTAINER_ID` field. For detailed information on
|
||||
working with this logging driver, see [the journald logging driver](journald.md)
|
||||
reference documentation.
|
||||
|
||||
## gelf options
|
||||
|
||||
The GELF logging driver supports the following options:
|
||||
|
||||
--log-opt gelf-address=udp://host:port
|
||||
--log-opt tag="database"
|
||||
--log-opt labels=label1,label2
|
||||
--log-opt env=env1,env2
|
||||
|
||||
The `gelf-address` option specifies the remote GELF server address that the
|
||||
driver connects to. Currently, only `udp` is supported as the transport and you must
|
||||
specify a `port` value. The following example shows how to connect the `gelf`
|
||||
driver to a GELF remote server at `192.168.0.42` on port `12201`
|
||||
|
||||
$ docker run --log-driver=gelf --log-opt gelf-address=udp://192.168.0.42:12201
|
||||
|
||||
By default, Docker uses the first 12 characters of the container ID to tag log messages.
|
||||
Refer to the [log tag option documentation](log_tags.md) for customizing
|
||||
the log tag format.
|
||||
|
||||
The `labels` and `env` options are supported by the gelf logging
|
||||
driver. It adds additional key on the `extra` fields, prefixed by an
|
||||
underscore (`_`).
|
||||
|
||||
// […]
|
||||
"_foo": "bar",
|
||||
"_fizz": "buzz",
|
||||
// […]
|
||||
|
||||
|
||||
## fluentd options
|
||||
|
||||
You can use the `--log-opt NAME=VALUE` flag to specify these additional Fluentd logging driver options.
|
||||
|
||||
- `fluentd-address`: specify `host:port` to connect [localhost:24224]
|
||||
- `tag`: specify tag for `fluentd` message,
|
||||
- `fail-on-startup-error`: true/false; Should the logging driver fail container startup in case of connect error during startup. Default: true (backwards compatible)
|
||||
- `buffer-limit`: Size limit (bytes) for the buffer which is used to buffer messages in case of connection outages. Default: 1M
|
||||
|
||||
For example, to specify both additional options:
|
||||
|
||||
`docker run --log-driver=fluentd --log-opt fluentd-address=localhost:24224 --log-opt tag=docker.{{.Name}}`
|
||||
|
||||
If container cannot connect to the Fluentd daemon on the specified address,
|
||||
the container stops immediately. For detailed information on working with this
|
||||
logging driver, see [the fluentd logging driver](fluentd.md)
|
||||
|
||||
|
||||
## Specify Amazon CloudWatch Logs options
|
||||
|
||||
The Amazon CloudWatch Logs logging driver supports the following options:
|
||||
|
||||
--log-opt awslogs-region=<aws_region>
|
||||
--log-opt awslogs-group=<log_group_name>
|
||||
--log-opt awslogs-stream=<log_stream_name>
|
||||
|
||||
|
||||
For detailed information on working with this logging driver, see [the awslogs logging driver](awslogs.md) reference documentation.
|
||||
|
||||
## Splunk options
|
||||
|
||||
The Splunk logging driver requires the following options:
|
||||
|
||||
--log-opt splunk-token=<splunk_http_event_collector_token>
|
||||
--log-opt splunk-url=https://your_splunk_instance:8088
|
||||
|
||||
For detailed information about working with this logging driver, see the [Splunk logging driver](splunk.md)
|
||||
reference documentation.
|
||||
69
vendor/github.com/hyperhq/hypercli/docs/admin/logging/splunk.md
generated
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/reference/logging/splunk/"]
|
||||
title = "Splunk logging driver"
|
||||
description = "Describes how to use the Splunk logging driver."
|
||||
keywords = ["splunk, docker, logging, driver"]
|
||||
[menu.main]
|
||||
parent = "smn_logging"
|
||||
weight = 2
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Splunk logging driver
|
||||
|
||||
The `splunk` logging driver sends container logs to
|
||||
[HTTP Event Collector](http://dev.splunk.com/view/event-collector/SP-CAAAE6M)
|
||||
in Splunk Enterprise and Splunk Cloud.
|
||||
|
||||
## Usage
|
||||
|
||||
You can configure the default logging driver by passing the `--log-driver`
|
||||
option to the Docker daemon:
|
||||
|
||||
docker daemon --log-driver=splunk
|
||||
|
||||
You can set the logging driver for a specific container by using the
|
||||
`--log-driver` option to `docker run`:
|
||||
|
||||
docker run --log-driver=splunk ...
|
||||
|
||||
## Splunk options
|
||||
|
||||
You can use the `--log-opt NAME=VALUE` flag to specify these additional Splunk
|
||||
logging driver options:
|
||||
|
||||
| Option | Required | Description |
|
||||
|-----------------------------|----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `splunk-token` | required | Splunk HTTP Event Collector token. |
|
||||
| `splunk-url` | required | Path to your Splunk Enterprise or Splunk Cloud instance (including port and schema used by HTTP Event Collector) `https://your_splunk_instance:8088`. |
|
||||
| `splunk-source` | optional | Event source. |
|
||||
| `splunk-sourcetype` | optional | Event source type. |
|
||||
| `splunk-index` | optional | Event index. |
|
||||
| `splunk-capath` | optional | Path to root certificate. |
|
||||
| `splunk-caname` | optional | Name to use for validating server certificate; by default the hostname of the `splunk-url` will be used. |
|
||||
| `splunk-insecureskipverify` | optional | Ignore server certificate validation. |
|
||||
| `tag` | optional | Specify tag for message, which interpret some markup. Default value is `{{.ID}}` (12 characters of the container ID). Refer to the [log tag option documentation](log_tags.md) for customizing the log tag format. |
|
||||
| `labels` | optional | Comma-separated list of keys of labels, which should be included in message, if these labels are specified for container. |
|
||||
| `env` | optional | Comma-separated list of keys of environment variables, which should be included in message, if these variables are specified for container. |
|
||||
|
||||
If there is collision between `label` and `env` keys, the value of the `env` takes precedence.
|
||||
Both options add additional fields to the attributes of a logging message.
|
||||
|
||||
Below is an example of the logging option specified for the Splunk Enterprise
|
||||
instance. The instance is installed locally on the same machine on which the
|
||||
Docker daemon is running. The path to the root certificate and Common Name is
|
||||
specified using an HTTPS schema. This is used for verification.
|
||||
The `SplunkServerDefaultCert` is automatically generated by Splunk certificates.
|
||||
|
||||
docker run --log-driver=splunk \
|
||||
--log-opt splunk-token=176FCEBF-4CF5-4EDF-91BC-703796522D20 \
|
||||
--log-opt splunk-url=https://splunkhost:8088 \
|
||||
--log-opt splunk-capath=/path/to/cert/cacert.pem \
|
||||
--log-opt splunk-caname=SplunkServerDefaultCert
|
||||
--log-opt tag="{{.Name}}/{{.FullID}}"
|
||||
--log-opt labels=location
|
||||
--log-opt env=TEST
|
||||
--env "TEST=false"
|
||||
--label location=west
|
||||
your/application
|
||||
100
vendor/github.com/hyperhq/hypercli/docs/admin/puppet.md
generated
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/articles/puppet/"]
|
||||
title = "Using Puppet"
|
||||
description = "Installing and using Puppet"
|
||||
keywords = ["puppet, installation, usage, docker, documentation"]
|
||||
[menu.main]
|
||||
parent = "engine_admin"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Using Puppet
|
||||
|
||||
> *Note:* Please note this is a community contributed installation path. The
|
||||
> only `official` installation is using the
|
||||
> [*Ubuntu*](../installation/linux/ubuntulinux.md) installation
|
||||
> path. This version may sometimes be out of date.
|
||||
|
||||
## Requirements
|
||||
|
||||
To use this guide you'll need a working installation of Puppet from
|
||||
[Puppet Labs](https://puppetlabs.com) .
|
||||
|
||||
The module also currently uses the official PPA so only works with
|
||||
Ubuntu.
|
||||
|
||||
## Installation
|
||||
|
||||
The module is available on the [Puppet
|
||||
Forge](https://forge.puppetlabs.com/garethr/docker/) and can be
|
||||
installed using the built-in module tool.
|
||||
|
||||
$ puppet module install garethr/docker
|
||||
|
||||
It can also be found on
|
||||
[GitHub](https://github.com/garethr/garethr-docker) if you would rather
|
||||
download the source.
|
||||
|
||||
## Usage
|
||||
|
||||
The module provides a puppet class for installing Docker and two defined
|
||||
types for managing images and containers.
|
||||
|
||||
### Installation
|
||||
|
||||
include 'docker'
|
||||
|
||||
### Images
|
||||
|
||||
The next step is probably to install a Docker image. For this, we have a
|
||||
defined type which can be used like so:
|
||||
|
||||
docker::image { 'ubuntu': }
|
||||
|
||||
This is equivalent to running:
|
||||
|
||||
$ docker pull ubuntu
|
||||
|
||||
Note that it will only be downloaded if an image of that name does not
|
||||
already exist. This is downloading a large binary so on first run can
|
||||
take a while. For that reason this define turns off the default 5 minute
|
||||
timeout for the exec type. Note that you can also remove images you no
|
||||
longer need with:
|
||||
|
||||
docker::image { 'ubuntu':
|
||||
ensure => 'absent',
|
||||
}
|
||||
|
||||
### Containers
|
||||
|
||||
Now you have an image where you can run commands within a container
|
||||
managed by Docker.
|
||||
|
||||
docker::run { 'helloworld':
|
||||
image => 'ubuntu',
|
||||
command => '/bin/sh -c "while true; do echo hello world; sleep 1; done"',
|
||||
}
|
||||
|
||||
This is equivalent to running the following command, but under upstart:
|
||||
|
||||
$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
|
||||
|
||||
Run also contains a number of optional parameters:
|
||||
|
||||
docker::run { 'helloworld':
|
||||
image => 'ubuntu',
|
||||
command => '/bin/sh -c "while true; do echo hello world; sleep 1; done"',
|
||||
ports => ['4444', '4555'],
|
||||
volumes => ['/var/lib/couchdb', '/var/log'],
|
||||
volumes_from => '6446ea52fbc9',
|
||||
memory_limit => 10485760, # bytes
|
||||
username => 'example',
|
||||
hostname => 'example.com',
|
||||
env => ['FOO=BAR', 'FOO2=BAR2'],
|
||||
dns => ['8.8.8.8', '8.8.4.4'],
|
||||
}
|
||||
|
||||
> *Note:*
|
||||
> The `ports`, `env`, `dns` and `volumes` attributes can be set with either a single
|
||||
> string or as above with an array of values.
|
||||
19
vendor/github.com/hyperhq/hypercli/docs/admin/registry_mirror.md
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/articles/registry_mirror/"]
|
||||
title = "Run a local registry mirror"
|
||||
description = "How to set up and run a local registry mirror"
|
||||
keywords = ["docker, registry, mirror, examples"]
|
||||
[menu.main]
|
||||
parent = "engine_admin"
|
||||
weight = 8
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Run a local registry mirror
|
||||
|
||||
The original content was deprecated. [An archived
|
||||
version](https://docs.docker.com/v1.6/articles/registry_mirror) is available in
|
||||
the 1.7 documentation. For information about configuring mirrors with the latest
|
||||
Docker Registry version, please file a support request with [the Distribution
|
||||
project](https://github.com/docker/distribution/issues).
|
||||
464
vendor/github.com/hyperhq/hypercli/docs/admin/runmetrics.md
generated
vendored
Normal file
@@ -0,0 +1,464 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/articles/run_metrics"]
|
||||
title = "Runtime metrics"
|
||||
description = "Measure the behavior of running containers"
|
||||
keywords = ["docker, metrics, CPU, memory, disk, IO, run, runtime, stats"]
|
||||
[menu.main]
|
||||
parent = "engine_admin"
|
||||
weight = 4
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Runtime metrics
|
||||
|
||||
|
||||
## Docker stats
|
||||
|
||||
You can use the `docker stats` command to live stream a container's
|
||||
runtime metrics. The command supports CPU, memory usage, memory limit,
|
||||
and network IO metrics.
|
||||
|
||||
The following is a sample output from the `docker stats` command
|
||||
|
||||
$ docker stats redis1 redis2
|
||||
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
|
||||
redis1 0.07% 796 KB / 64 MB 1.21% 788 B / 648 B 3.568 MB / 512 KB
|
||||
redis2 0.07% 2.746 MB / 64 MB 4.29% 1.266 KB / 648 B 12.4 MB / 0 B
|
||||
|
||||
|
||||
The [docker stats](../reference/commandline/stats.md) reference page has
|
||||
more details about the `docker stats` command.
|
||||
|
||||
## Control groups
|
||||
|
||||
Linux Containers rely on [control groups](
|
||||
https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt)
|
||||
which not only track groups of processes, but also expose metrics about
|
||||
CPU, memory, and block I/O usage. You can access those metrics and
|
||||
obtain network usage metrics as well. This is relevant for "pure" LXC
|
||||
containers, as well as for Docker containers.
|
||||
|
||||
Control groups are exposed through a pseudo-filesystem. In recent
|
||||
distros, you should find this filesystem under `/sys/fs/cgroup`. Under
|
||||
that directory, you will see multiple sub-directories, called devices,
|
||||
freezer, blkio, etc.; each sub-directory actually corresponds to a different
|
||||
cgroup hierarchy.
|
||||
|
||||
On older systems, the control groups might be mounted on `/cgroup`, without
|
||||
distinct hierarchies. In that case, instead of seeing the sub-directories,
|
||||
you will see a bunch of files in that directory, and possibly some directories
|
||||
corresponding to existing containers.
|
||||
|
||||
To figure out where your control groups are mounted, you can run:
|
||||
|
||||
$ grep cgroup /proc/mounts
|
||||
|
||||
## Enumerating cgroups
|
||||
|
||||
You can look into `/proc/cgroups` to see the different control group subsystems
|
||||
known to the system, the hierarchy they belong to, and how many groups they contain.
|
||||
|
||||
You can also look at `/proc/<pid>/cgroup` to see which control groups a process
|
||||
belongs to. The control group will be shown as a path relative to the root of
|
||||
the hierarchy mountpoint; e.g., `/` means “this process has not been assigned into
|
||||
a particular group”, while `/lxc/pumpkin` means that the process is likely to be
|
||||
a member of a container named `pumpkin`.
|
||||
|
||||
## Finding the cgroup for a given container
|
||||
|
||||
For each container, one cgroup will be created in each hierarchy. On
|
||||
older systems with older versions of the LXC userland tools, the name of
|
||||
the cgroup will be the name of the container. With more recent versions
|
||||
of the LXC tools, the cgroup will be `lxc/<container_name>.`
|
||||
|
||||
For Docker containers using cgroups, the container name will be the full
|
||||
ID or long ID of the container. If a container shows up as ae836c95b4c3
|
||||
in `docker ps`, its long ID might be something like
|
||||
`ae836c95b4c3c9e9179e0e91015512da89fdec91612f63cebae57df9a5444c79`. You can
|
||||
look it up with `docker inspect` or `docker ps --no-trunc`.
|
||||
|
||||
Putting everything together to look at the memory metrics for a Docker
|
||||
container, take a look at `/sys/fs/cgroup/memory/docker/<longid>/`.
|
||||
|
||||
## Metrics from cgroups: memory, CPU, block I/O
|
||||
|
||||
For each subsystem (memory, CPU, and block I/O), you will find one or
|
||||
more pseudo-files containing statistics.
|
||||
|
||||
### Memory metrics: `memory.stat`
|
||||
|
||||
Memory metrics are found in the "memory" cgroup. Note that the memory
|
||||
control group adds a little overhead, because it does very fine-grained
|
||||
accounting of the memory usage on your host. Therefore, many distros
|
||||
chose to not enable it by default. Generally, to enable it, all you have
|
||||
to do is to add some kernel command-line parameters:
|
||||
`cgroup_enable=memory swapaccount=1`.
|
||||
|
||||
The metrics are in the pseudo-file `memory.stat`.
|
||||
Here is what it will look like:
|
||||
|
||||
cache 11492564992
|
||||
rss 1930993664
|
||||
mapped_file 306728960
|
||||
pgpgin 406632648
|
||||
pgpgout 403355412
|
||||
swap 0
|
||||
pgfault 728281223
|
||||
pgmajfault 1724
|
||||
inactive_anon 46608384
|
||||
active_anon 1884520448
|
||||
inactive_file 7003344896
|
||||
active_file 4489052160
|
||||
unevictable 32768
|
||||
hierarchical_memory_limit 9223372036854775807
|
||||
hierarchical_memsw_limit 9223372036854775807
|
||||
total_cache 11492564992
|
||||
total_rss 1930993664
|
||||
total_mapped_file 306728960
|
||||
total_pgpgin 406632648
|
||||
total_pgpgout 403355412
|
||||
total_swap 0
|
||||
total_pgfault 728281223
|
||||
total_pgmajfault 1724
|
||||
total_inactive_anon 46608384
|
||||
total_active_anon 1884520448
|
||||
total_inactive_file 7003344896
|
||||
total_active_file 4489052160
|
||||
total_unevictable 32768
|
||||
|
||||
The first half (without the `total_` prefix) contains statistics relevant
|
||||
to the processes within the cgroup, excluding sub-cgroups. The second half
|
||||
(with the `total_` prefix) includes sub-cgroups as well.
|
||||
|
||||
Some metrics are "gauges", i.e., values that can increase or decrease
|
||||
(e.g., swap, the amount of swap space used by the members of the cgroup).
|
||||
Some others are "counters", i.e., values that can only go up, because
|
||||
they represent occurrences of a specific event (e.g., pgfault, which
|
||||
indicates the number of page faults which happened since the creation of
|
||||
the cgroup; this number can never decrease).
|
||||
|
||||
|
||||
- **cache:**
|
||||
the amount of memory used by the processes of this control group
|
||||
that can be associated precisely with a block on a block device.
|
||||
When you read from and write to files on disk, this amount will
|
||||
increase. This will be the case if you use "conventional" I/O
|
||||
(`open`, `read`,
|
||||
`write` syscalls) as well as mapped files (with
|
||||
`mmap`). It also accounts for the memory used by
|
||||
`tmpfs` mounts, though the reasons are unclear.
|
||||
|
||||
- **rss:**
|
||||
the amount of memory that *doesn't* correspond to anything on disk:
|
||||
stacks, heaps, and anonymous memory maps.
|
||||
|
||||
- **mapped_file:**
|
||||
indicates the amount of memory mapped by the processes in the
|
||||
control group. It doesn't give you information about *how much*
|
||||
memory is used; it rather tells you *how* it is used.
|
||||
|
||||
- **pgfault and pgmajfault:**
|
||||
indicate the number of times that a process of the cgroup triggered
|
||||
a "page fault" and a "major fault", respectively. A page fault
|
||||
happens when a process accesses a part of its virtual memory space
|
||||
which is nonexistent or protected. The former can happen if the
|
||||
process is buggy and tries to access an invalid address (it will
|
||||
then be sent a `SIGSEGV` signal, typically
|
||||
killing it with the famous `Segmentation fault`
|
||||
message). The latter can happen when the process reads from a memory
|
||||
zone which has been swapped out, or which corresponds to a mapped
|
||||
file: in that case, the kernel will load the page from disk, and let
|
||||
the CPU complete the memory access. It can also happen when the
|
||||
process writes to a copy-on-write memory zone: likewise, the kernel
|
||||
will preempt the process, duplicate the memory page, and resume the
|
||||
write operation on the process` own copy of the page. "Major" faults
|
||||
happen when the kernel actually has to read the data from disk. When
|
||||
it just has to duplicate an existing page, or allocate an empty
|
||||
page, it's a regular (or "minor") fault.
|
||||
|
||||
- **swap:**
|
||||
the amount of swap currently used by the processes in this cgroup.
|
||||
|
||||
- **active_anon and inactive_anon:**
|
||||
the amount of *anonymous* memory that has been identified has
|
||||
respectively *active* and *inactive* by the kernel. "Anonymous"
|
||||
memory is the memory that is *not* linked to disk pages. In other
|
||||
words, that's the equivalent of the rss counter described above. In
|
||||
fact, the very definition of the rss counter is **active_anon** +
|
||||
**inactive_anon** - **tmpfs** (where tmpfs is the amount of memory
|
||||
used up by `tmpfs` filesystems mounted by this
|
||||
control group). Now, what's the difference between "active" and
|
||||
"inactive"? Pages are initially "active"; and at regular intervals,
|
||||
the kernel sweeps over the memory, and tags some pages as
|
||||
"inactive". Whenever they are accessed again, they are immediately
|
||||
retagged "active". When the kernel is almost out of memory, and time
|
||||
comes to swap out to disk, the kernel will swap "inactive" pages.
|
||||
|
||||
- **active_file and inactive_file:**
|
||||
cache memory, with *active* and *inactive* similar to the *anon*
|
||||
memory above. The exact formula is cache = **active_file** +
|
||||
**inactive_file** + **tmpfs**. The exact rules used by the kernel
|
||||
to move memory pages between active and inactive sets are different
|
||||
from the ones used for anonymous memory, but the general principle
|
||||
is the same. Note that when the kernel needs to reclaim memory, it
|
||||
is cheaper to reclaim a clean (=non modified) page from this pool,
|
||||
since it can be reclaimed immediately (while anonymous pages and
|
||||
dirty/modified pages have to be written to disk first).
|
||||
|
||||
- **unevictable:**
|
||||
the amount of memory that cannot be reclaimed; generally, it will
|
||||
account for memory that has been "locked" with `mlock`.
|
||||
It is often used by crypto frameworks to make sure that
|
||||
secret keys and other sensitive material never gets swapped out to
|
||||
disk.
|
||||
|
||||
- **memory and memsw limits:**
|
||||
These are not really metrics, but a reminder of the limits applied
|
||||
to this cgroup. The first one indicates the maximum amount of
|
||||
physical memory that can be used by the processes of this control
|
||||
group; the second one indicates the maximum amount of RAM+swap.
|
||||
|
||||
Accounting for memory in the page cache is very complex. If two
|
||||
processes in different control groups both read the same file
|
||||
(ultimately relying on the same blocks on disk), the corresponding
|
||||
memory charge will be split between the control groups. It's nice, but
|
||||
it also means that when a cgroup is terminated, it could increase the
|
||||
memory usage of another cgroup, because they are not splitting the cost
|
||||
anymore for those memory pages.
|
||||
|
||||
### CPU metrics: `cpuacct.stat`
|
||||
|
||||
Now that we've covered memory metrics, everything else will look very
|
||||
simple in comparison. CPU metrics will be found in the
|
||||
`cpuacct` controller.
|
||||
|
||||
For each container, you will find a pseudo-file `cpuacct.stat`,
|
||||
containing the CPU usage accumulated by the processes of the container,
|
||||
broken down between `user` and `system` time. If you're not familiar
|
||||
with the distinction, `user` is the time during which the processes were
|
||||
in direct control of the CPU (i.e., executing process code), and `system`
|
||||
is the time during which the CPU was executing system calls on behalf of
|
||||
those processes.
|
||||
|
||||
Those times are expressed in ticks of 1/100th of a second. Actually,
|
||||
they are expressed in "user jiffies". There are `USER_HZ`
|
||||
*"jiffies"* per second, and on x86 systems,
|
||||
`USER_HZ` is 100. This used to map exactly to the
|
||||
number of scheduler "ticks" per second; but with the advent of higher
|
||||
frequency scheduling, as well as [tickless kernels](
|
||||
http://lwn.net/Articles/549580/), the number of kernel ticks
|
||||
wasn't relevant anymore. It stuck around anyway, mainly for legacy and
|
||||
compatibility reasons.
|
||||
|
||||
### Block I/O metrics
|
||||
|
||||
Block I/O is accounted in the `blkio` controller.
|
||||
Different metrics are scattered across different files. While you can
|
||||
find in-depth details in the [blkio-controller](
|
||||
https://www.kernel.org/doc/Documentation/cgroups/blkio-controller.txt)
|
||||
file in the kernel documentation, here is a short list of the most
|
||||
relevant ones:
|
||||
|
||||
|
||||
- **blkio.sectors:**
|
||||
contain the number of 512-bytes sectors read and written by the
|
||||
processes member of the cgroup, device by device. Reads and writes
|
||||
are merged in a single counter.
|
||||
|
||||
- **blkio.io_service_bytes:**
|
||||
indicates the number of bytes read and written by the cgroup. It has
|
||||
4 counters per device, because for each device, it differentiates
|
||||
between synchronous vs. asynchronous I/O, and reads vs. writes.
|
||||
|
||||
- **blkio.io_serviced:**
|
||||
the number of I/O operations performed, regardless of their size. It
|
||||
also has 4 counters per device.
|
||||
|
||||
- **blkio.io_queued:**
|
||||
indicates the number of I/O operations currently queued for this
|
||||
cgroup. In other words, if the cgroup isn't doing any I/O, this will
|
||||
be zero. Note that the opposite is not true. In other words, if
|
||||
there is no I/O queued, it does not mean that the cgroup is idle
|
||||
(I/O-wise). It could be doing purely synchronous reads on an
|
||||
otherwise quiescent device, which is therefore able to handle them
|
||||
immediately, without queuing. Also, while it is helpful to figure
|
||||
out which cgroup is putting stress on the I/O subsystem, keep in
|
||||
mind that it is a relative quantity. Even if a process group does
|
||||
not perform more I/O, its queue size can increase just because the
|
||||
device load increases because of other devices.
|
||||
|
||||
## Network metrics
|
||||
|
||||
Network metrics are not exposed directly by control groups. There is a
|
||||
good explanation for that: network interfaces exist within the context
|
||||
of *network namespaces*. The kernel could probably accumulate metrics
|
||||
about packets and bytes sent and received by a group of processes, but
|
||||
those metrics wouldn't be very useful. You want per-interface metrics
|
||||
(because traffic happening on the local `lo`
|
||||
interface doesn't really count). But since processes in a single cgroup
|
||||
can belong to multiple network namespaces, those metrics would be harder
|
||||
to interpret: multiple network namespaces means multiple `lo`
|
||||
interfaces, potentially multiple `eth0`
|
||||
interfaces, etc.; so this is why there is no easy way to gather network
|
||||
metrics with control groups.
|
||||
|
||||
Instead we can gather network metrics from other sources:
|
||||
|
||||
### IPtables
|
||||
|
||||
IPtables (or rather, the netfilter framework for which iptables is just
|
||||
an interface) can do some serious accounting.
|
||||
|
||||
For instance, you can setup a rule to account for the outbound HTTP
|
||||
traffic on a web server:
|
||||
|
||||
$ iptables -I OUTPUT -p tcp --sport 80
|
||||
|
||||
There is no `-j` or `-g` flag,
|
||||
so the rule will just count matched packets and go to the following
|
||||
rule.
|
||||
|
||||
Later, you can check the values of the counters, with:
|
||||
|
||||
$ iptables -nxvL OUTPUT
|
||||
|
||||
Technically, `-n` is not required, but it will
|
||||
prevent iptables from doing DNS reverse lookups, which are probably
|
||||
useless in this scenario.
|
||||
|
||||
Counters include packets and bytes. If you want to setup metrics for
|
||||
container traffic like this, you could execute a `for`
|
||||
loop to add two `iptables` rules per
|
||||
container IP address (one in each direction), in the `FORWARD`
|
||||
chain. This will only meter traffic going through the NAT
|
||||
layer; you will also have to add traffic going through the userland
|
||||
proxy.
|
||||
|
||||
Then, you will need to check those counters on a regular basis. If you
|
||||
happen to use `collectd`, there is a [nice plugin](https://collectd.org/wiki/index.php/Table_of_Plugins)
|
||||
to automate iptables counters collection.
|
||||
|
||||
### Interface-level counters
|
||||
|
||||
Since each container has a virtual Ethernet interface, you might want to
|
||||
check directly the TX and RX counters of this interface. You will notice
|
||||
that each container is associated to a virtual Ethernet interface in
|
||||
your host, with a name like `vethKk8Zqi`. Figuring
|
||||
out which interface corresponds to which container is, unfortunately,
|
||||
difficult.
|
||||
|
||||
But for now, the best way is to check the metrics *from within the
|
||||
containers*. To accomplish this, you can run an executable from the host
|
||||
environment within the network namespace of a container using **ip-netns
|
||||
magic**.
|
||||
|
||||
The `ip-netns exec` command will let you execute any
|
||||
program (present in the host system) within any network namespace
|
||||
visible to the current process. This means that your host will be able
|
||||
to enter the network namespace of your containers, but your containers
|
||||
won't be able to access the host, nor their sibling containers.
|
||||
Containers will be able to “see” and affect their sub-containers,
|
||||
though.
|
||||
|
||||
The exact format of the command is:
|
||||
|
||||
$ ip netns exec <nsname> <command...>
|
||||
|
||||
For example:
|
||||
|
||||
$ ip netns exec mycontainer netstat -i
|
||||
|
||||
`ip netns` finds the "mycontainer" container by
|
||||
using namespaces pseudo-files. Each process belongs to one network
|
||||
namespace, one PID namespace, one `mnt` namespace,
|
||||
etc., and those namespaces are materialized under
|
||||
`/proc/<pid>/ns/`. For example, the network
|
||||
namespace of PID 42 is materialized by the pseudo-file
|
||||
`/proc/42/ns/net`.
|
||||
|
||||
When you run `ip netns exec mycontainer ...`, it
|
||||
expects `/var/run/netns/mycontainer` to be one of
|
||||
those pseudo-files. (Symlinks are accepted.)
|
||||
|
||||
In other words, to execute a command within the network namespace of a
|
||||
container, we need to:
|
||||
|
||||
- Find out the PID of any process within the container that we want to investigate;
|
||||
- Create a symlink from `/var/run/netns/<somename>` to `/proc/<thepid>/ns/net`
|
||||
- Execute `ip netns exec <somename> ....`
|
||||
|
||||
Please review [*Enumerating Cgroups*](#enumerating-cgroups) to learn how to find
|
||||
the cgroup of a process running in the container of which you want to
|
||||
measure network usage. From there, you can examine the pseudo-file named
|
||||
`tasks`, which contains the PIDs that are in the
|
||||
control group (i.e., in the container). Pick any one of them.
|
||||
|
||||
Putting everything together, if the "short ID" of a container is held in
|
||||
the environment variable `$CID`, then you can do this:
|
||||
|
||||
$ TASKS=/sys/fs/cgroup/devices/docker/$CID*/tasks
|
||||
$ PID=$(head -n 1 $TASKS)
|
||||
$ mkdir -p /var/run/netns
|
||||
$ ln -sf /proc/$PID/ns/net /var/run/netns/$CID
|
||||
$ ip netns exec $CID netstat -i
|
||||
|
||||
## Tips for high-performance metric collection
|
||||
|
||||
Note that running a new process each time you want to update metrics is
|
||||
(relatively) expensive. If you want to collect metrics at high
|
||||
resolutions, and/or over a large number of containers (think 1000
|
||||
containers on a single host), you do not want to fork a new process each
|
||||
time.
|
||||
|
||||
Here is how to collect metrics from a single process. You will have to
|
||||
write your metric collector in C (or any language that lets you do
|
||||
low-level system calls). You need to use a special system call,
|
||||
`setns()`, which lets the current process enter any
|
||||
arbitrary namespace. It requires, however, an open file descriptor to
|
||||
the namespace pseudo-file (remember: that's the pseudo-file in
|
||||
`/proc/<pid>/ns/net`).
|
||||
|
||||
However, there is a catch: you must not keep this file descriptor open.
|
||||
If you do, when the last process of the control group exits, the
|
||||
namespace will not be destroyed, and its network resources (like the
|
||||
virtual interface of the container) will stay around for ever (or until
|
||||
you close that file descriptor).
|
||||
|
||||
The right approach would be to keep track of the first PID of each
|
||||
container, and re-open the namespace pseudo-file each time.
|
||||
|
||||
## Collecting metrics when a container exits
|
||||
|
||||
Sometimes, you do not care about real time metric collection, but when a
|
||||
container exits, you want to know how much CPU, memory, etc. it has
|
||||
used.
|
||||
|
||||
Docker makes this difficult because it relies on `lxc-start`, which
|
||||
carefully cleans up after itself, but it is still possible. It is
|
||||
usually easier to collect metrics at regular intervals (e.g., every
|
||||
minute, with the collectd LXC plugin) and rely on that instead.
|
||||
|
||||
But, if you'd still like to gather the stats when a container stops,
|
||||
here is how:
|
||||
|
||||
For each container, start a collection process, and move it to the
|
||||
control groups that you want to monitor by writing its PID to the tasks
|
||||
file of the cgroup. The collection process should periodically re-read
|
||||
the tasks file to check if it's the last process of the control group.
|
||||
(If you also want to collect network statistics as explained in the
|
||||
previous section, you should also move the process to the appropriate
|
||||
network namespace.)
|
||||
|
||||
When the container exits, `lxc-start` will try to
|
||||
delete the control groups. It will fail, since the control group is
|
||||
still in use; but that's fine. You process should now detect that it is
|
||||
the only one remaining in the group. Now is the right time to collect
|
||||
all the metrics you need!
|
||||
|
||||
Finally, your process should move itself back to the root control group,
|
||||
and remove the container control group. To remove a control group, just
|
||||
`rmdir` its directory. It's counter-intuitive to
|
||||
`rmdir` a directory as it still contains files; but
|
||||
remember that this is a pseudo-filesystem, so usual rules don't apply.
|
||||
After the cleanup is done, the collection process can exit safely.
|
||||
159
vendor/github.com/hyperhq/hypercli/docs/admin/systemd.md
generated
vendored
Normal file
@@ -0,0 +1,159 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/reference/logging/systemd/"]
|
||||
title = "Control and configure Docker with systemd"
|
||||
description = "Controlling and configuring Docker using systemd"
|
||||
keywords = ["docker, daemon, systemd, configuration"]
|
||||
[menu.main]
|
||||
parent = "engine_admin"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Control and configure Docker with systemd
|
||||
|
||||
Many Linux distributions use systemd to start the Docker daemon. This document
|
||||
shows a few examples of how to customize Docker's settings.
|
||||
|
||||
## Starting the Docker daemon
|
||||
|
||||
Once Docker is installed, you will need to start the Docker daemon.
|
||||
|
||||
$ sudo systemctl start docker
|
||||
# or on older distributions, you may need to use
|
||||
$ sudo service docker start
|
||||
|
||||
If you want Docker to start at boot, you should also:
|
||||
|
||||
$ sudo systemctl enable docker
|
||||
# or on older distributions, you may need to use
|
||||
$ sudo chkconfig docker on
|
||||
|
||||
## Custom Docker daemon options
|
||||
|
||||
There are a number of ways to configure the daemon flags and environment variables
|
||||
for your Docker daemon.
|
||||
|
||||
The recommended way is to use a systemd drop-in file. These are local files in
|
||||
the `/etc/systemd/system/docker.service.d` directory. This could also be
|
||||
`/etc/systemd/system/docker.service`, which also works for overriding the
|
||||
defaults from `/lib/systemd/system/docker.service`.
|
||||
|
||||
However, if you had previously used a package which had an `EnvironmentFile`
|
||||
(often pointing to `/etc/sysconfig/docker`) then for backwards compatibility,
|
||||
you drop a file in the `/etc/systemd/system/docker.service.d`
|
||||
directory including the following:
|
||||
|
||||
[Service]
|
||||
EnvironmentFile=-/etc/sysconfig/docker
|
||||
EnvironmentFile=-/etc/sysconfig/docker-storage
|
||||
EnvironmentFile=-/etc/sysconfig/docker-network
|
||||
ExecStart=
|
||||
ExecStart=/usr/bin/docker daemon -H fd:// $OPTIONS \
|
||||
$DOCKER_STORAGE_OPTIONS \
|
||||
$DOCKER_NETWORK_OPTIONS \
|
||||
$BLOCK_REGISTRY \
|
||||
$INSECURE_REGISTRY
|
||||
|
||||
To check if the `docker.service` uses an `EnvironmentFile`:
|
||||
|
||||
$ sudo systemctl show docker | grep EnvironmentFile
|
||||
EnvironmentFile=-/etc/sysconfig/docker (ignore_errors=yes)
|
||||
|
||||
Alternatively, find out where the service file is located:
|
||||
|
||||
$ sudo systemctl status docker | grep Loaded
|
||||
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
|
||||
$ sudo grep EnvironmentFile /usr/lib/systemd/system/docker.service
|
||||
EnvironmentFile=-/etc/sysconfig/docker
|
||||
|
||||
You can customize the Docker daemon options using override files as explained in the
|
||||
[HTTP Proxy example](#http-proxy) below. The files located in `/usr/lib/systemd/system`
|
||||
or `/lib/systemd/system` contain the default options and should not be edited.
|
||||
|
||||
### Runtime directory and storage driver
|
||||
|
||||
You may want to control the disk space used for Docker images, containers
|
||||
and volumes by moving it to a separate partition.
|
||||
|
||||
In this example, we'll assume that your `docker.service` file looks something like:
|
||||
|
||||
[Unit]
|
||||
Description=Docker Application Container Engine
|
||||
Documentation=https://docs.docker.com
|
||||
After=network.target docker.socket
|
||||
Requires=docker.socket
|
||||
|
||||
[Service]
|
||||
Type=notify
|
||||
ExecStart=/usr/bin/docker daemon -H fd://
|
||||
LimitNOFILE=1048576
|
||||
LimitNPROC=1048576
|
||||
TasksMax=1048576
|
||||
|
||||
[Install]
|
||||
Also=docker.socket
|
||||
|
||||
This will allow us to add extra flags via a drop-in file (mentioned above) by
|
||||
placing a file containing the following in the `/etc/systemd/system/docker.service.d`
|
||||
directory:
|
||||
|
||||
[Service]
|
||||
ExecStart=
|
||||
ExecStart=/usr/bin/docker daemon -H fd:// --graph="/mnt/docker-data" --storage-driver=overlay
|
||||
|
||||
You can also set other environment variables in this file, for example, the
|
||||
`HTTP_PROXY` environment variables described below.
|
||||
|
||||
To modify the ExecStart configuration, specify an empty configuration followed
|
||||
by a new configuration as follows:
|
||||
|
||||
[Service]
|
||||
ExecStart=
|
||||
ExecStart=/usr/bin/docker daemon -H fd:// --bip=172.17.42.1/16
|
||||
|
||||
If you fail to specify an empty configuration, Docker reports an error such as:
|
||||
|
||||
docker.service has more than one ExecStart= setting, which is only allowed for Type=oneshot services. Refusing.
|
||||
|
||||
### HTTP proxy
|
||||
|
||||
This example overrides the default `docker.service` file.
|
||||
|
||||
If you are behind a HTTP proxy server, for example in corporate settings,
|
||||
you will need to add this configuration in the Docker systemd service file.
|
||||
|
||||
First, create a systemd drop-in directory for the docker service:
|
||||
|
||||
mkdir /etc/systemd/system/docker.service.d
|
||||
|
||||
Now create a file called `/etc/systemd/system/docker.service.d/http-proxy.conf`
|
||||
that adds the `HTTP_PROXY` environment variable:
|
||||
|
||||
[Service]
|
||||
Environment="HTTP_PROXY=http://proxy.example.com:80/"
|
||||
|
||||
If you have internal Docker registries that you need to contact without
|
||||
proxying you can specify them via the `NO_PROXY` environment variable:
|
||||
|
||||
Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
|
||||
|
||||
Flush changes:
|
||||
|
||||
$ sudo systemctl daemon-reload
|
||||
|
||||
Verify that the configuration has been loaded:
|
||||
|
||||
$ sudo systemctl show docker --property Environment
|
||||
Environment=HTTP_PROXY=http://proxy.example.com:80/
|
||||
|
||||
Restart Docker:
|
||||
|
||||
$ sudo systemctl restart docker
|
||||
|
||||
## Manually creating the systemd unit files
|
||||
|
||||
When installing the binary without a package, you may want
|
||||
to integrate Docker with systemd. For this, simply install the two unit files
|
||||
(service and socket) from [the github
|
||||
repository](https://github.com/docker/docker/tree/master/contrib/init/systemd)
|
||||
to `/etc/systemd/system`.
|
||||
119
vendor/github.com/hyperhq/hypercli/docs/admin/using_supervisord.md
generated
vendored
Normal file
@@ -0,0 +1,119 @@
|
||||
<!--[metadata]>
|
||||
+++
|
||||
aliases = ["/engine/articles/using_supervisord/"]
|
||||
title = "Using Supervisor with Docker"
|
||||
description = "How to use Supervisor process management with Docker"
|
||||
keywords = ["docker, supervisor, process management"]
|
||||
[menu.main]
|
||||
parent = "engine_admin"
|
||||
+++
|
||||
<![end-metadata]-->
|
||||
|
||||
# Using Supervisor with Docker
|
||||
|
||||
> **Note**:
|
||||
> - **If you don't like sudo** then see [*Giving non-root
|
||||
> access*](../installation/binaries.md#giving-non-root-access)
|
||||
|
||||
Traditionally a Docker container runs a single process when it is
|
||||
launched, for example an Apache daemon or a SSH server daemon. Often
|
||||
though you want to run more than one process in a container. There are a
|
||||
number of ways you can achieve this ranging from using a simple Bash
|
||||
script as the value of your container's `CMD` instruction to installing
|
||||
a process management tool.
|
||||
|
||||
In this example we're going to make use of the process management tool,
|
||||
[Supervisor](http://supervisord.org/), to manage multiple processes in
|
||||
our container. Using Supervisor allows us to better control, manage, and
|
||||
restart the processes we want to run. To demonstrate this we're going to
|
||||
install and manage both an SSH daemon and an Apache daemon.
|
||||
|
||||
## Creating a Dockerfile
|
||||
|
||||
Let's start by creating a basic `Dockerfile` for our
|
||||
new image.
|
||||
|
||||
FROM ubuntu:13.04
|
||||
MAINTAINER examples@docker.com
|
||||
|
||||
## Installing Supervisor
|
||||
|
||||
We can now install our SSH and Apache daemons as well as Supervisor in
|
||||
our container.
|
||||
|
||||
RUN apt-get update && apt-get install -y openssh-server apache2 supervisor
|
||||
RUN mkdir -p /var/lock/apache2 /var/run/apache2 /var/run/sshd /var/log/supervisor
|
||||
|
||||
Here we're installing the `openssh-server`,
|
||||
`apache2` and `supervisor`
|
||||
(which provides the Supervisor daemon) packages. We're also creating four
|
||||
new directories that are needed to run our SSH daemon and Supervisor.
|
||||
|
||||
## Adding Supervisor's configuration file
|
||||
|
||||
Now let's add a configuration file for Supervisor. The default file is
|
||||
called `supervisord.conf` and is located in
|
||||
`/etc/supervisor/conf.d/`.
|
||||
|
||||
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
||||
|
||||
Let's see what is inside our `supervisord.conf`
|
||||
file.
|
||||
|
||||
[supervisord]
|
||||
nodaemon=true
|
||||
|
||||
[program:sshd]
|
||||
command=/usr/sbin/sshd -D
|
||||
|
||||
[program:apache2]
|
||||
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
|
||||
|
||||
The `supervisord.conf` configuration file contains
|
||||
directives that configure Supervisor and the processes it manages. The
|
||||
first block `[supervisord]` provides configuration
|
||||
for Supervisor itself. We're using one directive, `nodaemon`
|
||||
which tells Supervisor to run interactively rather than
|
||||
daemonize.
|
||||
|
||||
The next two blocks manage the services we wish to control. Each block
|
||||
controls a separate process. The blocks contain a single directive,
|
||||
`command`, which specifies what command to run to
|
||||
start each process.
|
||||
|
||||
## Exposing ports and running Supervisor
|
||||
|
||||
Now let's finish our `Dockerfile` by exposing some
|
||||
required ports and specifying the `CMD` instruction
|
||||
to start Supervisor when our container launches.
|
||||
|
||||
EXPOSE 22 80
|
||||
CMD ["/usr/bin/supervisord"]
|
||||
|
||||
Here We've exposed ports 22 and 80 on the container and we're running
|
||||
the `/usr/bin/supervisord` binary when the container
|
||||
launches.
|
||||
|
||||
## Building our image
|
||||
|
||||
We can now build our new image.
|
||||
|
||||
$ docker build -t <yourname>/supervisord .
|
||||
|
||||
## Running our Supervisor container
|
||||
|
||||
Once We've got a built image we can launch a container from it.
|
||||
|
||||
$ docker run -p 22 -p 80 -t -i <yourname>/supervisord
|
||||
2013-11-25 18:53:22,312 CRIT Supervisor running as root (no user in config file)
|
||||
2013-11-25 18:53:22,312 WARN Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing
|
||||
2013-11-25 18:53:22,342 INFO supervisord started with pid 1
|
||||
2013-11-25 18:53:23,346 INFO spawned: 'sshd' with pid 6
|
||||
2013-11-25 18:53:23,349 INFO spawned: 'apache2' with pid 7
|
||||
. . .
|
||||
|
||||
We've launched a new container interactively using the `docker run` command.
|
||||
That container has run Supervisor and launched the SSH and Apache daemons with
|
||||
it. We've specified the `-p` flag to expose ports 22 and 80. From here we can
|
||||
now identify the exposed ports and connect to one or both of the SSH and Apache
|
||||
daemons.
|
||||