關於端口映射:
在啟動容器時,如果不配置宿主機器與虛擬機的端口映射,外部程序是無法訪問虛擬機的,因為沒有端口。用個數據流便於理解:
假設我們要訪問mysql,那么數據流的流向是這樣的
數據流:外部數據——>主機:3306——>docker:3306
當然端口可以任意關系映射,docker的端口是mysql對外開放的端口即可
虛擬機掛起重開無法遠程訪問mysql
關於這個問題,我們可以回到數據流的模型,這時我們發現一個問題,這里就涉及到一個數據包轉發的知識。
出於安全考慮,Linux系統默認是禁止數據包轉發的。所謂轉發即當主機擁有多於一塊的網卡時,其中一塊收到數據包,根據數據包的目的ip地址將數據包發往本機另一塊網卡,該網卡根據路由表繼續發送數據包。這通常是路由器所要實現的功能。
這里有一個問題,就是既然禁止數據包轉發,那么每次容器重新啟動為什么就能正確連上?這是因為在啟動的時候觸發了臨時生效此種的配置方式,而在系統重啟,或對系統的網絡服務進行重啟后都會失效。
虛擬機的掛起,相當於物理機中的休眠,會將內存中的數據全部存放到對應的休眠文件中,占用的空間為內存大小,並且會對虛擬機執行關機操作。休眠后的虛擬機不占任何CPU、內存。掛起激活讀取了內存文件,但系統是相當於重啟了,所以臨時生效的配置方式就因此失效。
想要完全解決這個問題,可以修改 /etc/sysconfig/network配置文件,添加FORWARD_IPV4=YES,然后service netwrok restart重啟激活
當然這個問題實際上也不是什么大問題,重啟下docker就可以解決了,但這后面設計到的知識確實不少,值得需要記錄下