1. 程式人生 > >使用第三方工具連接docker數據庫

使用第三方工具連接docker數據庫

快速 image 默認 需要 文獻 src navi drive sco

一、背景

? 為了把測試環境遷移至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數據庫