标签: docker

使用主机的 Postfix 从 Docker 容器发送邮件

我正在运行 Ubuntu 14.04 (Linux) 服务器。我已经在服务器上很好地安装和配置了PostfixOpenDKIM;我可以发送电子邮件给自己用,如命令echo hi | sendmail root,和后缀/ opendkim将添加页眉,如Message-IdDateDKIM-Signature,将电子邮件转发到我的个人电子邮件地址,一切都很正常。

现在我想创建一个在Docker容器中运行的应用程序,并且可以同样轻松地发送电子邮件。特别是,我不想担心添加像 的标头Message-Id,也不想在容器本身内部进行太多配置或软件安装。

做这个的最好方式是什么?

有没有办法让容器sendmail在主机上运行可执行文件?

我尝试使用端口 25 上的 SMTP 协议从容器连接到 Postfix,但 Postfix 似乎以不同的方式处理以这种方式接收的消息;我认为它没有添加任何标题,因此该邮件被 gmail 完全拒绝为垃圾邮件(它甚至不足以放入我的垃圾邮件文件夹中)。

这里的邮件日志内容

Sep 28 23:35:52 dantooine postfix/smtpd[4306]: connect from unknown[172.17.0.95]
Sep 28 23:35:52 dantooine postfix/smtpd[4306]: DD457889B: client=unknown[172.17.0.95]
Sep 28 23:35:52 dantooine postfix/cleanup[4309]: DD457889B: message-id=<>
Sep 28 23:35:52 dantooine spamd[3175]: spamd: connection from localhost [::1]:59471 to port 783, fd 6 …
Run Code Online (Sandbox Code Playgroud)

postfix sendmail docker

25
推荐指数
4
解决办法
3万
查看次数

Amazon ECS (Docker):将容器绑定到特定 IP 地址

我正在使用 Amazon ECS(Docker 的重新打包),我发现 ECS 似乎没有提供一项 Docker 功能。即,我希望在一个实例中运行多个容器,并将进入 IP 地址 1 的请求映射到容器 1,进入 IP 地址 2 的请求映射到容器 2,等等。

在 Docker 中,将容器绑定到特定 IP 地址是通过以下方式完成的:

docker run -p myHostIPAddr:80:8080 imageName command
Run Code Online (Sandbox Code Playgroud)

但是,在 Amazon ECS 中,似乎没有办法做到这一点。

我已经设置了一个具有多个弹性 IP 地址的 EC2 实例。将容器配置为任务定义的一部分时,可以将主机端口映射到容器端口。但是,与 Docker 不同的是,ECS 不提供将主机 IP 地址指定为映射的一部分的方法。

另一个转折点是我希望来自容器 N 的出站请求具有容器 N 的外部 IP 地址。

有没有办法做到以上所有?

我浏览了 AWS CLI 文档以及适用于 Java 的 AWS 开发工具包。我可以看到 CLI 可以返回一个包含如下元素的 networkBindings 数组:

{
  "bindIP": "0.0.0.0", 
  "containerPort": 8021, 
  "hostPort": 8021
},
Run Code Online (Sandbox Code Playgroud)

Java SDK 有一个名为 NetworkBinding 的类,表示相同的信息。但是,此信息似乎仅用于输出,以响应请求。我找不到向 ECS 提供此绑定信息的方法。

我想这样做的原因是我想为不同的选区设置完全不同的 VM,在同一个 …

amazon-web-services docker amazon-ecs

25
推荐指数
2
解决办法
2万
查看次数

Docker 中的 Apache:我如何“access.log”?

我刚刚开始使用 Docker 和 Richt,现在我正试图弄清楚如何设置我的第一个 dockerized Apache 2 / PHP 环境。到目前为止,我一直在使用完整的 Linux VM,其中我使用将日志文件写入 /var/log/apache2,然后每天使用“logrotate”跳转到一个新文件。

日志文件主要用于即时错误检测(即登录服务器并使用less 打开当前的access.log 和error.log 文件)和fail2ban。

如果我是对的,那在 Docker 环境中是不可行的——主要是因为您通常无法登录到容器来查看日志。如果容器被移除,日志也会丢失。

那么:在这种情况下,使用/模拟/替换 access.log/error.log 的最常用方法是什么?生产和开发环境的常见解决方案是什么?

到目前为止,我的想法包括使用 NFS 共享(速度慢,如果不小心可能会导致文件名冲突)和logstash(不确定它是否值得付出努力并且对于较小的站点甚至开发环境是否可行?)但我相信聪明的人有没有想出更好的解决方案?

不确定它是否有所作为,但目前我将我的 Docker 映像基于php:5.6-apache

log-files apache-2.2 docker

25
推荐指数
5
解决办法
5万
查看次数

chmod 在 Docker 中无法正常工作

我正在为我的Symfony应用程序构建 Docker 映像,我需要授予 apache 服务器写入缓存和日志文件夹的权限

#Dockerfile
FROM php:7-apache

RUN apt-get update \
&& apt-get install -y libicu-dev  freetds-common freetds-bin unixodbc \
&& docker-php-ext-install intl mbstring \
&& a2enmod rewrite

COPY app/php.ini /usr/local/etc/php/
COPY app/apache2.conf /etc/apache2/apache2.conf
COPY ./ /var/www/html

RUN find /var/www/html/ -type d -exec chmod 755 {} \; 
RUN find /var/www/html/ -type f -exec chmod 644 {} \;
RUN chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs
Run Code Online (Sandbox Code Playgroud)

当我docker build -t myname/symfony_apps:latest .使用docker run -p 8080:80 myname/symfony_apps:latest. Apache …

permissions chmod docker

25
推荐指数
4
解决办法
11万
查看次数

gcloud docker -- 登录尝试推送结果失败,404

我正在尝试将 docker 映像推送到 Google 的容器注册表,但不断收到有关 Docker 登录失败的错误消息。我跑

gcloud docker -- push gcr.io/<my-project-id>/test-image
Run Code Online (Sandbox Code Playgroud)

我回来了

ERROR: Docker CLI operation failed:

Error response from daemon: login attempt to 
https://appengine.gcr.io/v2/ failed with status: 404 Not Found

ERROR: (gcloud.docker) Docker login failed.
Run Code Online (Sandbox Code Playgroud)

其他不通过 docker 工作的 gcloud 操作。例如,我可以通过gcloud container clusters create my-cluster.

我今天确实在玩本地注册表,不确定这是否会破坏事情。

谢谢!

docker google-kubernetes-engine gcloud

25
推荐指数
3
解决办法
4827
查看次数

为什么运行服务器的 Docker 容器会向外界公开端口,即使该端口被 iptables 阻止?

我在 Docker 容器内运行 MySQL 时遇到问题。我的测试映像是从以下 Dockerfile 构建的:

# See: https://index.docker.io/u/brice/mysql/

FROM ubuntu:12.10
MAINTAINER Joni Kahara <joni.kahara@async.fi> 

# Because docker replaces /sbin/init: https://github.com/dotcloud/docker/issues/1024
RUN dpkg-divert --local --rename --add /sbin/initctl
RUN ln -s /bin/true /sbin/initctl

RUN apt-get update
RUN apt-get upgrade -y

RUN apt-get -y install mysql-server

RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf

RUN /usr/bin/mysqld_safe & \
    sleep 10s && \
    mysql -e "GRANT ALL ON *.* to 'root'@'%'; FLUSH PRIVILEGES;"

EXPOSE 3306

VOLUME ["/var/lib/mysql", "/var/log/mysql"]

CMD ["mysqld_safe"]
Run Code Online (Sandbox Code Playgroud)

从上面的文件构建图像后,我运行它:

docker run …
Run Code Online (Sandbox Code Playgroud)

iptables docker

24
推荐指数
1
解决办法
3万
查看次数

Docker 卷备份和恢复

我正在使用 Docker 在 CentOS 6.4 服务器上部署一些服务,我正在尝试弄清楚如何正确备份它们生成的数据。

例如,其中一项服务是用户可以上传文件的 Web 应用程序。对于这个容器,我有一个/files要备份的卷。主机挂载看起来有些不受欢迎,因为这样的挂载绝不是可移植的——正如这篇博文docker 文档中所述

我从同一篇博客文章中知道,我不需要主机安装来访问卷中的文件,我可以用它docker inspect来找出文件的位置。

但这是我的问题:我正在考虑只备份构建容器所需的 dockerfiles 以及与它们关联的卷。如果我必须从备份中恢复所有内容,我将如何知道哪个卷目录对应于哪个容器?重建容器会导致 id 和卷路径发生变化,因此我需要一些额外的信息来匹配它们。如果有的话,我还应该备份什么才能真正恢复所有内容?

backup docker

24
推荐指数
2
解决办法
2万
查看次数

在 glusterfs 中存储 Docker 卷是个好主意吗?

我目前正在考虑将我们的一些服务器和应用程序迁移到coreOS环境。我在这里看到的问题之一是持久数据的管理,因为在将容器移动到新机器时,coreOS 不处理 Docker 卷。经过一番研究,我发现glusterFS声称是一个可以解决我所有问题的集群文件系统。

我目前的想法是:我有一个 glusterFS 容器,它在我的每台 coreOS 机器上作为特权容器运行,并公开一个存储,/mnt/gluster例如。在我的Dockerfiles 中,我指定我的所有卷都应安装在此路径上。

我考虑的下一件事是哪些容器应该获得自己的卷,哪些应该共享一个。例如,每个mysql容器都有自己的卷,因为它能够自己处理复制。我不想惹这个。为同一网站提供服务的网络服务器将正确使用相同的卷来处理“用户上传的图像”等内容,因为它们无法复制这些数据。

有没有人尝试过这样的事情,或者我错过了什么?

cluster replication glusterfs docker coreos

24
推荐指数
2
解决办法
1万
查看次数

如何在 docker 卷容器和 docker 卷之间做出决定?

阅读文档后,我发现自己对如何最好地管理生产应用程序/服务数据有些困惑。

似乎有3种选择:

  1. 只需将卷映射到主机目录(即 的-v参数docker run
  2. 为数据创建一个 docker 容器镜像(即单独的容器和--volumes-from
  3. 创建一个 docker 卷(即docker volume create

现在,似乎公认的做法是选项 #2,但我想知道 #3 的目的是什么。

特别是您如何正确处理这些场景,docker volume对于每种情况,最好使用数据卷容器还是这个?

  • 您需要服务器中单独卷和/或存储层中的应用程序数据
  • 备份
  • 恢复数据

storage docker

24
推荐指数
2
解决办法
1万
查看次数

“输入设备不是 TTY”在“docker run”输出中究竟是什么意思?

这是一个有效的命令:

$ echo 'hi there' | docker run -i ubuntu cat
hi there
Run Code Online (Sandbox Code Playgroud)

这是一条响应错误消息的命令:

$ echo 'hi there' | docker run -it ubuntu cat
the input device is not a TTY
Run Code Online (Sandbox Code Playgroud)

我想弄清楚这里到底发生了什么。不仅仅是“删除 -t 它将被修复”。

我知道docker run's-t选项代表“分配伪 TTY”,我已经阅读了 TTY 代表什么的历史概述,但这并没有帮助我理解这里违反了什么样的合同。

linux tty docker

24
推荐指数
2
解决办法
5万
查看次数