docker-gen
is a file generator that renders templates using docker container meta-data.
It can be used to generate various kinds of files for:
===
There are three common ways to run docker-gen:
Linux/OSX binaries for release 0.7.6
Download the version you need, untar, and install to your PATH.
$ wget https://github.com/nginx-proxy/docker-gen/releases/download/0.7.6/docker-gen-linux-amd64-0.7.6.tar.gz
$ tar xvzf docker-gen-linux-amd64-0.7.6.tar.gz
$ ./docker-gen
Docker-gen can be bundled inside of a container along-side applications.
nginx-proxy/nginx-proxy trusted build is an example ofrunning docker-gen within a container along-side nginx.jwilder/docker-register is an example of runningdocker-gen within a container to do service registration with etcd.
It can also be run as two separate containers using the nginx-proxy/docker-genimage, together with virtually any other image.
This is how you could run the official nginx image andhave docker-gen generate a reverse proxy config in the same way that nginx-proxy
works. You may want to dothis to prevent having the docker socket bound to a publicly exposed container service.
Start nginx with a shared volume:
$ docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx
Fetch the template and start the docker-gen container with the shared volume:
$ mkdir -p /tmp/templates && cd /tmp/templates
$ curl -o nginx.tmpl https://raw.githubusercontent.com/nginx-proxy/docker-gen/main/templates/nginx.tmpl
$ docker run -d --name nginx-gen --volumes-from nginx \
-v /var/run/docker.sock:/tmp/docker.sock:rw \
-v /tmp/templates:/etc/docker-gen/templates \
-t nginxproxy/docker-gen -notify-sighup nginx -watch -only-exposed /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
===
$ docker-gen
Usage: docker-gen [options] template [dest]
Generate files from docker container meta-data
Options:
-config value
config files with template directives. Config files will be merged if this option is specified multiple times. (default [])
-endpoint string
docker api endpoint (tcp|unix://..). Default unix:///var/run/docker.sock
-interval int
notify command interval (secs)
-keep-blank-lines
keep blank lines in the output file
-notify restart xyz
run command after template is regenerated (e.g restart xyz)
-notify-output
log the output(stdout/stderr) of notify command
-notify-container container-ID
container to send a signal to
-notify-signal signal
signal to send to the -notify-container. -1 to call docker restart. Defaults to 1 aka. HUP.
All available signals available on the [dockerclient](https://github.com/fsouza/go-dockerclient/blob/01804dec8a84d0a77e63611f2b62d33e9bb2b64a/signal.go)
-notify-sighup container-ID
send HUP signal to container. Equivalent to 'docker kill -s HUP container-ID', or `-notify-container container-ID -notify-signal 1`
-only-exposed
only include containers with exposed ports
-only-published
only include containers with published ports (implies -only-exposed)
-include-stopped
include stopped containers
-tlscacert string
path to TLS CA certificate file (default "/Users/jason/.docker/machine/machines/default/ca.pem")
-tlscert string
path to TLS client certificate file (default "/Users/jason/.docker/machine/machines/default/cert.pem")
-tlskey string
path to TLS client key file (default "/Users/jason/.docker/machine/machines/default/key.pem")
-tlsverify
verify docker daemon's TLS certicate (default true)
-version
show version
-watch
watch for container changes
-wait
minimum (and/or maximum) duration to wait after each container change before triggering
Arguments:
template - path to a template to generate
dest - path to write the template. If not specfied, STDOUT is used
Environment Variables:
DOCKER_HOST - default value for -endpoint
DOCKER_CERT_PATH - directory path containing key.pem, cert.pm and ca.pem
DOCKER_TLS_VERIFY - enable client TLS verification]
If no <dest>
file is specified, the output is sent to stdout. Mainly useful for debugging.
Using the -config flag from above you can tell docker-gen to use the specified config file instead of command-line options. Multiple templates can be defined and they will be executed in the order that they appear in the config file.
An example configuration file, docker-gen.cfg can be found in the examples folder.
[[config]]
Starts a configuration section
dest = "path/to/a/file"
path to write the template. If not specfied, STDOUT is used
notifycmd = "/etc/init.d/foo reload"
run command after template is regenerated (e.g restart xyz)
onlyexposed = true
only include containers with exposed ports
template = "/path/to/a/template/file.tmpl"
path to a template to generate
watch = true
watch for container changes
wait = "500ms:2s"
debounce changes with a min:max duration. Only applicable if watch = true
[config.NotifyContainers]
Starts a notify container section
containername = 1
container name followed by the signal to send
container_id = 1
or the container id can be used followed by the signal to send
Putting it all together here is an example configuration file.
[[config]]
template = "/etc/nginx/nginx.conf.tmpl"
dest = "/etc/nginx/sites-available/default"
onlyexposed = true
notifycmd = "/etc/init.d/nginx reload"
[[config]]
template = "/etc/logrotate.conf.tmpl"
dest = "/etc/logrotate.d/docker"
watch = true
[[config]]
template = "/etc/docker-gen/templates/nginx.tmpl"
dest = "/etc/nginx/conf.d/default.conf"
watch = true
wait = "500ms:2s"
[config.NotifyContainers]
nginx = 1 # 1 is a signal number to be sent; here SIGHUP
e75a60548dc9 = 1 # a key can be either container name (nginx) or ID
===
The templates used by docker-gen are written using the Go text/template language. In addition to the built-in functions supplied by Go, docker-gen provides a number of additional functions to make it simpler (or possible) to generate your desired output.
Within the templates, the object emitted by docker-gen will be a structure consisting of following Go structs:
type RuntimeContainer struct {
ID string
Addresses []Address
Networks []Network
Gateway string
Name string
Hostname string
Image DockerImage
Env map[string]string
Volumes map[string]Volume
Node SwarmNode
Labels map[string]string
IP string
IP6LinkLocal string
IP6Global string
Mounts []Mount
State State
}
type Address struct {
IP string
IP6LinkLocal string
IP6Global string
Port string
HostPort string
Proto string
HostIP string
}
type Network struct {
IP string
Name string
Gateway string
EndpointID string
IPv6Gateway string
GlobalIPv6Address string
MacAddress string
GlobalIPv6PrefixLen int
IPPrefixLen int
}
type DockerImage struct {
Registry string
Repository string
Tag string
}
type Mount struct {
Name string
Source string
Destination string
Driver string
Mode string
RW bool
}
type Volume struct {
Path string
HostPath string
ReadWrite bool
}
type SwarmNode struct {
ID string
Name string
Address Address
}
type State struct {
Running bool
}
// Accessible from the root in templates as .Docker
type Docker struct {
Name string
NumContainers int
NumImages int
Version string
ApiVersion string
GoVersion string
OperatingSystem string
Architecture string
CurrentContainerID string
}
// Host environment variables accessible from root in templates as .Env
For example, this is a JSON version of an emitted RuntimeContainer struct:
{
"ID":"71e9768075836eb38557adcfc71a207386a0c597dbeda240cf905df79b18cebf",
"Addresses":[
{
"IP":"172.17.0.4",
"Port":"22",
"Proto":"tcp",
"HostIP":"192.168.10.24",
"HostPort":"2222"
}
],
"Gateway":"172.17.42.1",
"Node": {
"ID":"I2VY:P7PF:TZD5:PGWB:QTI7:QDSP:C5UD:DYKR:XKKK:TRG2:M2BL:DFUN",
"Name":"docker-test",
"Address": {
"IP":"192.168.10.24"
}
},
"Labels": {
"operatingsystem":"Ubuntu 14.04.2 LTS",
"storagedriver":"devicemapper",
"anything_foo":"something_bar"
},
"IP":"172.17.0.4",
"Name":"docker_register",
"Hostname":"71e976807583",
"Image":{
"Registry":"jwilder",
"Repository":"docker-register"
},
"Env":{
"ETCD_HOST":"172.17.42.1:4001",
"PATH":"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"DOCKER_HOST":"unix:///var/run/docker.sock",
"HOST_IP":"172.17.42.1"
},
"Volumes":{
"/mnt":{
"Path":"/mnt",
"HostPath":"/Users/joebob/tmp",
"ReadWrite":true
}
}
}
closest $array $value
: Returns the longest matching substring in $array
that matches $value
coalesce ...
: Returns the first non-nil argument.contains $map $key
: Returns true
if $map
contains $key
. Takes maps from string
to any type.dict $key $value ...
: Creates a map from a list of pairs. Each $key
value must be a string
, but the $value
can be any type (or nil
). Useful for passing more than one value as a pipeline context to subtemplates.dir $path
: Returns an array of filenames in the specified $path
.exists $path
: Returns true
if $path
refers to an existing file or directory. Takes a string.first $array
: Returns the first value of an array or nil if the arry is nil or empty.groupBy $containers $fieldPath
: Groups an array of RuntimeContainer
instances based on the values of a field path expression $fieldPath
. A field path expression is a dot-delimited list of map keys or struct member names specifying the path from container to a nested value, which must be a string. Returns a map from the value of the field path expression to an array of containers having that value. Containers that do not have a value for the field path in question are omitted.groupByKeys $containers $fieldPath
: Returns the same as groupBy
but only returns the keys of the map.groupByMulti $containers $fieldPath $sep
: Like groupBy
, but the string value specified by $fieldPath
is first split by $sep
into a list of strings. A container whose $fieldPath
value contains a list of strings will show up in the map output under each of those strings.groupByLabel $containers $label
: Returns the same as groupBy
but grouping by the given label's value.hasPrefix $prefix $string
: Returns whether $prefix
is a prefix of $string
.hasSuffix $suffix $string
: Returns whether $suffix
is a suffix of $string
.intersect $slice1 $slice2
: Returns the strings that exist in both string slices.json $value
: Returns the JSON representation of $value
as a string
.keys $map
: Returns the keys from $map
. If $map
is nil
, a nil
is returned. If $map
is not a map
, an error will be thrown.last $array
: Returns the last value of an array.parseBool $string
: parseBool returns the boolean value represented by the string. It accepts 1, t, T, TRUE, true, True, 0, f, F, FALSE, false, False. Any other value returns an error. Alias for strconv.ParseBool
replace $string $old $new $count
: Replaces up to $count
occurences of $old
with $new
in $string
. Alias for strings.Replace
sha1 $string
: Returns the hexadecimal representation of the SHA1 hash of $string
.split $string $sep
: Splits $string
into a slice of substrings delimited by $sep
. Alias for strings.Split
splitN $string $sep $count
: Splits $string
into a slice of substrings delimited by $sep
, with number of substrings returned determined by $count
. Alias for strings.SplitN
trimPrefix $prefix $string
: If $prefix
is a prefix of $string
, return $string
with $prefix
trimmed from the beginning. Otherwise, return $string
unchanged.trimSuffix $suffix $string
: If $suffix
is a suffix of $string
, return $string
with $suffix
trimmed from the end. Otherwise, return $string
unchanged.trim $string
: Removes whitespace from both sides of $string
.toLower $string
: Replace capital letters in $string
to lowercase.toUpper $string
: Replace lowercase letters in $string
to uppercase.when $condition $trueValue $falseValue
: Returns the $trueValue
when the $condition
is true
and the $falseValue
otherwisewhere $items $fieldPath $value
: Filters an array or slice based on the values of a field path expression $fieldPath
. A field path expression is a dot-delimited list of map keys or struct member names specifying the path from container to a nested value. Returns an array of items having that value.whereNot $items $fieldPath $value
: Filters an array or slice based on the values of a field path expression $fieldPath
. A field path expression is a dot-delimited list of map keys or struct member names specifying the path from container to a nested value. Returns an array of items not having that value.whereExist $items $fieldPath
: Like where
, but returns only items where $fieldPath
exists (is not nil).whereNotExist $items $fieldPath
: Like where
, but returns only items where $fieldPath
does not exist (is nil).whereAny $items $fieldPath $sep $values
: Like where
, but the string value specified by $fieldPath
is first split by $sep
into a list of strings. The comparison value is a string slice with possible matches. Returns items which OR intersect these values.whereAll $items $fieldPath $sep $values
: Like whereAny
, except all $values
must exist in the $fieldPath
.whereLabelExists $containers $label
: Filters a slice of containers based on the existence of the label $label
.whereLabelDoesNotExist $containers $label
: Filters a slice of containers based on the non-existence of the label $label
.whereLabelValueMatches $containers $label $pattern
: Filters a slice of containers based on the existence of the label $label
with values matching the regular expression $pattern
.===
nginxproxy/nginx-proxy trusted build.
Start nginx-proxy:
$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock -t nginxproxy/nginx-proxy
Then start containers with a VIRTUAL_HOST env variable:
$ docker run -e VIRTUAL_HOST=foo.bar.com -t ...
If you wanted to run docker-gen directly on the host, you could do it with:
$ docker-gen -only-published -watch -notify "/etc/init.d/nginx reload" templates/nginx.tmpl /etc/nginx/sites-enabled/default
This template generate a fluentd.conf file used by fluentd. It would then ship log files offthe host.
$ docker-gen -watch -notify "restart fluentd" templates/fluentd.tmpl /etc/fluent/fluent.conf
This template is an example of generating a script that is then executed. This template generatesa python script that is then executed which register containers in Etcd using its HTTP API.
$ docker-gen -notify "/bin/bash /tmp/etcd.sh" -interval 10 templates/etcd.tmpl /tmp/etcd.sh
This project uses Go Modules for managing 3rd party dependencies.This means that at least go 1.11
is required.
For go 1.11
and go 1.12
it is additionally required to manually enable support by setting GO111MODULE=on
.For later versions, this is not required.
$ git clone <your fork>
$ cd <your fork>
$ make get-deps
$ make
MIT
翻译。原文见: http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/ 反向代理服务器是一种通常位于web服务器之前的服务器,它可以提供web服务器本身没有的附件功能。 例如,反向代理可以提供SSL终结、负载均衡、请求路由、缓存、压缩,甚至A/B测试。 当用docker容器运行web服务时,运
详细使用方法参考以下github网址 https://github.com/nginx-proxy/nginx-proxy 以下是我的docker-compose.yml version: '3' services: nginx-proxy: image: nginxproxy/nginx-proxy networks: - webproxy ports
1、什么是docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 2、docker 的组件 DockerClient客户端 Docker Daemon守护进程 Docker Image镜像 DockerContainer容器 3、
docker inspect Estimated reading time: 2 minutes Description Return low-level information on Docker objects Usage docker inspect [OPTIONS] NAME|ID [NAME|ID...] Options Name, shorthand Default Descrip
简书 Docker快速上手笔记 - 简书 哔哩哔哩 科技一分钟:Docker不过五关非好汉_哔哩哔哩_bilibili
一、 docker镜像 1-docker images 查看本地镜像为null 2-docker pull hello-world 拉取hello-world,没加地址,默认就会到hub.docker.com去下载 3-docker images 再次查看,观察获得hello-world镜像 总结: 第一个docker镜像 1-拉取镜像的命令 docker pull [options] name
Docker是容器技术的一个代表。容器技术从本质上讲是将程序隔离打包这么个技术。Docker解决了软件包装问题,很好的理顺了开发和运维环境的差异,使得开发和运维可以全用同种语言进行沟通。它是一个云计算的技术。 Docker是通过内核虚拟化技术(namespace及cgroups等)来提供容器的资源隔离与安全保障。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类
安装 Centos 清除旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \
一、解决的问题 二、与虚拟机的比较 三、优势 四、使用场景 五、镜像与容器 参考资料 一、解决的问题 由于不同的机器有不同的操作系统,以及不同的库和组件,在将一个应用部署到多台机器上需要进行大量的环境配置操作。 Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用 Docker 可以不修改应用程序代码,不需要开发人员学习特定环
我检查了垃圾箱,里面没有ping
第一章 Docker介绍1 1.1 docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的\[Linux\]机器上,也可以实现\[虚拟化\]。容器是完全使用\[沙箱\]机制,相互之间不会有任何接口。 1.2 Docker是什么? Docker是一个程序运行、测试、交付的开放平台,Docker被设计为能够使你快速地交
推荐使用 Swoole 官方 Docker:https://github.com/swoole/docker-swoole
Docker Commands Commands Notes docker ps -a Show all containers on the system docker ps Show only currently running containers docker run <NAME> Creates & runs a docker container via an image docker i
环境准备 1. 下载镜像及配置文件 链接: https://pan.baidu.com/s/1hw0h1KUlhSirFBId6kh8mw 提取码: 1wng $ ls backend-0.0.8.tar.gz env.list grpc-go-greeting-0.1.tar.gz nginx-lb.conf nginx-perf.conf nginxplus-23-r1.tar.
本部分常用命令1. docker network docker network create docker network ls docker network inspect docker network rm // 将一个已经存在的容器加入到一个 docker 网络 docker network connect docker network disconnect2. 基本命令调试相关
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统。