1. 程式人生 > >docker之容器訪問和網絡連接(三)

docker之容器訪問和網絡連接(三)

-name 應用容器 network http containe 地址 ins ODB names

前言

當一臺服務器上部署了多個應用容器,它們直接可能需要相互通信,比如web應用容器需要訪問mysql數據庫容器。

主機訪問容器

通過映射端口的形式我們可以在外部訪問容器內的服務

# 將主機的127.0.0.1:5001映射到容器的5000端口
docker run -p 127.0.0.1:5001:5000 training/webapp python app.py
# 將主機的80映射到容器的80端口
docker run -p 80:80 training/webapp python app.py
# 容器內部端口隨機映射到主機的高端口,通過ps查看
docker run -P training/webapp python app.py
  • 修改端口映射

如果我們創建一個容器後想要修改創建的配置怎麽辦呢?比如修改mongodb的端口映射:

docker stop mongodb # 停止容器
systemctl stop docker # 停止docker

vi /var/lib/docker/containers/容器id/hostconfig.json # 所有的配置在hostconfig.json文件中
找到端口映射進行修改

systemctl start docker # 重啟docker
docker start mongodb # 重啟容器

進入容器訪問

# 進入容器打開一個交互終端
docker exec -i -t (容器的ID/names) /bin/bash

容器之間相互訪問

容器內部ip訪問

docker安裝後,會自動創建一個默認的bridge網絡docker0。對應的地址為172.17.0.X,容器之間可以通過這個內部ip進行相互訪問,但是如果想要連接另一個容器就必須先知道對方的ip地址,這一點有點麻煩。

ifconfig
# 查看內部ip,如果沒有ifconfig命令,先安裝
apt update
apt install net-tools

link連接

  • docker提供了一個link參數供多個容器之間相互聯系。
# 使用nginx鏡像創建一個容器,名為test1,連接到test2容器,指定test2容器的別名為web
docker run --name test1 --link test2:web nginx

# 登錄test1
env | grep web # 查看web的情況,發現存在相關信息
cat /etc/hosts # 可以看到web別名對應的ip,但是這個ip是靜態的,也就是不支持test2容器重啟,因為重啟可能造成ip發生變化
# 登錄test2發現沒有test1的信息,說明test2不能通過別名訪問test1

創建自己的內部網絡

由於使用默認的內部網絡link是靜態ip,不支持重啟,可以創建自己的內部網絡指定別名。

# 創建一個網絡,可以通過ifconfig查看
docker network create tms
# 容器啟動指定網絡
docker run --network tms --network-alias test1 nginx
# network指定網絡,network-alias指定容器的別名

# 斷開容器的網絡連接
docker network disconnet tms 容器ID/name
# 刪除網絡
docker network rm tms

# 測試
ping test1 # 可以直接使用別名代替ip

如果要刪除網絡必須所有的docker容器全部斷開網絡。

參考

  • http://www.docker.org.cn/book/docker/what-is-docker-16.html

docker之容器訪問和網絡連接(三)