从 Docker 版本20.10(https://github.com/moby/moby/pull/40007)开始,有一个新的特殊字符串host-gateway,可以在--add-host运行标志中使用,以允许从 docker 容器内部直接连接到本地计算机在基于 Linux 的系统上。这非常好。
--add-host=host.docker.internal:host-gateway但是Compose 文件中的等价物是什么?
例如在:
$ docker run \
--rm \
--name postgres \
-p "5433:5432" \
-e POSTGRES_PASSWORD=**** \
--add-host=host.docker.internal:host-gateway \
-d postgres:14.1-bullseye
Run Code Online (Sandbox Code Playgroud)
相同的标志如何--add-host适合这个 Docker Compose 等效模板:
version: '3.9'
services:
postgres:
image: postgres:14.1-bullseye
environment:
POSTGRES_PASSWORD: ****
ports:
- "5433:5432"
Run Code Online (Sandbox Code Playgroud)
肯定不是:network_mode: host在服务级别(参见#Doc)。
我正在docker使用命令构建图像
docker-compose -f "docker-compose.yml" up -d --build
Run Code Online (Sandbox Code Playgroud)
但它返回一个错误
ERROR: 2 matches found based on name: network officeconverter_default is ambiguous
这有点清楚,在我的机器上有两个同名的网络试图存在。
问题是如何从 docker 网络中删除网络
PS E:\repos\Github\officeconverter> docker network ls 网络 ID 名称驱动程序范围 868c88a83bd6桥桥本地 92f7d20ed432 officeconverter_default 桥接本地 3f96cfb7b591 officeconverter_default 桥接本地
我们有一个 WPF 应用程序,它将调用一个名为 API-1 的 Web API,该 API 在 Docker 容器中运行。我还有另一个名为 API-2 的 API,它也在 docker 中运行,但在不同的容器中。
每当应用程序发生 API-1 调用时,API-1 都会执行一些逻辑并尝试向 API-2 发出发布请求。
现在,我的问题是,对 API-2 的 post 请求总是返回Cannot allocate requested address (localhost:XXXX)。
如果我尝试不使用 docker,效果很好。此外,对每个 API 的单独请求也可以正常工作(使用 POSTMAN)
仅当 API 部署在 docker 中时才会出现此问题。我使用 docker-compose 来创建容器。我创建了一个 docker 网桥,并将其分配给 docker-compose.yml 文件中的相应 API。
这是我的 docker-compose 文件以及两个 API 的 docker 文件。
Docker-Compose.yml
version: "3.7"
networks :
localdev:
name: localdev
external: true
services:
api-01:
build:
context: .
dockerfile: api-01/Dockerfile
restart: always
container_name: "api-01"
ports:
- …Run Code Online (Sandbox Code Playgroud) docker dockerfile docker-compose asp.net-core docker-network
我在 docker 中有 Spring Boot 应用程序,并且我正在像这样运行我的应用程序:
docker run --rm --network host --name myapp1 myapp
Run Code Online (Sandbox Code Playgroud)
但是当我尝试从主机访问它时,它失败了:
my_machine:~ root$ curl localhost:8081/someendpoint -v
* Trying ::1...
* TCP_NODELAY set
* Connection failed
* connect to ::1 port 8081 failed: Connection refused
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connection failed
* connect to 127.0.0.1 port 8081 failed: Connection refused
* Failed to connect to localhost port 8081: Connection refused
* Closing connection 0
curl: (7) Failed to connect to localhost port 8081: Connection …Run Code Online (Sandbox Code Playgroud) 我正在运行 nginx 作为 docker-compose 模板的一部分。在 nginx 配置中,我通过 docker 主机名引用其他服务(例如backend,ui)。在我完成这个技巧之前,这一切都很好:
docker stop backend
docker stop ui
docker start ui
docker start backend
Run Code Online (Sandbox Code Playgroud)
这使得后端和 ui 容器交换 IP 地址(docker 在向每个新请求者提供 CIDR 中的下一个可用 IP 的基础上提供私有网络 IP)。这 4 个命令的执行模仿了一些罕见的情况,即两个上游容器同时重新启动,但 nginx 容器没有重新启动。另外,我相信,在基于 Kubernetes 的集群上运行 pod 时,这应该是一种非常常见的情况。
现在nginx将backend主机解析为ui的IP和ui后端的IP。重新加载 nginx 的配置确实有帮助(nginx -s reload)。另外,如果我从 nginx 容器内进行 nslookup - IP 总是能正确解析。
因此,这将问题隔离为围绕 DNS 缓存的纯粹 nginx 问题。
我尝试过的事情:
resolver 127.0.0.11 ipv6=off valid=10s;
Run Code Online (Sandbox Code Playgroud)
我在 2 个不同位置的 2 个不同的 docker-compose.yml 文件中有 2 个不同的服务。
服务1:wordpress
version: "3.7"
services:
# Wordpress
wordpress:
depends_on:
- db
container_name: wordpress
image: wordpress:latest
ports:
- '8000:80'
restart: unless-stopped
volumes: ['./:/var/www/html']
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
networks:
- wpsite
networks:
wpsite:
driver: bridge
Run Code Online (Sandbox Code Playgroud)
服务2:前端
version: "3.7"
services:
frontend:
depends_on:
- wordpress
container_name: frontend
restart: unless-stopped
stdin_open: true
build:
context: ../realm-frontend
volumes:
- static:/realm-frontend/build
networks:
- cms_wpsite
networks:
cms_wpsite:
external: true
Run Code Online (Sandbox Code Playgroud)
我有一个 shell 脚本,可以转到这 2 个位置并运行 docker-compose 文件来创建容器。
脚本
cd …Run Code Online (Sandbox Code Playgroud) 我在 github 操作中启动了一个 docker 容器,并尝试从操作中访问它。但该操作无法解析主机名。如何将我的容器添加到与操作相同的 docker 网络并让操作通过其主机名访问它?
steps:
- name: Run Fuseki
run: docker run -p 3030:3030 --name fuseki -d stain/jena-fuseki /jena-fuseki/fuseki-server --file=/staging/aksw.org.nt /aksw
- name: curl
uses: wei/curl@master
with:
args: https://fuseki:3030/aksw
Run Code Online (Sandbox Code Playgroud)
完整的文件可以在 GitHub 上找到。
当我尝试使用docker-compose部署我的应用程序时,我收到了以下错误:
Creating network "<myapplicationnamehere_mycustomnetwork>" with the
default driver
could not find an available, non-overlapping IPv4 address pool among
the defaults to assign to the network
Run Code Online (Sandbox Code Playgroud)
现在我在这里和那里研究了一下,人们建议修剪未使用的旧码头网络docker network prune.但是因为我运行了34个docker容器(我认为大约有30个网络),所以它只会在错误再次出现之前修剪一个或两个旧网络.
我的问题是:如何在不遇到docker网络分配问题的情况下确保运行多项服务.(也许以某种方式创建更小的子网?)
我的Docker-compose文件的顶级网络部分如下所示:
#
# Networks section
# Networks:
# - public, represents the network between nginx and the public nginx-proxy (which should be already running)
# - uwsgi, represents the network between nginx and uwsgi
# - postgres, represents the network between uwsgi and postgres
#
networks:
uwsgi:
postgres:
public: …Run Code Online (Sandbox Code Playgroud) networking docker docker-compose docker-networking docker-network
我尝试使用docker stack deploy命令部署堆栈(包含一个服务)并从我的swarm应用程序运行2个实例!这是我的docker-compose文件:
version: "3"
services:
server:
image: makbn/thumbnailer-server:v1
deploy:
replicas: 2
update_config:
parallelism: 2
resources:
limits:
cpus: "0.1"
memory: 1024M
restart_policy:
condition: on-failure
ports:
- 8080:8080
networks:
- server_network
networks:
server_network:
Run Code Online (Sandbox Code Playgroud)
运行sudo docker stack deploy -c ./docker-compose.yml ts命令后,My stack成功部署到swarm,但这是我的docker stack ps ts 输出:
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
8zmjp6wt47ki ts_server.1 makbn/thumbnailer-server:v1 fanap9-lp Ready Rejected 2 seconds ago "mkdir /var/lib/docker: permis…"
88vizpnabbi8 \_ ts_server.1 makbn/thumbnailer-server:v1 fanap9-lp Shutdown Rejected 7 seconds …Run Code Online (Sandbox Code Playgroud) 下面是背景故事,但这是问题:我发现,如果我在docker主机上运行了postgresql,则可以通过作为文件安装的域套接字在容器中连接到它:
docker run -v /var/run/postgresql/:/var/run/postgresql
Run Code Online (Sandbox Code Playgroud)
这感觉像是一个主要的hack,所以我很好奇这在生产环境中是否真的可怕。有什么想法吗?
背景是我在docker主机上运行了postgresql,因为我不信任docker直接运行postgresql。
所以我需要从在同一服务器上运行的Docker容器连接到该postgresql实例。我试过了:
使用 --add-host
但这也是一个黑客,因为它要求将docker run放在脚本中以找出主机的正确IP。就像是:
docker run --add-host=postgres-host:$(ip route show | awk {print $2})
Run Code Online (Sandbox Code Playgroud)
我不喜欢那样做。
我尝试使用--net=host,但这不是我们想要的。我们想要一个覆盖网络。
我试图通过在容器中查找主机的IP地址来在容器中进行设置,但为此目的运行脚本并不感到很好。
所以...我想:“使用域套接字怎么办?”
docker-network ×10
docker ×9
dockerfile ×2
asp.net-core ×1
docker-stack ×1
linux ×1
networking ×1
nginx ×1
nginx-config ×1
postgresql ×1
spring-boot ×1