标签: docker

在 Docker 中为 MongoDB 创建一个新用户

我正在使用默认的 MongoDB Docker 映像,并且正在尝试为数据库创建一个新用户。

我目前正在尝试这样做:

FROM docker.io/mongo:3.2

MAINTAINER <alexandernst> alexandernst@gmail.com

ADD create_ddbb.js /tmp/

RUN mongod --fork --logpath /var/log/mongodb.log \
    && sleep 5 && mongo foobar /tmp/create_ddbb.js 
Run Code Online (Sandbox Code Playgroud)

和create_ddbb.js:

db.createUser(
    {
      user: "*******",
      pwd: "*******************",
      roles: [
         { role: "readWrite", db: "foobar" }
      ]
    }
);
Run Code Online (Sandbox Code Playgroud)

当我构建 Dockerfile 时,我看到:

Step 4 : RUN mongod --fork --logpath /var/log/mongodb.log       && sleep 5 && mongo foobar /tmp/create_ddbb.js
 ---> Running in 58ba44d02508
about to fork child process, waiting until server is ready for connections. …
Run Code Online (Sandbox Code Playgroud)

mongodb docker

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

使用docker容器时,是否需要docker hub账号?

您不必拥有 Github 帐户即可创建和维护 git 存储库(但您确实会错过 Github 提供的独特优势)。

同样,您可以运行自己的与 Docker 兼容的容器注册表和存储库吗?

我很难找到信誉良好的文档,这些文档要么描述了如何托管我们自己的存储库,要么声明 100% 确定您绝对肯定必须拥有一个 Docker Hub 帐户,并且如果需要,您必须将容器与它们一起存储使用 Docker 工具。(我们的目的是创建我们自己的私有容器。)

docker

8
推荐指数
1
解决办法
1457
查看次数

如何将 Docker 容器日志转发到 ELK?

我想知道将我的 docker 容器日志转发到 ELK 服务器的最简单方法是什么,到目前为止,我在搜索互联网后尝试的解决方案根本不起作用。

基本上,我有一个使用 docker-compose 运行的 docker 映像,该容器不会在本地记录任何内容(它由不同的服务组成,但没有一个是 logstash 或其他任何服务),但我看到通过docker logs -tf imageName或docker-compose logs. 由于我使用 compose 启动容器,因此我无法使用(或至少我不知道如何使用)--logs-driverdocker 选项。

因此,我想知道是否有人可以启发我,例如如何将该日志转发到 ELK 容器。

提前致谢,

问候

解决方案:

感谢 madeddie,我可以通过以下方式解决我的问题,提到我使用了 madeddie 在他的帖子中建议的基本 ELK-stack-in-containers。

首先,我更新了docker-compose.yml我的容器文件,以按照 madeddie 告诉我的那样为日志记录引用添加条目,我为每个服务添加了一个条目,我的 docker-compose 片段如下所示

   version: '2'
    services:
      mosquitto:
        image: ansi/mosquitto
        ports:
          - "1883:1883" # Public access to MQTT
          - "12202:12202"  #mapping logs
        logging: 
           driver: gelf
           options: 
             gelf-address: udp://localhost:12202
    redis:
     image: redis
     command: redis-server --appendonly yes
     ports:
       - "6379:6379" # …
Run Code Online (Sandbox Code Playgroud)

logging syslog docker elk docker-compose

8
推荐指数
1
解决办法
8198
查看次数

创建一个 Windows 10 映像以用作 docker 容器

我正在尝试创建一个 Windows 10 映像,以便对现有的旧应用程序进行 dockerize。出于很好的理由,基本映像必须是 Windows 10而不是Windows Server。我该怎么做?

我想到的是:

1) 将我的 vanilla Windows 安装创建为 Hyper-V 机器

2)在上面安装应用程序

3) 关闭这个虚拟机

4) 将生成的 VHDX 转换为 Windows 映像 (WIM) 文件

5) 以某种方式使用它作为 docker 的基础镜像

我在正确的道路上吗?

disk-image docker windows-10

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

如何禁止 Docker Daemon 将主机的根文件系统挂载到容器中

我有以下容器设置。

在裸机服务器上安装并运行了两个 Docker 守护进程。

  1. 主 Docker 守护进程运行我的应用程序容器,将 80/443 暴露给外界。
  2. Plugin Docker Daemon运行客户提供的一些容器,这些容器通过 80/443 与我的应用程序通信。

我想让客户访问Plugin Docker Daemon的 API (2376),以便客户可以部署/启动/停止他自己的容器。客户只能访问 API,而不能访问主机 (SSH)。

我目前面临的问题是,如果客户运行的容器执行诸如docker run -v /:/host/root Ubuntu rm -rf /host/root.

我的问题是我能做些什么来防止插件 Docker 守护程序挂载根目录/或外部的任何其他目录/home/user/,

  • 是否可以选择在 Docker 守护进程中启动/home/user/?
  • 我可以使用一些 LSM(Linux 安全模块 SELinux/Apparmor)魔法来阻止 docker 守护进程挂载除用户 home 或 var/docker/libs 之外的部分或所有主机路径吗?
  • 可以--userns-remap帮助我实现我的目标吗?
  • 除了虚拟机,还有其他可用的选项吗?

服务器完全属于单个客户。因此,安全性或数据泄漏不是我的主要关注点。我真正想防止的是Plugin Daemon中的某个人正在做一些愚蠢的事情,这会影响我在Main Docker Daemon中运行的容器。我想保持精益并坚持仅使用 docker 的工作流程,并且不会为 VM 创建设置额外的工作流程。

linux selinux chroot apparmor docker

8
推荐指数
1
解决办法
5389
查看次数

将 docker 容器内的电子邮件发送到运行 postfix 的主机 smtp

在服务器上运行我既码头工人图像和后缀SMTP服务器。smtp 服务器可通过 localhost 访问,并且未安装在任何类型的容器中。

问题是我可以在任何容器外使用 sendemail 通过终端发送电子邮件,但我无法通过在任何容器内运行 sendemail 的终端发送电子邮件。

后缀配置如下:

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the …
Run Code Online (Sandbox Code Playgroud)

debian postfix docker

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

如何在 Docker 容器中执行 Neo4j 数据库的转储?

Neo4j 的 docker 容器根据文档启动并使用以下命令正常工作:

$ docker run \
    --detach \
    --publish=7474:7474 \
    --publish=7473:7473 \
    --publish=7687:7687 \
    --volume=$HOME/neo4j/data:/data \
    --volume=$HOME/neo4j/logs:/logs \
    --volume=$HOME/neo4j/ssl:/ssl \
    --ulimit=nofile=40000:40000 \
    --name=myname-neo4j \
    neo4j:3.1.1
Run Code Online (Sandbox Code Playgroud)

当我尝试执行neo4j-admin数据库转储时,出现错误:

$ docker exec -ti myname-neo4j bin/neo4j-admin dump --database=graph.db --to=/home/name/myname.dump
command failed: the database is in use -- stop Neo4j and try again
Run Code Online (Sandbox Code Playgroud)

但是,如果 Neo4j 进程停止(这似乎是释放数据库的唯一方法),容器将关闭。这似乎是 Docker 的预期行为。因此,neo4j-admin dump在没有使用数据库的情况下,从容器内部调用似乎是不可能的。

在仍然使用 Docker 的同时如何解决这个问题?

neo4j docker

8
推荐指数
1
解决办法
9024
查看次数

如何获取特定 AWS ECS 任务的 IP 地址?

我正在尝试在 ECS 中构建我自己的服务发现版本,因为我希望向上和向下扩展的服务不是 HTTP 服务器,因此无法由 ELB 管理。此外,ECS 尚不支持 docker 的用户定义网络功能,这将是进行服务发现的另一种方式。正如该问题讨论中提到的:

目前服务发现是一个巨大的痛苦,需要另一个服务(它本身通常是基于集群的,自我发现然后侦听其他服务)。这是一个凌乱的解决方案,更不用说实施和维护更令人讨厌的 Lambda“解决方案”了。

因此,我将采用令人讨厌的 Lambda“解决方案”路线来代替其他选择。我需要构建这个 hack 服务发现的主要内容是在我的 EC2 主机上运行的每个 docker 容器的 IP 地址。

通过 SSH 连接到充当我的 ECS 容器实例之一的 EC2 服务器,我可以运行docker ps以获取每个正在运行的 docker 容器的容器 ID。对于任何给定的 containerId,我可以运行docker inspect ${containerId}它返回 JSON,包括有关该容器的许多详细信息,特别是NetworkSettings.IPAddress与该容器的绑定(我的发现实现所需的主要内容)。

我正在尝试使用 Lambda 中的 AWS 开发工具包来获取此值。到目前为止,这是我的 Lambda 函数(您也应该能够运行它——这里没有特定于我的设置):

exports.handler = (event, context, callback) => {
    var AWS = require('aws-sdk'),
        ecs = new AWS.ECS({"apiVersion": '2014-11-13'});

    ecs.listClusters({}, (err, data) => {
        data.clusterArns.map((clusterArn) => {
            ecs.listTasks({
                cluster: clusterArn
            }, …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services docker amazon-ecs amazon-lambda

8
推荐指数
2
解决办法
9876
查看次数

Apache 反向代理到 docker 容器

我有一个在 docker 容器上运行的网站,并且我在主机的 apache 上创建了一个 VirtualHost,它对容器(在主机的 8280 端口上)执行反向代理。所以我有:

<VirtualHost *:443>
    ServerName www.example.com
    DirectoryIndex index.php index.html
    SetOutputFilter SUBSTITUTE,DEFLATE

    ProxyPass / http://localname:8280/
    ProxyPassReverse / http://localname:8280/

    Substitute "s|http://localname:8280/|https://www.example.com/|i"

    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateKeyFile /path-to/privkey.pem
    SSLCertificateFile /path-to/cert.pem
    SSLCertificateChainFile /path-to/chain.pem

    <Proxy *>
        Order deny,allow
        Allow from all
        Allow from localhost
    </Proxy>
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias www.example.com

    Redirect permanent / https://www.example.com/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

代理运行良好,我在浏览器中写入 www.example.com 时有响应,但我的所有链接都指向http://localname:8280(如浏览器控制台中所示)和混合内容错误,这就是为什么我已经放置了替代指令,但它不起作用。

我正在使用 apache 文档中 mod_substitute 的配置。

https://httpd.apache.org/docs/2.4/mod/mod_substitute.html

但这不起作用,任何变化。docker 容器基于默认配置的 bitnami/apache 镜像。

任何帮助,将不胜感激。

reverse-proxy docker apache-2.4

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

如果 tzdata 被删除,Alpine Linux 时区不会保持不变

这曾经用于设置时区。我在 Alpine 3.9.4 上有一个容器,它可以工作:

RUN apk add --no-cache tzdata
ENV TZ America/Chicago
RUN apk del tzdata
Run Code Online (Sandbox Code Playgroud)

我现在正在使用 Alpine Linux v3.10.3 创建一个 Docker 容器,但它不再工作了。一位用户建议我需要复制到 /etc/localtime:

RUN apk add --no-cache tzdata
ENV TZ America/Chicago
RUN cp /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apk del tzdata
Run Code Online (Sandbox Code Playgroud)

如果tzdata被删除,这些都不起作用。但是,如果tzdata不删除它们,它们会起作用。为什么是这样?

相关问题

timezone date docker alpine

7
推荐指数
1
解决办法
1590
查看次数