我正在尝试从主机运行一个四节点群集,我的计算机是管理器,并将三个Hyper-V VM作为工作程序节点。我试图在所有节点hnsCall failed in Win32: An adapter was not found上将静态网页作为服务运行,但是始终在主机和No such image虚拟机上接收错误(尝试从私有注册表中提取服务映像)。在部署堆栈或使用时会发生这种情况service create。但是,我可以通过容器实例运行静态页面,并且可以正常工作。
我按照本指南设置和创建了我的VM,我怀疑这是我的问题所在。我通过HyperV虚拟交换机管理器创建的虚拟交换机(名为thevswitch)既在外部,又在正确的适配器上设置。我初始化用我的主机的IPv4下一个群thevswitch为--advertise-addr标志,并成功加入了虚拟机的工作节点到这个IP,同时使用驱动程序。无论如何,Docker似乎都看不到我创建的虚拟交换机。
PS C:\Docker\swarm-test> docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.24)
Go version: go1.10.6
Git commit: 6247962
Built: Sun …Run Code Online (Sandbox Code Playgroud) docker docker-swarm docker-machine docker-networking docker-for-windows
我需要创建一些必须由同一网络上的其他计算机访问的docker容器.
问题是,当我创建容器时,Docker只能在主机内获得有效的IP地址.
我已经看过Docker文档(网络)但没有任何工作.
如果我ifconfig在我的机器上运行我的IP地址是172.21.46.149.当我进入容器(Ubuntu)并运行ifconfigIP地址时172.17.0.2.例如,我需要Docker来获取172.21.46.150.
我该怎么做?
我用swarm中的一个网站创建了docker swarm,在外面发布端口8080.我想使用在端口80上运行外部群集的Nginx来使用该端口,这将执行服务器名称解析和主机静态文件.
问题是,swarm使用iptables自动将端口8080发布到Internet,我不知道是否可以只允许本地nginx实例使用它?因为当前用户可以访问80和8080端口上的站点,而第二个端口被破坏(没有图像).
尝试玩ufw,但它不起作用.手动更改iptables也是一场噩梦,因为我必须在每次更新后在每个swarm节点上执行此操作.有解决方案吗
编辑:我不能使用相同的网络swarm和nginx swarm,因为覆盖网络与普通的单主机容器不兼容.从理论上讲,我可以将nginx放到swarm中,但我更喜欢将它保持在包含静态文件的同一主机上.
我在单独的撰写文件中创建了两个容器(为应用程序隔离而完成——每个应用程序可能在撰写文件中定义了多个容器,例如后备数据库)。
这些容器通过名为“common”的外部网络链接。
一个示例撰写文件是:
version: '2'
services:
rabbitmq:
image: "rabbitmq:3-management"
hostname: "rabbitmq"
container_name: "rabbitmq"
environment:
RABBITMQ_ERLANG_COOKIE: "SWQOKODSQALRPCLNMEQG"
RABBITMQ_DEFAULT_USER: "rabbitmq"
RABBITMQ_DEFAULT_PASS: "rabbitmq"
RABBITMQ_DEFAULT_VHOST: "/"
ports:
- "15672:15672"
- "5672:5672"
networks:
default:
external:
name: common
Run Code Online (Sandbox Code Playgroud)
Docker 版本:
root@server:~/# docker version
Client:
Version: 1.12.1
API version: 1.24
Go version: go1.6.3
Git commit: 23cf638
Built: Mon, 10 Oct 2016 21:38:17 +1300
OS/Arch: linux/amd64
Server:
Version: 1.12.1
API version: 1.24
Go version: go1.6.3
Git commit: 23cf638
Built: Mon, 10 Oct 2016 21:38:17 +1300
OS/Arch: linux/amd64
root@server:~/# …Run Code Online (Sandbox Code Playgroud) 我有一组在Windows 10中使用Docker运行的容器,这是输出docker-compose ps:
> docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------------------------------
db_mysql docker-entrypoint.sh mysqld Up 3306/tcp
elk /usr/bin/supervisord -n -c ... Up 0.0.0.0:81->80/tcp
php71-fpm-nginx /config/bootstrap.sh Up 443/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:9001->9001/tcp
Run Code Online (Sandbox Code Playgroud)
这是输出docker inspect:
> docker inspect php71-fpm-nginx
[
{
...
"NetworkMode": "anotherlampdocker_default",
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"9001/tcp": [
{
"HostIp": "",
"HostPort": "9001"
}
]
},
...
"Mounts": [
{
"Source": "/d/Development/www",
"Destination": "/data/www",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
}, …Run Code Online (Sandbox Code Playgroud) 我是 docker 容器的新手,我遇到了以下问题。我正在开发一个向公开的 api 发出请求的网页。它们都发布在通过网络链接的不同容器上。这是我的 docker-compose.yml 文件:
version: '2'
services:
api:
image: my/api
networks:
- api
ports:
- "8080:5000"
container_name: api
web:
build:
context: ./DockerWeb
networks:
- api
ports:
- "80:5000"
container_name: web
networks:
api:
driver: bridge
Run Code Online (Sandbox Code Playgroud)
我注意到,如果我附加到运行我的网页的容器,我可以使用 ping api 容器而不会出现任何问题 ping api
尝试对 api 容器进行任何 Web 服务调用时会出现问题。我正在尝试初始化一个 HttpClient 对象,但是必须将此类对象的 BaseAddress 属性设置为有效的 Uri。
_client = new HttpClient();
_client.BaseAddress = new Uri(config.ApiUrl); //config.ApiUrl = "api"
Run Code Online (Sandbox Code Playgroud)
这会引发以下错误
UriFormatException:无效的 URI:无法确定 URI 的格式。
有没有办法 a) 以不同的方式公开容器名称,或者 b) 在不需要使用 URI 的情况下调用 Web 服务?我怎样才能做到这一点?
更新
我已更新 …
我是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-compose yml,其中有几个服务位于用户定义的网络中(在桥接模式下)。我想在默认 docker 网桥上连接我的服务,以便向外界公开一个端口。
总而言之,有一个我想要做的具体例子:
services:
service1:
networks:
- my_network
service2:
networks:
- my_network
- bridge
ports:
8080:8080
Run Code Online (Sandbox Code Playgroud)
如此处所述,我尝试了以下操作,但导致此错误:ERROR: for app network-scoped alias is supported only for containers in user defined networks。
networks:
my_network:
driver: bridge
bridge:
external: true
Run Code Online (Sandbox Code Playgroud)
我还尝试了如何使用 docker-compose v2 加入默认网桥网络中提出的解决方案?,但您不能在 docker compose 中混合使用关键字network_mode: bridge和关键字networks。
我也尝试在docker-compose.yml中去掉对默认网桥网络的引用,并在启动服务后将我的service2容器添加到默认网桥中,例如:
docker-compose up
docker network connect bridge service2
Run Code Online (Sandbox Code Playgroud)
这种方法有效,我可以从外部访问我在service2上暴露的端口,我最终得到:
docker inspect service2
"Networks": {
"bridge": {
...
}, …Run Code Online (Sandbox Code Playgroud) 我需要为我的 docker 容器启用 IPv4/IPv6 双栈支持。我的 docker compose 文件是版本 3。默认情况下启用 IPv4,但如何为我的 docker 容器/网络启用 IPv6?
我已经尝试通过更新 daemon.json 来更新 docker 守护进程,我知道更新正在被识别,因为如果文件中有错误,Docker 将不会启动。进行更改后,我重新启动了 Docker(不仅仅是我的容器),但我的容器仍然没有 IPv6 地址。
我发现enable_ipv6: truedocker compose 文件对版本 3 或更高版本无效,我不想按文件版本降级。
我更新的 daemon.json:
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}
Run Code Online (Sandbox Code Playgroud)
当我检查我的容器时,在对 daemon.json 进行更改后,使用 docker inspect {id} 我看到以下内容:
"NetworkSettings": {
"Bridge": "",
"SandboxID": "df737362d15722fc1b0501ac256ba371417fe513dede807f2a17bd0524630a31",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"9000/tcp": null
},
"SandboxKey": "/var/run/docker/netns/df737362d157",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0, …Run Code Online (Sandbox Code Playgroud)