English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Abbiamo implementato l'accesso ai servizi eseguiti all'interno del container Docker tramite il porto di rete.
All'interno del container possono essere eseguiti alcuni applicativi di rete. Per consentire l'accesso esterno a questi applicativi, è possibile specificare la mappatura dei porti tramite i parametri -P o -p.
Ora implementiamo il collegamento a un container Docker tramite il porto.
Abbiamo creato un container per un'applicazione python.
w3codebox@w3codebox:~$ docker run -d -P training/webapp python app.py fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d
另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
Usiamo -P I parametri creano un container, utilizzando docker ps Si può vedere che il porto del container 5000 è mappato al porto dell'host 32768.
w3codebox@w3codebox:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
我们也可以使用 -p 标识来指定容器端口绑定到主机端口。
两种方式的区别是:
-P :是容器内部端口随机映射到主机的高端口。
-p : 是容器内部端口绑定到指定的主机端口。
w3codebox@w3codebox:~$ docker run -d -p 5000:5000 training/webapp python app.py 33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0
w3codebox@w3codebox:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES 33e4523d30aa training/webapp "python app.py" ... 0.0.0.0:5000->5000/tcp berserk_bartik fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp grave_hopper
另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
w3codebox@w3codebox:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py 95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c w3codebox@w3codebox:~$ docker ps CONTAINER ID IMAGE COMMAND ... PORTS NAMES 95c6ceef88ca training/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5001->5000/tcp adoring_stonebraker 33e4523d30aa training/webapp "python app.py" ... 0.0.0.0:5000->5000/tcp berserk_bartik fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp graves_hopper
In questo modo possiamo accedere al porto 5000 del container tramite l'accesso a 127.0.0.1:5001.
Nell'esempio sopra, ilbinding predefinito è il porto tcp, se si desidera bindare il porto udp, si può aggiungere /udp。
w3codebox@w3codebox:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py 6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a w3codebox@w3codebox:~$ docker ps ID DEL CONTAINER IMMAGINE COMANDO ... PORTI NOMI 6779686f06f6 training/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5000->5000/udp drunk_visvesvaraya 95c6ceef88ca training/webapp "python app.py" ... 5000/tcp, 127.0.0.1:5001->5000/tcp adoring_stonebraker 33e4523d30aa training/webapp "python app.py" ... 0.0.0.0:5000->5000/tcp berserk_bartik fce072cc88ce training/webapp "python app.py" ... 0.0.0.0:32768->5000/tcp graves_hopper
docker port Il comando ci permette di visualizzare rapidamente la situazione di binding dei porti.
w3codebox@w3codebox:~$ docker port adorable_stonebraker 5000 127.0.0.1:5001
La mappatura dei porti non è l'unico metodo per connettere Docker a un altro container.
Docker ha un sistema di connessione che permette di connettere insieme più container, condividendo le informazioni di connessione.
La connessione Docker crea una relazione padre-figlio, nella quale il container padre può vedere le informazioni del container figlio.
Quando creiamo un container, Docker lo nomina automaticamente. Inoltre, possiamo utilizzare --name L'identificatore per dare un nome al container, ad esempio:
w3codebox@w3codebox:~$ docker run -d -P --name w3codebox training/webapp python app.py 43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441
Possiamo utilizzare docker ps Il comando viene utilizzato per visualizzare i nomi dei container.
w3codebox@w3codebox:~$ docker ps -l CONTAINER ID IMAGE COMMAND ... PORTS NAMES 43780a6eabaa training/webapp "python app.py" ... 0.0.0.0:32769->5000/tcp w3codebox
Di seguito viene creata una nuova rete Docker.
$ docker network create -d bridge test-net
Spiegazione dei parametri:}
-d: il parametro specifica il tipo di rete Docker, ci sono bridge e overlay.
Il tipo di rete overlay viene utilizzato per il Swarm mode, puoi ignorarlo in questa sezione.
Esegui un container e connettitelo alla rete test-net di nuova creazione:
$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
Apri un nuovo terminale e esegui un altro container aggiungendolo alla rete test-net:
$ docker run -itd --name test2 --network test-net ubuntu /bin/bash
Clicca sull'immagine per vedere la versione completa:
Di seguito, utilizziamo ping per dimostrare che i container test1 e test2 hanno stabilito una connessione di rete.
Se nel container test1 e test2 non c'è il comando ping, esegui i seguenti comandi per installare ping (immediato: puoi installare in un container, eseguire il commit del container come immagine e poi eseguire i due container con la nuova immagine).
apt-get update apt install iputils-ping
Nel container test1, inserisci il seguente comando:
Clicca sull'immagine per vedere la versione completa:
Analogamente, il container test2 si connetterà con successo a:
Clicca sull'immagine per vedere la versione completa:
In questo modo, i container test1 e test2 stabiliscono una connessione di rete.
Se hai più container che devono comunicare tra loro, si consiglia di utilizzare Docker Compose, che verrà introdotto in seguito.
Possiamo aggiungere il seguente contenuto al file /etc/docker/daemon.json dell'host per impostare il DNS per tutti i container:
{ "dns" : [ "114.114.114.114", "8.8.8.8" ] }
Dopo la configurazione, il DNS del container verrà automaticamente configurato come 114.114.114.114 e 8.8.8.8.
Dopo la configurazione, è necessario riavviare Docker per che venga applicata.
Per verificare che il DNS del container sia effettivo, è possibile utilizzare il seguente comando, che visualizzerà le informazioni di DNS del container:
$ docker run -it --rm ubuntu cat etc/resolv.conf
Clicca sull'immagine per vedere la versione completa:
Impostazione manuale della configurazione del container
Se si desidera impostare il DNS solo per il container specificato, è possibile utilizzare il seguente comando:
$ docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
Spiegazione dei parametri:}
--rm:Pulisci automaticamente il file system interno del container quando il container esce.
-h NOME_HOSTNAME o --hostname=NOME_HOSTNAME:Imposta il nome host del container, che verrà scritto nel /etc/hostname e /etc/hosts del container.
--dns=INDIRIZZO_IP:Aggiungi il server DNS al /etc/resolv.conf del container, in modo che il container utilizzi questo server per risolvere tutti i nomi di host che non si trovano nel /etc/hosts.
--dns-search=DOMINIO:Imposta il dominio di ricerca del container, quando il dominio di ricerca è impostato su .example.com, durante la ricerca di un host chiamato host, il DNS non solo cercherà host, ma anche host.example.com.
Clicca sull'immagine per vedere la versione completa:
Se non viene specificato durante l'avvio del container --dns e --dns-search,Docker utilizzerà di default /etc/resolv.conf del host principale per configurare il DNS del container.