2017-08-19 4 views
2

Endevouring, um mehr über Docker zu erfahren. Willst du meine Arbeit an einer ec2-Instanz machen? Dachte dieses Tutorial war ein guter Anfang: Docker Basics. Wenn ich versuche, das Docker-Image aus der Docker-Datei zu erstellen, erhalte ich Fehler beim Ausführen von apt-get update -y.Docker Ubuntu Build schlägt auf ec2 fehl

Zunächst dachte eine nicht unterstützte Ubuntu-Version (12.04) war ein Problem so aktualisiert, dass Verweis auf die neuesten (17.04) und noch Fehler in Bezug auf apt-update (unten).

Update: Ich habe die Schritte auf einem nicht-ec2-Maschine ausgeführt und bekam eine andere Ausgabe bei der apt-update-Stufe, also etwas in der ec2-Konfiguration, denke ich, die Netzwerkkonnektivität zu stören.

Jede Hilfe wird geschätzt. Konsolenausgabe unter:

ec2 docker build --no-cache -t moikaturns/amazon-ecs-sample . 
Sending build context to Docker daemon 363 kB 
Step 1/12 : FROM ubuntu:17.04 
---> bde41be8de8c 
Step 2/12 : RUN apt-get update -y 
---> Running in d8132cda2e2a 
Err:1 http://security.ubuntu.com/ubuntu zesty-security InRelease 
    Cannot initiate the connection to security.ubuntu.com:80 (2001:67c:1560:8001::14). - connect (101: Network is unreachable) [IP: 2001:67c:1560:8001::14 80] 
Err:2 http://archive.ubuntu.com/ubuntu zesty InRelease 
    Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8001::21). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8001::21 80] 
Err:3 http://archive.ubuntu.com/ubuntu zesty-updates InRelease 
    Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8001::21). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8001::21 80] 
Err:4 http://archive.ubuntu.com/ubuntu zesty-backports InRelease 
    Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8001::21). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8001::21 80] 
Reading package lists... 
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/zesty/InRelease Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8001::21). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8001::21 80] 
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/zesty-updates/InRelease Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8001::21). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8001::21 80] 
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/zesty-backports/InRelease Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8001::21). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8001::21 80] 
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/zesty-security/InRelease Cannot initiate the connection to security.ubuntu.com:80 (2001:67c:1560:8001::14). - connect (101: Network is unreachable) [IP: 2001:67c:1560:8001::14 80] 
W: Some index files failed to download. They have been ignored, or old ones used instead. 
---> 6aa041d69aec 
Removing intermediate container d8132cda2e2a 
Step 3/12 : RUN apt-get install -y git curl apache2 php5 libapache2-mod-php5 php5-mcrypt php5-mysql 
---> Running in 1b807c9fd593 
Reading package lists... 
Building dependency tree... 
Reading state information... 
E: Unable to locate package git 
E: Unable to locate package curl 
E: Unable to locate package apache2 
E: Unable to locate package php5 
E: Unable to locate package libapache2-mod-php5 
E: Unable to locate package php5-mcrypt 
E: Unable to locate package php5-mysql 
The command '/bin/sh -c apt-get install -y git curl apache2 php5 libapache2-mod-php5 php5-mcrypt php5-mysql' returned a non-zero code: 100 

Inhalt von /etc/resolve.conf erhalten, wenn das Dockerbuild Skript ausgeführt wird. Es wird vom System generiert und vom Host-Rechner bezogen (zu dem ich den Google-DNS hinzugefügt habe). Die Ausgabe aus dem Dockerfile Skript bestätigt die Inhalte im Rahmen des Skripts läuft:

Step 2/13 : RUN cat /etc/resolv.conf 
---> Running in 68b494d1fcdb 
; generated by /sbin/dhclient-script 
search eu-west-1.compute.internal 
nameserver 172.31.0.2 
nameserver 8.8.8.8 

Ausführen dieses auf der EC2-Instanz funktioniert, aber ich kann es im Innern des Dockerfile Skript nicht ausgeführt werden (weil die ubuntu nicht mit curl kommt installiert und ich kann nicht laufen apt-get irgendetwas installieren aufgrund der Netzausgabe):

ec2 curl ipinfo.io 
{ 
    "ip": "52.17.159.7", 
    "hostname": "ec2-52-17-159-7.eu-west-1.compute.amazonaws.com", 
    "city": "Dublin", 
    "region": "Leinster", 
    "country": "IE", 
    "loc": "53.3389,-6.2595", 
    "org": "AS16509 Amazon.com, Inc." 
} 
+0

Ich vermute, dass Ihre Sicherheitsgruppe nicht konfiguriert ist, damit diese ec2-Instanz mit dem Internet kommunizieren kann. Es kann auch ein Problem mit IPv6 sein. – BMitch

+0

Was ist die Ausgabe von 'cat/etc/resolv.conf' auf Ihrem ec2-Rechner? Funktioniert 'curl ipinfo.io' auch auf Ihrer ec2 Maschine? –

Antwort

0

entdeckt, wie es zum laufen zu bringen, indem ein anderes Netz Angabe für docker zu verwenden/binden (eine Alternative namens ‚Host‘ in im Gegensatz zu dem, was ich glaube, ist die Standardoption "Brücke"). Ich kann nicht erklären, warum einer gearbeitet hat und der andere nicht, weil mein Networking-Wissen nicht großartig ist.

Dieser Artikel veranlasste mich, es zu versuchen Docker container networking. Es beschreibt drei "Standard-Netzwerke", die von docker erstellt wurden. Wenn docker aufgerufen wird, kann ein bestimmtes Netzwerk ausgewählt werden. Ich nahm an, dass "keine" wörtlich bedeutet kein Netzwerk. Ich habe versucht "Brücke" und die gleichen Symptome präsentiert. Ich habe versucht, 'Host' und Internet-Konnektivität wurde erreicht (apt-get Update funktioniert), ergo, die meine Frage beantwortet.

Ausgabe des Befehls die Netze zur Liste zur Verfügung Andockfenster:

ec2 docker network ls 
NETWORK ID   NAME    DRIVER    SCOPE 
4d37091ae99e  bridge    bridge    local 
cab1b88f8084  host    host    local 
592bd8b26a6a  none    null    local 

ein Netzwerk angeben, wenn Docker Build ausgeführt wird (der --network Schalter ist der Schlüssel), die Ausgabe von apt-get update ist mein die Änderung Hinweise darauf funktioniert:

ec2 docker build --network host --no-cache -t moikaturns/amazon-ecs-sample . 
Sending build context to Docker daemon 363.5 kB 
Step 1/3 : FROM ubuntu:17.04 
---> bde41be8de8c 
Step 2/3 : RUN cat /etc/resolv.conf 
---> Running in 62447e6613d6 
; generated by /sbin/dhclient-script 
search eu-west-1.compute.internal 
nameserver 172.31.0.2 
---> 7456dd87e8eb 
Removing intermediate container 62447e6613d6 
Step 3/3 : RUN apt-get update -y 
---> Running in 19c5ba6e2a21 
Get:1 http://security.ubuntu.com/ubuntu zesty-security InRelease [89.2 kB] 
Get:2 http://archive.ubuntu.com/ubuntu zesty InRelease [243 kB] 
Get:3 http://archive.ubuntu.com/ubuntu zesty-updates InRelease [89.2 kB] 
... 
Get:21 http://archive.ubuntu.com/ubuntu zesty-backports/main amd64 Packages [1438 B] 
Fetched 24.2 MB in 3s (7702 kB/s) 
Reading package lists... 
---> bcf0a72ac69e 
Removing intermediate container 19c5ba6e2a21 
Successfully built bcf0a72ac69e 

fanden auch diese nützlichen von Amazon Web Services (AWS) EC2 example:

docker run -it ubuntu bash 

Weist Andockfenster an, eine interaktive Bash-Shell zu starten. Netzwerkschwierigkeiten können interaktiv beobachtet werden, anstatt das Dockerfile-Skript auszuführen. Das Frustrierende ist, dass es ein minimales Ubuntu ist und grundlegende Tools wie Ping nicht installiert sind. Da apt-get install nicht funktioniert, ist es möglich, sie zu installieren, um viele Nachforschungen anzustellen.

das Netzwerk angeben, die mit Docker Lauf arbeitet ermöglicht Netzwerkfunktionalität:

docker run --network=host -it ubuntu bash 

Dank allen, die auf meine Frage geantwortet.

RCA: Nachdem ich dies mit aws verfolgt hatte, half mir ein Vertreter bei der Diagnose, was falsch war (das Tutorial funktioniert gut auf einer Vanille ec2-Instanz). Ursache wurde auf eine iptables-Regel zurückverfolgt ich meine EC2-Instanz hinzugefügt hatte:

sudo /sbin/iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 

Es leitet eingehende Port 80 zu intern Port 8080. Natürlich ist es verärgert iptables Einträge von Docker (irgendwie) geschaffen hatte. Wenn ich diese Regel entferne, funktioniert das vanillary-Tutorial auf meiner ec2-Instanz (die iptables-Regel hatte nur Port 80 zu 8080 zu routen, was ich mit einem Proxy wie nginx tun kann).

Verwandte Themen