下面是背景故事,但这是问题:我发现,如果我在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地址来在容器中进行设置,但为此目的运行脚本并不感到很好。
所以...我想:“使用域套接字怎么办?”
我有一个在 win server 2016 上运行的 Windows docker 容器
容器中运行的站点可以从网络上的其他节点访问。
容器可以访问互联网(它可以访问网络外部的第 3 方节点),但无法连接到网络中的其他节点。
当容器中运行的应用程序尝试访问网络中另一台计算机 (machine_name) 上的服务时,会出现以下错误:
The remote name could not be resolved: machine_name
当应用程序尝试连接到网络上的数据库时:
A network-related or instance-specific error occurred while establishing a connection
所以看起来容器没有访问权限或者找不到内网机器
我跑了 docker exec -ti e87633560c6c ipconfig /all 并得到以下信息:
Windows IP Configuration
Host Name . . . . . . . . . . . . : gmsa_acct
Primary Dns Suffix . . . . . . . :
Node Type . . . . . …Run Code Online (Sandbox Code Playgroud) Docker 网络文档指出:
示例显示:
$ docker network create \
--driver=bridge \
--subnet=172.28.0.0/16 \
--ip-range=172.28.5.0/24 \
--gateway=172.28.5.254 \
br0
Run Code Online (Sandbox Code Playgroud)
因此,子网是从 172.28.0.0 到 172.28.255.255
ip 范围是从 172.28.5.0 到 172.28.5.255
为什么要使子网大于 IP 范围?
为什么有子网和 ip-range 选项?
我是Docker的新手但不是那么新我不理解Docker的cli.但是我对Docker文件和Docker Compose的处理方式都很新.如果有人能向我解释docker-compose.yml的这一部分,我将非常感激.
我的评论是嵌入式的:
networks:
vpcbr: <-I know what this is
driver: bridge <-I know what this is
ipam: <-What the heck is this for?
config: <-I know what this is.
- subnet: 10.5.0.0/16 <- Obvious
gateway: 10.5.0.1 <- Obvious
Run Code Online (Sandbox Code Playgroud) 这是我希望从外部容器(在另一个撰写文件中定义)连接到的带有容器配置的撰写文件:
version: '3.5'
services:
service-to-connect-to:
build: .
networks:
- my-external-network
networks:
my-external-network:
external: true
Run Code Online (Sandbox Code Playgroud)
和另一个包含我希望连接到的容器配置的撰写文件service-to-connect-to:
version: "3.5"
services:
service-to-connect-from:
build: .
Run Code Online (Sandbox Code Playgroud)
我试图service-to-connect-to通过这个域连接到:
service-to-connect-to
service-to-connect-to.my-external-network
my_external_network.service-to-connect-to
但他们都没有工作。
我错在哪里?
谢谢
我有两个 Docker 容器:
我像这样运行我的数据库容器:
docker run --name my-db -p 127.0.0.1:3306:3306 my-db-image
我的应用程序容器是这样的:
docker run --name my-app --network host -it my-app-image
这在 Linux 上运行良好。我可以从主机系统和应用程序容器访问数据库。完美的。
但--network host不适用于 Mac 和 Windows:
主机网络驱动程序仅适用于 Linux 主机,Docker for Mac、Docker for Windows 或 Docker EE for Windows Server 不支持。
(来源: https: //docs.docker.com/network/host/)
我仍然可以从主主机访问数据库127.0.0.1:3306,但无法从应用程序容器访问它。
我该如何解决这个问题?如何让应用程序容器连接到数据库(并使用 继续从主主机访问数据库127.0.0.1:3306)?
我尝试过使用host.docker.internalandgateway.docker.internal但它不起作用。
我还尝试--network my-network在创建后my-network使用启动两个容器docker network create my-network,但它不起作用。
我不知道如何解决这个问题。
我正在尝试使用外部网络连接在 docker-compose 上运行的两个本地开发的项目。
从一方面来看,我有第一个要公开的应用程序。Compose 包含主机:app和rabbit:
version: '3.4'
services:
app:
# ...
rabbit:
# ...
networks:
default:
driver: bridge
Run Code Online (Sandbox Code Playgroud)
从另一边来看,我有第二个应用程序预计会看到第一个应用程序:
version: '3.4'
services:
app:
# ...
networks:
- paymentservice_default
- default
networks:
paymentservice_default:
external: true
Run Code Online (Sandbox Code Playgroud)
rabbit.paymentservice_default可以到达主机。
然而,服务(第一)与(第二)app冲突:app
root@6db86687229c:/app# ping app.paymentservice_default
PING app.paymentservice_default (192.168.80.6) 56(84) bytes of data.
root@6db86687229c:/app# ping app
PING app (192.168.80.6) 56(84) bytes of data.
Run Code Online (Sandbox Code Playgroud)
一般来说,从第二个角度来看,主机app和app.paymentservice_default共享相同的 IP 使得app.paymentservice_default无法被发现。
这里的问题是,我是否有正确的配置并且可以在不更改服务名称的情况下避免app冲突?为什么有这个限制?考虑到每个 docker-compose …
我有 2 个图像,我想通过 compose 的默认桥接网络相互通信,但我也希望它们能够访问我的主机网络。
为了允许图像在 compose 的默认桥接网络中相互通信,我不需要执行任何操作:
version: '3.4'
services:
hello:
image: hello-world
world:
image: hello-world
Run Code Online (Sandbox Code Playgroud)
通过上述规范,服务可以通过使用 DNS 名称来hello引用服务worldworld
如果我希望 hello 服务能够与我的主机网络交互,我可以添加network_mode: host到规范中。
version: '3.4'
services:
hello:
image: hello-world
network_mode: host
world:
image: hello-world
Run Code Online (Sandbox Code Playgroud)
这允许hello服务访问我的主机网络,但无法再world通过 compose 的内置 DNS 进行访问。我怎样才能同时实现这两个目标?
我尝试创建自定义网络,但自定义网络无法使用主机驱动程序,并且我无法network_mode与以下命令结合使用networks:
这不起作用:
version: '3.4'
services:
hello:
image: hello-world
network_mode: host
networks:
- bridge
world:
image: hello-world
networks:
- bridge
networks:
test:
driver: bridge
Run Code Online (Sandbox Code Playgroud)
$ docker-compose up …Run Code Online (Sandbox Code Playgroud) 在 docker 容器内创建网络命名空间时出现错误,提示权限被拒绝。
command
ip netns add red
Run Code Online (Sandbox Code Playgroud)
error
mount --make-shared /run/netns failed: Permission denied
Run Code Online (Sandbox Code Playgroud)
我正在运行图像 ubuntu:20.10 并尝试向容器添加特定功能,但没有帮助。
docker run -it --rm --name=ubuntu --cap-add CAP_SYS_ADMIN --cap-add NET_ADMIN ubuntu:20.10
apt-get update && apt-get install -y net-tools && apt-get install -y iproute2
Run Code Online (Sandbox Code Playgroud)
即使添加所有功能后,问题仍然相同。
docker run -it --rm --name=ubuntu --cap-add ALL ubuntu:20.10
Run Code Online (Sandbox Code Playgroud) 我在docker 网络方面遇到了一个奇怪的问题。我在 Docker 容器中使用名为extenal_network的外部桥接网络,并启用了自动重启。如果任何容器由于某些错误(可能是代码或基础设施相关)而重新启动,我将无法访问我的主机网络。
请参阅随附的屏幕截图以获得更清晰的信息。
我已经尝试过以下链接,但没有运气。
Dockerfile
FROM node:10.20.1-alpine
RUN apk add --no-cache python make g++
WORKDIR /home/app
COPY package.json package-lock.json* ./
RUN npm install
COPY . .
Run Code Online (Sandbox Code Playgroud)
Docker-Compose
version: "3"
services:
app:
container_name: app
build:
context: ./
dockerfile: Dockerfile
image: 'network_poc:latest'
ports:
- 8080:8080
deploy:
resources:
limits:
memory: 2G
networks:
- extenal_network
restart: always
command: node index.js
networks:
shared_network:
external:
name: extenal_network
Run Code Online (Sandbox Code Playgroud)
docker 检查external_network
[
{
"Name": "extenal_network",
"Id": "96476c227ddc14aa23d376392d380b2674fcbad109c90e7436c0cddd5c0a9ac5", …Run Code Online (Sandbox Code Playgroud) networking google-chrome docker docker-compose docker-network