我正在研究在 swarm (1.12.x) 下运行的保险库的概念。
单个容器将启动:
docker run -d --cap-add IPC_LOCK -p 8200:8200 -p 8215:8125 --name vault --volume /vagrant/vault:/vagrant/vault vault server -config=/path/to/vault.hcl
但是当我想在 swarm 作为服务运行它时,似乎无法指定IPC_LOCK功能,以便在这种情况下锁定 Vault 服务的加密交换。
使用docker service create命令启动群模式服务时如何设置 --cap-add 标志?
我正在做以下事情:
docker build -t gcr.io/projid/imgname:333 -t gcr.io/projid/imgname:latest 。
docker login -u _json_key -p "$(cat /secrets/service-account.json)" https://gcr.io
docker push gcr.io/projid/imgname:333
docker push gcr.io/projid/imgname:latest
第一个推送命令的输出:
Pushing to google container registry ...
The push refers to a repository [gcr.io/projid/imgname]
24af4f7c7118: Preparing
17b0972980d8: Preparing
6d6a6425aacb: Preparing
809c8c0dd73c: Preparing
e8d45b8ab3ca: Preparing
e8fa134cb7b8: Preparing
7cbcbac42c44: Preparing
e8fa134cb7b8: Waiting
7cbcbac42c44: Waiting
809c8c0dd73c: Layer already exists
e8d45b8ab3ca: Layer already exists
7cbcbac42c44: Layer already exists
e8fa134cb7b8: Layer already exists
17b0972980d8: Pushed
24af4f7c7118: Pushed
6d6a6425aacb: Pushed
333: digest: sha256:dae8cf914ba49928e6f0a34f6740802403813e6d10aa1c1d448a62ce9bb69066 size: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 aws 容器服务设置一个 rabbitmq 集群。我需要/var/lib/rabbitmq/.erlang.cookie在所有节点上都相同。因此,对于我的所有 rabbitmq 容器,当它们运行时,我传入了一个RABBITMQ_ERLANG_COOKIE环境变量,根据此处的文档https://hub.docker.com/_/rabbitmq/应写入/var/lib/rabbitmq/.erlang.cookie.
当我检查正在运行的容器时,我可以看到存在环境变量RABBITMQ_ERLANG_COOKIE=QOKWQHQKXXTBIEAOPWKE,但是当cat /var/lib/rabbitmq/.erlang.cookie我得到不同的值时AYMNAPKRPCPJVPFYAJZX。
因此,所有rabbitmq 容器都不同.erlang.cookie,无法形成集群。
为什么没有设置来自环境变量的 cookie?我会在这里错过什么?
我正在使用 rabbitmq:3.6.9-alpine 图像。
我已经设置了 docker 引擎模块,并且自动创建了 NAT 交换机。我的问题是:我是否有机会使用现有的 Hyper-V 虚拟交换机来连接我的容器?我还可以使我的网络连接透明吗?我将不胜感激任何有关此事的指导方针。额外问题:考虑到我不太关心安全性,我的主要目的只是隔离一些测试应用程序的地方并使系统尽可能快可能的?谢谢你们。
我在 Amazon Elastic Beanstalk 上有一个多容器 docker 环境,其中包含以下Dockerrun.aws.json文件:
{
"AWSEBDockerrunVersion": 2,
"containerDefinitions": [
{
"name": "web",
"memoryReservation": 256,
"image": "my/nginx/repo/image",
"portMappings": [
{
"hostPort": 80,
"containerPort": 80
}
],
"links": [
"api"
],
"essential": true
},
{
"name": "api",
"memoryReservation": 256,
"image": "my-api/repo",
"essential": true,
"portMappings": [
{
"hostPort": 3000,
"containerPort": 80
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
最终,我希望由 nginx 服务的节点应用程序将请求解析为来自链接容器的命名地址,因此在我的web图像(节点应用程序)中,我想向http://api/some/resourcenginx发出请求并让 nginx 将其解析为 api 容器。
现在,由于 docker 由于指定的链接为 api 容器添加了一个主机条目,我希望 nginx 服务器从主机etc/hosts文件中解析地址,但是正如我发现的那样,nginx 使用它自己的解析器。在稍微研究了这个问题之后,我发现在非 Elastic …
我在思考这意味着如何认真地完成数周,但尚未得出结论。也许我想错了方向。
假设您有一百个网络应用程序来来去去。你想要一个像 gitlab 这样的 nginx 配置:
location / {
proxy_pass http://gitlab;
}
Run Code Online (Sandbox Code Playgroud)
由于 gitlab 是用 来创建的docker service create,nginx 将能够通过它在你的入口网络中的 swarm-vip 假 dns 名称来解析 gitlab。
但是:仅当服务容器正在运行时。否则,nginx 将无法启动,因为 [emerg] 1#1: host not found in upstream "gitlab"
现在,当您必须运行高可用性 nginx 并且确保 proxy_pass 的应用程序正在运行不是您的业务时,这将是一个难题。
每次更新 nginx 服务时,如果其他一百个 swarm 服务中只有一个在同一秒内没有运行,它就不会出现……wtf?
如果这不起作用,为什么我们需要在 swarm 中进行名称解析?你怎么解决这个问题?
我考虑过 consul 和 nginx 虚拟主机模板的动态生成(甚至不要考虑 docker-nginx-proxy!),但是应用程序非常不同,您可以说每个应用程序都有自己的单独配置。而这一切工作不是为了特殊原因,只是为了解决nginx的解决问题?
我有一个 docker 容器,它在启动时在前台运行一个 java 程序。java 程序侦听 上的输入stdin。如何以编程方式将文本发送到 java 程序?
容器以 开头-it,因此我可以docker attach <container-name>输入文本,使用 Enter 发送并使用 分离^p ^q。
我试过docker exec <container-name> echo my-text,但这会回显到标准输出,而不是 java 程序。我可以以某种方式将它传递给 java 程序吗?
我也在Docker 论坛中发现了一个类似的问题,但该解决方案使用screen,我宁愿有一个更干净的解决方案。
我们的指标框上的 CPU 使用率间歇性地为 100%,导致:
渲染 Grafana 仪表板时出现“内部服务器错误”
在我们的机器上运行的唯一应用程序是带有 3 个子容器的 Docker
石墨
格拉法纳
机器规格
操作系统版本 Ubuntu 16.04 LTS
版本 16.04 (xenial)
内核版本 4.4.0-103-generic
Docker 版本 17.09.0-ce
CPU 4 核
内存 4096 MB
内存预留无限制
网络适配器管理
存储
驱动overlay2
Backing Filesystem extfs
Supports d_type true
Native Overlay Diff true
内存交换限制为 2.00GB
以下是来自 cAdvisor 的片段:
kworker 和 ksoftirqd 进程不断地将状态从“D”更改为“R”到“S”
机器规格是否适合此设置?
如何使 CPU 使用率达到“正常”水平?
编辑
我有一个通用的 VPS,并且正在对它的应用程序进行 Dockerising。上面将有大约 5-6 个容器,其他很少,因此可以根据需要对盒子进行简单的重建。
对于每个应用程序,我都有一个启动脚本。WordPress 容器如下所示:
#!/bin/bash
# Get the host IP address
export DOCKER_HOSTIP=`ifconfig docker0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1`
echo "Connecting to database on Docker host ${DOCKER_HOSTIP}"
docker run \
--add-host=docker:${DOCKER_HOSTIP} \
--network dockernet \
--network-alias jonblog \
--detach \
--restart always \
--rm \
jonblog
Run Code Online (Sandbox Code Playgroud)
但是,这会返回错误:
冲突选项:--restart 和--rm
有几张 Docker 票说这是明智的,但我不明白。我想我的意思很明确:如果一个容器没有运行(例如在启动时),那么我想启动它。如果它死了,那么我希望容器被删除,并从基础映像创建一个新的容器。无论如何,容器应该是不可变的——我希望保留的任何状态,如媒体文件和日志,都将被写入卷。
所以,我想我应该放弃这个--restart标志,然后使用进程管理器来停止和启动 Docker 容器。我可以在这里使用Monit吗?我希望能够做这样的事情:
CHECK PROCESS jonblog MATCHING jonblog
START PROGRAM = …Run Code Online (Sandbox Code Playgroud) 我们有一个包含多个 docker 容器的 docker 桥接器。主要的 docker 是一个 nginx 服务器,它充当网络主机并将所有数据转发到其他容器。
现在的要求是连接仅限于指定的 IP 地址列表。为此,我编辑了 nginx 服务器文件:
server {
allow 127.0.0.0/8;
deny all;
...
Run Code Online (Sandbox Code Playgroud)
这应该允许环回 127.0.0.1 连接。
然而,这失败了,查看 access.log 显示了原因:所有行都以:
172.25.0.1 - - [10/Apr/2018:08:22:46 +0000] "GET
Run Code Online (Sandbox Code Playgroud)
172.25.0.1是docker bridge网络网关;因此,码头工人“忘记”了外部 ip,我无法再对其进行过滤。
如何过滤ips?或者将源ips转发给docker?
docker ×10
nginx ×3
containers ×2
docker-swarm ×2
graphite ×1
monit ×1
monitoring ×1
pipe ×1
rabbitmq ×1
stdin ×1