我想练习在一台机器上使用多个 Docker 容器创建高可用的 Web 应用程序。
我在 Docker 容器中启动了多个 Web 服务器。比如说,三台服务器rest1和rest2。rest3
我将 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) 从 iptables 迁移到firewalld 并使用firewall-cmd 更新规则后,我的服务被正确过滤。然后我使用 Docker 将所有服务移至容器,并使用 docker-compose 运行所有内容。
我的默认区域是“公共”。我已手动将 docker0、我的外部(以太网)接口以及 Docker 容器似乎通过 (br-304604a31e79) 与外界通信的接口添加到“公共”区域。我已运行命令将带或不带标志的接口移至“公共”区域--permanent。
当我用来nmap扫描我的服务器时,Docker 容器中运行的服务仍然可以访问(仍然是“开放”,而不是“过滤”)。
为什么 Firewalld 不过滤在我的 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 进程?
我想通过 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”,否则从属应用程序将无法连接。
我在任何文档或其他任何地方都没有找到任何内容。
当我尝试运行 hello-world docker 映像时,出现以下错误:
\nubuntu@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\nRun Code Online (Sandbox Code Playgroud)\n我红色了这篇文章,这似乎是完全相同的问题,但我无法安装不同的内核。
\n我尝试了以下方法来安装新内核,这导致了下一个错误:
\nubuntu@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) 我有一个简单的基于 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\nRun Code Online (Sandbox Code Playgroud)\nPython Web 服务器(使用 CherryPy)报告它已正常启动并打开端口 8080。
\nleagueweb_server | [25/Jan/2022:11:27:21] ENGINE Serving on http://127.0.0.1:8080\nRun Code Online (Sandbox Code Playgroud)\nDocker 报告它正在转发端口 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\nRun Code Online (Sandbox Code Playgroud)\n从远程 PC 进行测试,我可以看到虽然端口 3306 是外部开放的,但端口 8080 却没有。
\nPS …Run Code Online (Sandbox Code Playgroud) 我正在测试 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) 我们配置了一个包含以下代码片段的 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) 我了解 PPA,但 Docker 对我来说是新手。在包管理方面,Docker 和 Dockerfiles 与 Ubuntu 的个人包档案 (PPA) 有何不同?
我正在尝试在基于 docker 的云上运行 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
docker ×10
linux-kernel ×2
centos ×1
centos7 ×1
cherrypy ×1
firewalld ×1
haproxy ×1
keepalived ×1
kernel ×1
kubernetes ×1
linux ×1
memcached ×1
mount ×1
namespaces ×1
nginx ×1
postgresql ×1
ps ×1
python ×1
ssl ×1
top ×1
ubuntu ×1
wordpress ×1