云虚拟机上的Docker构建失败

11

我在Azure VM内运行一个Ubuntu 16.04(Xenial),已按照说明安装了Docker,看起来一切正常。当我触发docker run时,需要做的一件事情是传递--net=host,这允许我在容器内运行apt-get update和其他需要互联网的命令。

然而问题出现在我尝试基于现有的Ubuntu镜像触发docker build时。它会失败:

enter image description here

问题在于没有办法将--net=host传递给构建命令。我看到Docker GitHub上有相关问题(#20987#10324),但没有明确的解决方案。

Stack Overflow上有一个现有的答案,涵盖了我想要的场景,但在云VM内运行不起作用。

对此有任何想法吗?

更新1:

这是docker version输出:

Client:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 22:11:10 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 22:11:10 2016
 OS/Arch:      linux/amd64

更新2:

这里是docker network ls的输出结果:

NETWORK ID          NAME                DRIVER              SCOPE
aa69fa066700        bridge              bridge              local               
1bd082a62ab3        host                host                local               
629eacc3b77e        none                null                local   

1
apt-get 应该仍然可以使用默认的桥接网络,除非您的网络需要使用代理服务器或有防火墙规则阻止 NATed 流量。如果您尝试在使用桥接网络的容器中运行 ping 或 curl,会发生什么? - Greg Bray
pingcurl都可以直接在虚拟机上运行。但是docker build仍然失败。 - Den
2
这里有一个技巧,就像之前所述 - 当我执行 docker run 时,我可以传递 --net=host,然后 pingapt-getcurl 就会工作。没有办法将 --net=host 传递给 docker build,否则将会失败。 - Den
我的意思是默认情况下使用桥接网络应该仍然可以工作。找出为什么它们不起作用可能会帮助您找到解决问题的方法。 - Greg Bray
有什么方法可以诊断这个问题吗? - Den
显示剩余3条评论
2个回答

2
另一种方法是尝试让docker-machine为您提供虚拟机,看看是否有效。 Azure有一个提供程序,因此您应该能够在本地Docker客户端(Windows或Linux)上设置订阅ID,并按照说明获取使用Docker的新VM,它还会设置您的本地环境变量以远程与Docker VM实例通信。设置完成后,在本地运行docker psdocker run将像在VM上运行命令一样运行。例如:
#Name at end should be all lower case or it will fail.
docker-machine create --driver azure --azure-subscription-id <omitted> --azure-image canonical:ubuntuserver:16.04.0-LTS:16.04.201608150 --azure-size Standard_A0 azureubuntu
#Partial output, see docker-machine resource group in Azure portal
Running pre-create checks...
(azureubuntu) Completed machine pre-create checks.
Creating machine...
(azureubuntu) Querying existing resource group.  name="docker-machine"
(azureubuntu) Resource group "docker-machine" already exists.
(azureubuntu) Configuring availability set.  name="docker-machine"
(azureubuntu) Configuring network security group.  location="westus" name="azureubuntu-firewall"
(azureubuntu) Querying if virtual network already exists.  name="docker-machine-vnet" location="westus"
(azureubuntu) Configuring subnet.  vnet="docker-machine-vnet" cidr="192.168.0.0/16" name="docker-machine"
(azureubuntu) Creating public IP address.  name="azureubuntu-ip" static=false
(azureubuntu) Creating network interface.  name="azureubuntu-nic"
(azureubuntu) Creating virtual machine.  osImage="canonical:ubuntuserver:16.04.0-LTS:16.04.201608150" name="azureubuntu" location="westus" size="Standard_A0" username="docker-user"
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with ubuntu(systemd)...
Installing Docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env azureubuntu

#Set environment using PowerShell (or login to the new VM) and see containers on remote host
docker-machine env azureubuntu | Invoke-Expression
docker info
docker network inspect bridge

#Build a local docker project using the remote VM
docker build MyProject
docker images

#To clean up the Azure resources for a machine (you can create multiple, also check docker-machine resource group in Azure portal)
docker-machine rm azureubuntu

据我所知,它运行得很好。我能够在 Azure VM 上构建一个使用 apt-get 的 debian:wheezy DockerFile,没有任何问题。这应该允许容器在默认的桥接网络上运行,而不是主机网络。

我会尝试这样做,看看会输出什么结果。我根据虚拟机配置配置了DNS设置,所以不确定是什么原因导致失败。 - Den

0

1
就像那个问题的原始发布者一样,所有这些项目都已经被解决了,但不幸的是没有任何效果。--net=host在我执行docker run时有效,所以这很棒,对我有用。但是在执行docker build时会失败。 - Den
2
你所看到的问题表明你的桥接网络无法连接到外部世界,这可能会在未来引起其他问题。如果你不打算在docker中使用桥接网络,可以尝试使用docker network rm命令删除它,但是网络隔离是人们通常使用docker容器的重要原因。因此,--net=host参数可能不适用于所有docker命令。 - Greg Bray
为了诊断目的,更新了主贴并附上了 docker network ls 的输出结果。 - Den
是的...那都是很基本的。问题可能出在sysctl或VM的DNS设置中。我会尝试使用docker-machine启动一个Azure VM,看看它是否能在那里正常工作。 - Greg Bray
愚蠢的问题,但您能否从此虚拟机使用所需协议访问互联网上的任何内容?我的经验是Azure防火墙并不总是像人们所想象的那样工作。 - aholbreich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接