我在 AWS VPC 中运行 docker 时遇到问题。
这是我的设置:我有两台机器在 VPC 中运行:
两者都有分配给它们的弹性 IP,两者都运行在同一个启用 Internet 的子网中。
假设我正在运行一个 Web 服务器,该服务器在容器 10.0.100.150 机器上的容器中提供静态文件:
我正在尝试从我的本地机器(或另一台非 VPC 机器也尝试了一个未在 VPC 中运行的 EC2 实例)访问静态文件,并且它工作得很好。
如果我尝试从另一台机器 (10.0.100.151) 访问文件,它会挂起。我正在使用 wget 来提取文件。
试图用 tcpdump 和 ngrep 调试它,我看到的是请求到达了容器。如果我在主机上使用 ngrep,我会看到请求进入但没有响应返回。如果我 ngrep 在容器上,我会看到请求进入,响应返回。
我尝试了多个 iptables 设置(启用后路由,手动转发端口等)但没有成功。
以任何方式提供帮助 - 甚至调试指导将不胜感激。
谢谢!
我需要添加几行来/etc/hosts让我的 web 应用程序在 Docker 容器中工作。
Docker/etc/hosts是只读的。
我正在尝试使用 dnsmasq:
从 ubuntu:14.04 # ... 运行 apt-get install -y -q dnsmasq 运行 echo 'listen-address=127.0.0.1' >> /etc/dnsmasq.conf 运行 echo 'resolv-file=/etc/resolv.dnsmasq.conf' >> /etc/dnsmasq.conf 运行 echo 'conf-dir=/etc/dnsmasq.d' >> /etc/dnsmasq.conf 运行 echo 'user=root' >> /etc/dnsmasq.conf 运行 echo 'nameserver 8.8.8.8' >> /etc/resolv.dnsmasq.conf 运行 echo 'nameserver 8.8.4.4' >> /etc/resolv.dnsmasq.conf 运行 echo 'address="/mydomain/127.0.6.1"' >> /etc/dnsmasq.d/0hosts 运行服务 dnsmasq 启动
但是,我无法让 Docker 使用我的 DNS 服务器:
$ docker --dns=127.0.0.1 运行 my/container cat /etc/resolv.conf 名称服务器 8.8.8.8 名称服务器 8.8.4.4
我错过了什么?
配置: …
在 Ubuntu 12.04.4 上,我安装了 Docker 1.1.2。我尝试了各种尝试使用以下方法设置图像 ID:
sudo docker run -i -t --name=container1 ubuntu date
Run Code Online (Sandbox Code Playgroud)
但是,我的尝试似乎失败了。每次我做一个docker ps -a图像ID都被随机化了。如果添加,我可以设置主机名,-h container1但我想设置图像 ID。我在这里缺少什么?谢谢!
我正在运行 docker 并安装了主机目录:
$ docker run -v /usr/groups/thing -ti imagename /bin/bash
Run Code Online (Sandbox Code Playgroud)
中的文件/usr/groups/thing/foo可访问:
# ls /usr/groups/thing/foo
a b c
Run Code Online (Sandbox Code Playgroud)
但文件/usr/groups/thing/bar不是:
# ls /usr/groups/thing/bar
ls: cannot open directory /usr/groups/thing/bar: Too many levels of symbolic links
Run Code Online (Sandbox Code Playgroud)
这是在 Debian 上,/usr/groups/thing是一个自动挂载的 NFS 卷。
我使用 Docker 运行 mysql 容器。我从喜欢开始
sudo docker -d --name mysql -p 3306:3306 -v /var/lib/mysql:/var/lib/mysql mysql_image
Run Code Online (Sandbox Code Playgroud)
我怀疑通过停止 docker 来停止 mysql 是不安全的。我错了吗?
sudo docker stop mysql
Run Code Online (Sandbox Code Playgroud)
首先在容器内停止 mysql 是否更安全?
sudo docker exec mysql /usr/bin/mysqladmin shutdown
Run Code Online (Sandbox Code Playgroud) 我正在构建一个容器来调整负载均衡器的内核设置。我更喜欢使用单个特权容器将这些更改部署到映像中的主机。例如:
docker run --rm --privileged ubuntu:latest sysctl -w net.core.somaxconn=65535
Run Code Online (Sandbox Code Playgroud)
在测试中,更改生效但仅适用于该容器。我的印象是,使用完全特权的容器更改 /proc 实际上会更改底层操作系统。
$docker run --rm --privileged ubuntu:latest \
sysctl -w net.core.somaxconn=65535
net.core.somaxconn = 65535
$ docker run --rm --privileged ubuntu:latest \
/bin/bash -c "sysctl -a | grep somaxconn"
net.core.somaxconn = 128
Run Code Online (Sandbox Code Playgroud)
这是特权容器应该如何工作吗?
我只是在做一些愚蠢的事情吗?
做出持久改变的最佳方法是什么?
版本信息:
Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8
OS/Arch (client): linux/amd64
Server version: 1.4.1
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): 5bc2ff8
Run Code Online (Sandbox Code Playgroud)
挂载 /proc …
Red Hat Enterprise Linux 7 包含对运行 Docker 容器的官方支持,并且 Red Hat 提供了一组官方的 rhel Docker 镜像。这些镜像的一个有趣特性是可以通过主机的 Red Hat Network Subscription 安装软件包,而无需在容器内执行任何配置。
引用https://access.redhat.com/articles/881893#createimage:
“对于当前的 Red Hat Docker 版本,您从 Red Hat 中提取的默认 RHEL 7 Docker 映像将能够利用主机系统提供的 RHEL 7 权利。因此,只要您的 Docker 主机正确订阅并且存储库是启用您需要在容器中获取所需软件(并且可以从 Docker 主机访问 Internet),您应该能够从 RHEL 7 软件存储库安装软件包。”
我担心的是,实现这一目标的机制相当不透明。例如,当使用 rhel7.1 镜像启动一个新容器时,yum install foo甚至可以在不配置 http 代理环境变量的情况下运行。如果不了解这种机制,系统管理员可能会受到主机系统、Docker 守护程序和正在运行的容器之间未知交互的影响。这也表明主机和容器之间的正常隔离在某种程度上受到了损害(尽管是以一种良性的方式)。
重点说一下:这种订阅支持是如何实现的,它是否依赖于 Red Hat 通过订阅网络提供的 Docker 守护程序的自定义构建?
我正在尝试将 Amazon 新的 Elastic Container Registry (ECR) 与我的 Jenkins 构建服务集成。我正在使用 Cloudbees Docker Build & Publish 插件来构建容器映像并将它们发布到注册表。
为了使用 ECR 而不是我的私有注册表,我运行了 AWS CLI 命令aws --region us-east-1 ecr get-login,该docker login命令会发出一个命令来运行 - 但我只是复制了密码并从该密码中创建了一个类型为“带密码的用户名”的 Jenkins 凭证(用户名是总是“AWS”)。
这很好用!问题是 AWS CLI 生成的 ECR 密码的有效期仅为 12 小时。所以现在,我必须每天手动重新生成两次密码并手动更新 Jenkins 凭据屏幕,否则我的构建开始失败。
有没有办法生成永久的 ECR 登录令牌,或者以某种方式自动生成令牌?
我有一个 docker-compose 项目,我想通过 systemd 进行控制。在暴发户中,我会使用如下所示的脚本:
description "Start/Stop server"
author "Jim Cortez"
start on filesystem and started docker
stop on runlevel [!2345]
respawn limit 3 240
pre-start script
# wait (if necessary) for our docker context to be accessible
while [ ! -f /projects/my_server/docker-compose.yml ]
do
sleep 1
done
/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up -d
end script
script
sleepWhileAppIsUp(){
while docker ps | grep "$1" >/dev/null; do
sleep 2
done
}
sleepWhileAppIsUp "my_server"
end script
# stop docker container after the stop …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 docker 配置一个 php webapp。这个想法是php-fpm在一个独立的容器中运行应用程序,并有另一个运行 nginx 的容器。此设置的想法是使用相同的 nginx 容器将请求代理到已经在同一台机器上工作的其他 web 应用程序。问题是我无法nginx正确处理静态文件(js、css 等),因为对这些文件的请求一直转到fpm.
这是文件系统的样子:
/
??? Makefile
??? config
? ??? webapp.config
??? webapp
??? web
??? index.php
??? static.js
Run Code Online (Sandbox Code Playgroud)
我正在使用Makefile看起来像这样的(对此不感兴趣docker-compose)运行整个事情:
PWD:=$(shell pwd)
CONFIG:='/config'
WEBAPP:='/webapp'
run: | run-network run-webapp run-nginx
run-network:
docker network create internal-net
run-webapp:
docker run --rm \
--name=webapp \
--net=internal-net \
--volume=$(PWD)$(WEBAPP):/var/www/webapp:ro \
-p 9000:9000 \
php:5.6.22-fpm-alpine
run-nginx:
docker run --rm \
--name=nginx \
--net=internal-net \
--volume=$(PWD)$(CONFIG)/webapp.conf:/etc/nginx/conf.d/webapp.domain.com.conf:ro \ …Run Code Online (Sandbox Code Playgroud) docker ×10
amazon-ecr ×1
amazon-vpc ×1
autofs ×1
jenkins ×1
linux ×1
mac-osx ×1
mysql ×1
networking ×1
nfs ×1
nginx ×1
php-fpm ×1
redhat ×1
rhel7 ×1
su ×1
sysctl ×1
systemd ×1
ubuntu-12.04 ×1
ubuntu-15.04 ×1
yum ×1