标签: docker-compose

从 Docker 容器内部向主机系统公开 Unix 套接字

我想在侦听 Unix 套接字而不是端口的 Docker 容器中运行一个 web 服务器。我在共享 Docker 套接字方面发现了很多结果,但我认为这不是我想要的。

我希望主机系统能够连接到容器内正在侦听的 Unix 套接字。

我正在使用 docker-compose,所以通常的使用方式-v不起作用。

我的 ngix 站点配置:

server {                                                                                             
   listen 80; listen [::]:80;                                                            
    server_name foo.com www.foo.com;

    location / {                                                                         
        proxy_pass http://unix:/var/lib/docker/volumes/app_shared/_data/app.https.sock:;       
        proxy_set_header Host $http_host;                                                            
        proxy_http_version 1.1;                                                                      
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;                                 
        proxy_set_header X-Forwarded-Proto https;                                                    
    } 
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: '3'
services:      
  web:
    build: .
    volumes:
            - shared:/var/app
    command: "npm start"
volumes:
   shared:
Run Code Online (Sandbox Code Playgroud)

然而它说我无法连接到套接字,即使它存在于主机的这个位置。

socket docker-compose

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

使用 iptables 规则不适用于 Docker 容器

只需设置一个 ElasticSearch 容器即可与公司的 Laravel 应用程序一起使用。创建 docker-compose.yml 并运行它是完美且直接的,但是当我想要对这个东西进行防火墙以便只能从提到的 Laravel 应用程序的一个特定 IP 访问它时,就会出现问题。

在研究过程中,我注意到很多人都遇到这些问题,即 Docker 转发的端口流量完全暴露于公众,并且他们无法正确对其进行防火墙设置。

在过去的 6 小时内我找到了几个解决方案,但没有一个有效。我认为这与 Docker 处理/转发入站流量的方式有关,而且我的 iptables 知识并不是那么广泛,因此我可以自己理解发生了什么。

这是我的 docker-compose.yml (就其价值而言):

version: '3.4'

services:

  elasticsearch:
    image: khezen/elasticsearch:6.1.1
    container_name: elasticsearch

    environment:
      NETWORK_HOST: 0.0.0.0
      HOSTS: 127.0.0.1
      CLUSTER_NAME: fd-es
      NODE_NAME: node-1
      HEAP_SIZE: 31g
      HTTP_SSL: "true"
      ELASTIC_PWD: "somepasswd"
      HTTP_CORS_ENABLE: "true"
      HTTP_CORS_ALLOW_ORIGIN: /https?:\/\/localhost(:[0-9]+)?/

    ulimits:
      memlock:
       soft: -1
       hard: -1

    volumes:
      - ./config/elasticsearch.yml:/elasticsearch/config/elasticsearch.yml
      - ./data:/elasticsearch/data
      - ./logs:/elasticsearch/logs

    ports:
      - 9200:9200

    networks:
      - es-network

    restart: always

networks:
  es-network:
    driver: bridge …
Run Code Online (Sandbox Code Playgroud)

networking iptables docker docker-compose

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

如何保护 docker 主机不允许生根

我正在尝试使服务器上的 docker 更安全。主要问题是大多数人说“如果一个人可以访问 docker,他们也可以是 root”,对于少数管理员来说,这不是您想要的。

详细地说,他们可以使用-v并挂载/etc/mnt容器中并更改影子文件并获得对主机的访问权限。他们也可以使用-d, 或特权选项来做更多的事情。

所以基本上,我想“尝试”和限制一些事情。

  1. 卷绑定挂载
  2. 特权
  3. --add-cap
  4. -d (某些项目?)

到目前为止我的想法:

  • docker bash 脚本的别名,在其上使用 sudo 并正则表达式他们不应该做的所有事情。
  • 打开远程 api,保护它,也许用 nginx 和 nginx 中的正则表达式反向代理它不应该做的事情。
  • 使用其他工具?Mesos/马拉松/Swarm/造船厂/随便什么

可选项目是在提交到 git 代码时制作容器,并让“检查器”验证内容Dockerfile并为它们创建图像。然后对该映像进行签名并自动部署它。(但这不会再给他们太多自由)

此外,删除绑定卷并不是最好的。如果我们有一个 docker 插件,上面写着“你只能/data以用户 X 的身份挂载”,其中USERinDockerfile是那个用户 X,那就简单多了。

docker-novolume-plugin这样的东西对于卷来说已经是一个不错的开始,虽然不限制绑定卷。

最后的问题是,我如何让用户以他们自己的用户/docker 身份构建/拉取/运行 docker 映像,而无法根系统。只要它有效,就不必完美。

security docker kubernetes apache-mesos docker-compose

6
推荐指数
1
解决办法
1632
查看次数

有没有办法刷新docker的嵌入式dns缓存?

我工作的环境有时 DNS 服务器会崩溃并告诉您它无法解析主机(例如,查找“github.com”失败)。它是暂时的,通常恢复得相当快。然而,有时当这种情况发生时,docker 守护进程在用户定义的桥接网络上提供的嵌入式 DNS 服务似乎会缓存错误的结果。一旦被缓存,我们最终需要完全删除网络并重建它(即,docker-compose down然后docker-compose up)。我在运行 docker-engine 17.05.0-ce、build 89658be 的 debian jessie 盒子上看到了这一点。

有没有其他人遇到过这种情况,并且可能找到了比拆除和重建网络更轻量级的解决方案?

docker debian-jessie docker-compose

6
推荐指数
0
解决办法
6010
查看次数

EC2 实例冻结

在一个特定的情况下,我遇到了突然冻结的情况。
以下是实例的一些详细信息:
类型:t2.micro
Region/av。区域:us-west-2b
操作系统:amzn-ami-hvm-2018.03.0.20180811-x86_64-gp2 (ami-a0cfeed8)

我的这个 Ec2 实例自动冻结。
我在实例中安装了 docker。
我是这个领域的新手。
不知道从哪里可以获取系统或服务器日志来解释为什么我的 ec2 实例持续冻结,以便我可以跟踪问题。
提前致谢。

amazon-ec2 amazon-web-services unexpected-shutdown docker docker-compose

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

Docker + Nginx + PHP-FPM 错误:[emerg] 1#1: 在上游找不到主机

我有一个从这个 repo克隆的 LEMP 堆栈的 docker 设置。

在运行窗口 10 的开发机器上一切正常,但是当我将图像推送到 docker hub 并将其拉到我的 VPS 上时,无论我做什么,我总是收到此错误:

[emerg] 1#1: host not found in upstream "php-fpm:9000" in /etc/nginx/conf.d/upstream.conf:1
Run Code Online (Sandbox Code Playgroud)

此错误来自两个文件。

第一: 来自这个 Nginx Docker 文件

这是代码:

RUN echo "upstream php-upstream { server ${PHP_UPSTREAM_CONTAINER}:${PHP_UPSTREAM_PORT}; }" > /etc/nginx/conf.d/upstream.conf \
&& rm /etc/nginx/conf.d/default.conf
Run Code Online (Sandbox Code Playgroud)

第二个 来自这个 Nginx default.conf 文件

这是代码:

    location ~ \.php$ {
      ...
      fastcgi_pass php-upstream;
      ...
    }
Run Code Online (Sandbox Code Playgroud)

我说这两个文件是 b/c 其他地方没有引用 php-upstream 的原因。

我已经尝试了添加/删除主机、添加depends_on、更改 nginx、php 版本、禁用 selinux 的所有可能组合,但它不起作用。我总是在生产中遇到相同的错误,但在本地服务器上一切正常。

nginx php-fpm docker docker-compose docker-machine

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

Docker 主机的正确 iptables 规则是什么?

我有带 Docker 的 Ubuntu 服务器来为 MySQL 和 SSH/SFTP 提供服务,我需要对除330622之外的所有端口进行防火墙设置,这是非常标准和微不足道的要求,对吧?

现在,我设法找到了一种解决方案,但在应用它之后,它对我来说并不完全有效,要么:

  1. 我无法访问任何提到的服务(默认情况下)
  2. 我无法从容器内访问互联网(如果我放入iptables: falseDocker 的daemon.json配置文件)

我尝试了许多其他搜索结果,但它们大多非常复杂,以至于我不明白他们在做什么,或者他们编写了大量脚本,这让我成为一个 iptables 外行,从它那里获取一些东西是一项不可能完成的任务。

提议的解决方案看起来相当简单且易于理解,但整个 Docker 网络的复杂性使得调试变得更加困难。

有人可以分享他们针对 Docker 主机的工作 iptables 规则或至少指导我正确的方向吗?

我使用 docker-compose 来启动服务,这是我的 yaml:

version: '3.7'

services:
  mysql:
    container_name: 'mysql'
    image: mysql:8.0.13
    command: --default-authentication-plugin=mysql_native_password
    user: 1000:1000
    ports:
      - "3306:3306"
    volumes:
      - ./data:/var/lib/mysql
      - ./config/custom.cnf:/etc/mysql/conf.d/custom.cnf
    networks:
      - database
    restart: always

networks:
  database:
    driver: bridge
Run Code Online (Sandbox Code Playgroud)

编辑: 我发现允许 Docker 管理 iptables 规则是推荐的并且要求不高,至少从长远来看是可以的,即使我没有以我喜欢的方式打开所需的端口,它仍然可以有效的。此时我想要的是找出是否可以使用 iptables 来阻止 Docker 打开的端口以及如何(通过 mangle 预路由?)。有什么建议?万分感谢!

linux iptables linux-networking docker docker-compose

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

使用 docker-compose 设置重新启动容器的时间段

如何每 60 秒重新启动容器服务我尝试睡眠,但它对我不起作用:

spark:
    image: jaegertracing/spark-dependencies
    environment:
      - STORAGE=elasticsearch
      - ES_NODES=http://localhost:9200
    command: [ /bin/bash -c sleep 20 ]
    restart: always
    networks:
      - elastic-jaeger
Run Code Online (Sandbox Code Playgroud)

docker docker-compose

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

为什么当文件存在时 docker-compose 会发出“没有这样的文件或目录”?

我正在测试我的服务器的裸机恢复,它基本上用我的服务启动了一组 docker 容器。我从备份中恢复/etc/docker,在那里我保留了所有配置和持久卷。

然后我尝试启动其中一个容器:

root@srv-backup:/etc/docker# docker-compose --verbose -f /etc/docker/docker-compose.d/20-registry.yaml up
compose.config.config.find: Using configuration files: /etc/docker/docker-compose.d/20-registry.yaml
ERROR: compose.cli.main.main: .IOError: [Errno 2] No such file or directory: '/etc/docker/docker-compose.d/20-registry.yaml'
Run Code Online (Sandbox Code Playgroud)

然而,该文件在那里:

root@srv-backup:/# ll /etc/docker/docker-compose.d/20-registry.yaml
-rwxrwxr-x+ 1 root root 842 Jan 24 15:19 /etc/docker/docker-compose.d/20-registry.yaml*

root@srv-backup:/# cat /etc/docker/docker-compose.d/20-registry.yaml
services:
  registry:
    container_name: registry
    image: registry
    labels:
      - traefik.http.routers.registry.rule=Host(`registry.example.com`)
      - traefik.http.routers.registry.entryPoints=https
      - traefik.http.routers.registry.tls=true
      - traefik.http.routers.registry.tls.certresolver=le
      - traefik.http.middlewares.lan.ipwhitelist.sourcerange=192.168.10.0/24, 192.168.20.0/24
      - traefik.http.routers.registry.middlewares=lan
      - traefik.enable=true
    restart: unless-stopped
    volumes:
      - /etc/docker/container-data/registry:/var/lib/registry
version: '3'

root@srv-backup:/# file /etc/docker/container-data/registry
/etc/docker/container-data/registry: directory
Run Code Online (Sandbox Code Playgroud)

我用相对路径和完整路径尝试了各种咒语 - …

docker docker-compose

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

基于 Docker 的反向代理和 NginX 用于多个域

我正在尝试创建一个基于 docker 的多容器设置,其中包含多个域的反向代理以提供服务,其中网站、数据库和基于 nginx 的反向代理在容器中运行,但我不知道我在做什么丢失(我是 nginx 新手)。

\n\n

细节:

\n\n
    \n
  • 基于 NginX 的 docker 容器用于反向代理
  • \n
  • 我拥有 2 个域\n\n
      \n
    • 例如:my_example_domain_1.com,my_example_domain_2.net
    • \n
  • \n
  • 我想在每个域名后面放置一个容器来服务这两个域\n\n
      \n
    • 我想运行两个独立的网站:例如:两个 WordPress 网站
    • \n
  • \n
  • 我需要两个域和相应容器之间的 NginX 路由
  • \n
\n\n

我的例子: (basedir multi-container:)

\n\n

nginx_revproxy/default.conf:

\n\n
server {\n    listen       80;\n    server_name  localhost;\n\n    location / {\n        root   /usr/share/nginx/html;\n        index  index.html index.htm;\n    }\n\n    error_page   500 502 503 504  /50x.html;\n    location = /50x.html {\n        root   /usr/share/nginx/html;\n    }\n}\n\nserver {\n    listen       80;\n    server_name  my_example_domain_1.com;\n    location …
Run Code Online (Sandbox Code Playgroud)

nginx routing reverse-proxy docker docker-compose

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