起因
我的開發環境需要一個python代碼運行環境、reids服務和mysql服務。
由於以前,我的開發環境是mac,而CI和線上運行環境是centos,偶爾會出項本地單元測試跑不過,而CI可以過。這多半都是環境不一致導致的。
所以搭建完全相同的線上環境是很必要的。
這里要准備3個鏡像:mysql:5.6、redis和pymicro(python 運行環境)。
1.使用host網絡模式啟動mysql容器和redis容器
docker run --net=host -p 3306:3306 -d --name mysql_5_6 -e MYSQL_ROOT_PASSWORD=toor333666 --restart=always mysql:5.7
docker run --net=host -p 6379:6379 -d --name redis --restart=always redis
注意:host網絡模式,端口映射必須宿主機和容器端口號相同。
2.使用host網絡模式啟動pymicro容器
docker run --net=host -d --name dev_env_1 -it -v /Users/zioyi/code:/usr/code/ /pymicro /bin/bash
-v參數用於把宿主機文件掛載到容器中,這樣才能在容器里跑單元測試。
正題
docker drivers
這樣就完成了,是不是很簡單,但是為什么容器【dev_env_1】能夠訪問容器【mysql】和【redis】?host網絡模式又是什么?
我們來研究一下docker的網絡配置(https://docs.docker.com/network/)
docker的多種網絡模式是通過修改宿主機的iptables規則來實現。
docker提供了六種網絡驅動來滿足不同場景下的網絡需求:
bridge:默認的網絡驅動。常用於獨立的容器群中內部通信,容器和宿主機的網絡是隔離的。
host:移除了宿主機和容器群間的網絡隔離。
overlay:提供多個docker守護進程管理的容器間的通信能力,包括swarm服務之間、swarm服務和獨立容器群之間以及獨立容器之間。
macvlan:允許你給容器分配一個MAC地址,讓它作為一個物理網路裝置。
none:無網絡狀態。
Network plugins:用戶可自己安裝第三方的docker網絡插件。
總結
使用docker就好比達積木,每個容器都是形狀各異的積木塊,網絡驅動是用來連接積木塊的。
docker提供諸多網絡驅動,使得其容器間的關聯變得更加靈活,我們也要根據它的官方文檔,學習不同網路驅動之間的特性以搭建出我們想要的docker城堡。