使用第三方工具連接docker數據庫
一、背景
? 為了把測試環境遷移至docker上,我在centos7上安裝了docker,具體安裝方法可參考《CentOS7下安裝docker》本文不再論述。有些同學可能會有疑問,為什麽要那樣子做?我給大家看看目前我的docker環境究竟是怎麽樣的?
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9e1ae7ac8ead postgres:10.6 "docker-entrypoint.sa€|" 7 seconds ago Up 4 seconds 192.168.56.8:5433->5432/tcp chenzx-postgres10.6 927842f243da postgres:9.6.11 "docker-entrypoint.sa€|" 16 seconds ago Up 14 seconds 192.168.56.8:5432->5432/tcp chenzx-postgres9.6 dcc880f0a503 mysql:5.7.25 "docker-entrypoint.sa€|" 30 minutes ago Up 30 minutes 33060/tcp, 192.168.56.8:3307->3306/tcp chenzx-mysql5.7 56c8605d7d22 mysql:5.6.43 "docker-entrypoint.sa€|" About an hour ago Up About an hour 192.168.56.8:3306->3306/tcp chenzx-mysql5.6
? 遷移後,可以在容器中非常快速地建立不同版本的數據庫容器,可以做相關的測試。如果測試環境中把數據庫弄崩了,咋辦?很簡單把容易刪除重建就好,而且時間就是那麽幾秒鐘的事情。不再像以往可能要花半天一天去弄。當然啦,這種玩法只適合在個人的測試環境中,生產環境暫時不建議使用這些方式,風險太大了。
二、Docker網絡知識科普
# docker network ls NETWORK ID NAME DRIVER SCOPE 90270239cfd6 bridge bridge local f97e248a7301 host host local 8833271a493a none null local
? 使用docker命令查看docker的網絡模式,這裏可以看到有三種,但實際上是有4種模式,最後一種應該是我還無配置所以無法顯示出來。下面我們開始介紹這四種模式:
bridge模式:使用–net=bridge指定,默認設置。
host模式:使用–net=host指定。
container模式:使用–net=container:NAME_or_ID指定。
none模式:使用–net=none指定。
1. bridge模式
? Docker 容器默認使用 bridge 模式的網絡。其特點如下:
- 使用一個 linux bridge,默認為 docker0
- 使用 veth 對,一頭在容器的網絡 namespace 中,一頭在 docker0 上
- 該模式下Docker Container不具有一個公有IP,因為宿主機的IP地址與veth pair的 IP地址不在同一個網段內
- Docker采用 NAT 方式,將容器內部的服務監聽的端口與宿主機的某一個端口port 進行“綁定”,使得宿主機以外的世界可以主動將網絡報文發送至容器內部
- 外界訪問容器內的服務時,需要訪問宿主機的 IP 以及宿主機的端口 port
- NAT 模式由於是在三層網絡上的實現手段,故肯定會影響網絡的傳輸效率。
- 容器擁有獨立、隔離的網絡棧;讓容器和宿主機以外的世界通過NAT建立通信
2. host模式
? Host 模式並沒有為容器創建一個隔離的網絡環境。而之所以稱之為host模式,是因為該模式下的 Docker 容器會和 host 宿主機共享同一個網絡 namespace,故 Docker Container可以和宿主機一樣,使用宿主機的eth0,實現和外界的通信。換言之,Docker Container的 IP 地址即為宿主機 eth0 的 IP 地址。其特點包括:
- 這種模式下的容器沒有隔離的 network namespace
- 容器的 IP 地址同 Docker host 的 IP 地址
- 需要註意容器中服務的端口號不能與 Docker host 上已經使用的端口號相沖突
- host 模式能夠和其它模式共存
3. container模式
Container 網絡模式是 Docker 中一種較為特別的網絡的模式。處於這個模式下的 Docker 容器會共享其他容器的網絡環境,因此,至少這兩個容器之間不存在網絡隔離,而這兩個容器又與宿主機以及除此之外其他的容器存在網絡隔離。
4. none模式
網絡模式為 none,即不為 Docker 容器構造任何網絡環境。一旦Docker
容器采用了none 網絡模式,那麽容器內部就只能使用loopback網絡設備,不會再有其他的網絡資源。Docker
Container的none網絡模式意味著不給該容器創建任何網絡環境,容器只能使用127.0.0.1的本機網絡。
三、創建帶IP地址、端口映射的容器
? 了解完docker網絡模式,我們根據image的幫助文檔結合網絡映射等配置,以MySQL為例,得出以下的命令:
docker run --name <ContrinerName> -p IPAddr:HostPort:ContainerPort -d MYSQL_ROOT_PASSWORD=<MYSQL_ROOT_PASSWORD> -d mysql:<TargetVersion>
執行:
docker run --name chenzx-mysql5.6 -p 192.168.56.8:3306:3306 --network=bridge -e MYSQL_ROOT_PASSWORD=****** -d mysql:5.6.43
執行後就會創建出上文展示的容器chenzx-mysql5.6。MySQL的遠程連接端口為3306,故需把這端口映射。PostgreSQL需映射5432端口,Oracle需映射1521端口。
? 創建容器就行了,為何需要做網絡映射?為了是可以讓第三方工具進行連接,如Navicat等。
最終效果:
四、參考文獻
《docker 之網絡配置》
使用第三方工具連接docker數據庫