标签: docker

如何将 Docker 与 HAProxy+Keepalived 结合使用?

我想练习在一台机器上使用多个 Docker 容器创建高可用的 Web 应用程序。

我在 Docker 容器中启动了多个 Web 服务器。比如说,三台服务器rest1rest2rest3

我将 Docker 与 HAProxy 平衡器结合使用,该平衡器绑定到服务器127.0.0.1:80并将查询路由到rest服务器。这使我可以确定,当一两台rest服务器发生故障时,我将能够进行查询127.0.0.1:80并收到正确的结果。

坏事是:当 HAProxy 关闭时,Web 应用程序也会关闭。

我想使用多个 HAProxy Docker 容器,每个容器中都带有 Keepalived 服务。问题是:我需要几个Docker容器来监听一个IP和一个PORT。例如,我将拥有haproxy1和,它将通过 Keepalivedhaproxy2绑定到。localhost

当我在 HAProxy 配置文件中设置 IP(不是当前 Docker 容器的 IP)时,它显示一个错误,HAProxy 无法侦听此 IP 和端口。

是否可以使用HAProxy和Keepalived配置多个Docker容器来监听一个IP和PORT?

HAProxy的配置:

defaults
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend http-in
    mode http
    bind 172.17.0.10:80
    default_backend BACKEND

backend BACKEND
    option httpchk
    server rest1 …
Run Code Online (Sandbox Code Playgroud)

high-availability haproxy failovercluster keepalived docker

4
推荐指数
1
解决办法
8018
查看次数

为什么 Firewalld 不过滤在我的 Docker 容器中运行的服务?

从 iptables 迁移到firewalld 并使用firewall-cmd 更新规则后,我的服务被正确过滤。然后我使用 Docker 将所有服务移至容器,并使用 docker-compose 运行所有内容。

我的默认区域是“公共”。我已手动将 docker0、我的外部(以太网)接口以及 Docker 容器似乎通过 (br-304604a31e79) 与外界通信的接口添加到“公共”区域。我已运行命令将带或不带标志的接口移至“公共”区域--permanent

当我用来nmap扫描我的服务器时,Docker 容器中运行的服务仍然可以访问(仍然是“开放”,而不是“过滤”)。

为什么 Firewalld 不过滤在我的 Docker 容器中运行的服务?

firewalld docker docker-compose

4
推荐指数
1
解决办法
1008
查看次数

在进程列表中识别 Docker 内部运行的进程

我意识到在 Docker 容器内运行的进程出现在主机的进程列表中:

# ps aux | grep mariadb
root     12486  0.0  0.0 112812   976 pts/0    S+   14:47   0:00 grep --color=auto mariadb
Run Code Online (Sandbox Code Playgroud)

有没有办法识别进程是在主机上运行还是在 Docker 容器上运行,或者有办法过滤掉 Docker 进程?

centos top ps docker centos7

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

Docker PostgreSQL 将数据库编码更改为 UTF-8

我想通过 docker-compose 运行一个 postgres 容器,该容器具有 COLLATE 和 CTYPE 'C' 以及数据库编码 'UTF-8'。但这看起来是不可能的。

这是 docker-compose.yml 上的部分:

database:
    image: postgres:latest
    volumes:
        - db:/var/lib/postgresql/data
    environment:
        POSTGRES_PASSWORD: test
        LC_COLLATE: C
        LC_CTYPE: C
        LANG: C.UTF-8
Run Code Online (Sandbox Code Playgroud)

这是日志输出:

The database cluster will be initialized with locales.
The default text search configuration will be set to "english".
  COLLATE:  C
  CTYPE:    C
  MESSAGES: C.UTF-8
  MONETARY: C.UTF-8
  NUMERIC:  C.UTF-8
  TIME:     C.UTF-8
The default database encoding has accordingly been set to "SQL_ASCII".
Run Code Online (Sandbox Code Playgroud)

我必须将数据库编码设置为 UTF-8,并将 COLLATE 和 CTYPE 设置为“C”而不是“C.UTF-8”,否则从属应用程序将无法连接。

我在任何文档或其他任何地方都没有找到任何内容。

postgresql docker docker-compose

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

无法运行 docker-container '无法在网桥上创建端点frosty_varahamihira'

当我尝试运行 hello-world docker 映像时,出现以下错误:

\n
ubuntu@ubuntu:~$ sudo docker run hello-world\ndocker: Error response from daemon: failed to create endpoint frosty_varahamihira on network bridge: failed to add the host (vethc6c068f) <=> sandbox (veth82a7475) pair interfaces: operation not supported.\nERRO[0000] error waiting for container: context canceled\n
Run Code Online (Sandbox Code Playgroud)\n

我红色了这篇文章,这似乎是完全相同的问题,但我无法安装不同的内核。

\n

我尝试了以下方法来安装新内核,这导致了下一个错误:

\n
ubuntu@ubuntu:~$ sudo wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.7.5/amd64/linux-headers-5.7.5-050705-generic_5.7.5-050705.202006220832_amd64.deb\n--2021-10-22 13:47:14--  https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.7.5/amd64/linux-headers-5.7.5-050705-generic_5.7.5-050705.202006220832_amd64.deb\nResolving kernel.ubuntu.com (kernel.ubuntu.com)... 91.189.94.216\nConnecting to kernel.ubuntu.com (kernel.ubuntu.com)|91.189.94.216|:443... connected.\nHTTP request sent, awaiting response... 200 OK\nLength: 1223448 (1.2M) [application/x-debian-package]\nSaving to: \xe2\x80\x98linux-headers-5.7.5-050705-generic_5.7.5-050705.202006220832_amd64.deb\xe2\x80\x99\n\nlinux-headers-5.7.5-050705-generic_5.7.5-05070 100%[===================================================================================================>]   1.17M  2.53MB/s    in 0.5s\n\n2021-10-22 13:47:20 (2.53 …
Run Code Online (Sandbox Code Playgroud)

linux ubuntu kernel linux-kernel docker

4
推荐指数
1
解决办法
4410
查看次数

Docker Compose 端口未暴露?

我有一个简单的基于 Python 的 Web 服务器,在使用 docker compose 设置的容器中运行,该容器公开端口 8080。

\n

当我 docker-compose up 服务时,它报告端口已公开,但端口未向外部公开。

\n

接下来我应该看什么诊断?

\n

这是一个典型的运行

\n
\xe2\x9e\x9c  demo04 sudo docker-compose up -d\nRecreating leagueweb_database ... done\nRecreating leagueweb_server   ... done\n
Run Code Online (Sandbox Code Playgroud)\n

Python Web 服务器(使用 CherryPy)报告它已正常启动并打开端口 8080。

\n
leagueweb_server | [25/Jan/2022:11:27:21] ENGINE Serving on http://127.0.0.1:8080\n
Run Code Online (Sandbox Code Playgroud)\n

Docker 报告它正在转发端口 8080

\n
\xe2\x9e\x9c  demo04 sudo docker-compose ps\n       Name                     Command                  State                              Ports\n------------------------------------------------------------------------------------------------------------------------\nleagueweb_database   /entrypoint.sh mysqld            Up (healthy)   0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp\nleagueweb_server     ./wait-for-it.sh database: ...   Up             0.0.0.0:8080->8080/tcp,:::8080->8080/tcp\n
Run Code Online (Sandbox Code Playgroud)\n

从远程 PC 进行测试,我可以看到虽然端口 3306 是外部开放的,但端口 8080 却没有。

\n
PS …
Run Code Online (Sandbox Code Playgroud)

python cherrypy docker docker-compose

4
推荐指数
1
解决办法
5430
查看次数

将一个容器 FS 树绑定挂载到另一个容器以用于调试或临时容器?

我正在测试 k8s 调试功能,包括调试 pod 和临时容器,但我无法弄清楚如何将“目标”pod 的文件系统正确映射到调试容器中。

我想使用递归绑定挂载 * 链接两个不相交的挂载命名空间,以便容器 A 将容器 B 的根视为容器 B 的根,/containerB反之亦然。包括所有卷和其他安装。

目标:同时访问调试和目标容器文件系统

目标是让目标 pod 的完整文件系统树,包括映射到调试容器的子目录(例如 )的卷和其他挂载/run/target。如果目标容器挂载持久卷,则应映射这些挂载点,因此,例如,如果目标容器具有,/data则调试容器应具有已安装的/run/target/data.

或者,可以将调试容器文件系统树“注入”到目标容器中,因此可以在调试容器/run/debug时公开可用的调试容器根。nsenter包括它的像 procfs 这样的挂载,所以它的功能齐全。

我希望能够例如调试容器提供的gdb -p $target_pid位置。为此,必须能够从目标容器中找到进程可执行文件。gdbgdb

我探索了一些解决方法。但我真正想做的是将mount --rbind目标容器 FS 树转移到来宾上,反之亦然。给定一个定制的特权调试容器,例如:

apiVersion: v1
kind: Pod
metadata:
  name: debugcontainer
  namespace: default
spec:
  nodeName: TARGET_NODE_NAME_HERE
  enableServiceLinks: true
  hostIPC: true
  hostNetwork: true
  hostPID: true
  restartPolicy: Never
  containers: …
Run Code Online (Sandbox Code Playgroud)

mount namespaces linux-kernel docker kubernetes

4
推荐指数
1
解决办法
1137
查看次数

memcached 支持需要 libmemcached

我们配置了一个包含以下代码片段的 Dockerfile:

ENV MEMCACHE_VERSION=8.0 \
    MEMCACHED_VERSION=3.2.0

############## END ENVIRONMENT VARIABLES ###############
########################################################

RUN apt-get update && apt-get install -y --no-install-recommends \
    zlib1g-dev \
    zlib1g \
    libmemcached11 \
    libmemcachedutil2 \
    libmemcached-dev \
    libmagickwand-dev 

RUN pecl install memcache-$MEMCACHE_VERSION && \
    pecl install memcached-$MEMCACHED_VERSION && \
    pecl install imagick
Run Code Online (Sandbox Code Playgroud)

但是昨天从17:00开始运行后docker compose up --build -d --force-recreate突然开始出现以下错误。注意:17:00之前没有出现这种情况,一整天都运行得很好。

 => ERROR [builder 3/3] RUN pecl install memcache-8.0 &&     pecl install memcached-3.2.0 &&     pecl install imagick                   15.1s
Run Code Online (Sandbox Code Playgroud)
#0 15.03 checking for libmemcached location... configure: error: memcached …
Run Code Online (Sandbox Code Playgroud)

memcached docker

4
推荐指数
2
解决办法
4139
查看次数

包和 Docker 镜像的区别

我了解 PPA,但 Docker 对我来说是新手。在包管理方面,Docker 和 Dockerfiles 与 Ubuntu 的个人包档案 (PPA) 有何不同?

package-management docker

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

nginx 反向代理背后的 Wordpress 在 https 中不起作用

我正在尝试在基于 docker 的云上运行 wordpress。设置是:

WordPress 云设置

有一个运行 mysql 数组的服务器,它为在 Nginx 上运行的 Wordpress 容器提供服务。设置是从此dockerfile复制的。此设置的目标是实现高吞吐量并与我们的云设置兼容。

wordpress 容器有一个本地 ip,在与 mysql 数组和 Nginx 反向代理相同的子网中,以及一个运行 http(不是 https)的公共端口。

反向代理配置为为 wordpress 容器运行 SSL。导航适用于 http 和 https,但是当我尝试使用 HTTPS 登录仪表板时,出现此错误:

您没有足够的权限访问此页面。

我发现的唯一有意义的错误发生在我通过 HTTP 登录仪表板时:

[04-Nov-2014 23:16:13 UTC] PHP 通知:未定义索引:HTTP_X_FORWARDED_PROTO in /usr/share/nginx/www/wp-config.php on line 86

但仪表板在 http 上正常工作。

在 Wordpress 配置文件中,我必须添加以下行:

/* SSL代理*/

if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') $_SERVER['HTTPS']='on';

我认为这是罪魁祸首。我在wordpress 官方文档中找到了这个技巧,没有它 HTTPS 不会加载 CSS,无论是记录还是未记录。我想也许我应该修改这条线以适应我的配置?

无论是这个,还是 nginx 反向代理配置文件,我都不知道。

wordpress + nginx容器中的nginx配置文件比较标准,从这里复制过来的

请帮帮我:D

ssl nginx reverse-proxy wordpress docker

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