天天看點

linux docker windows,關于從Docker在Linux和Windows下的差別簡單了解Docker的層次結構?...

一:從運作一個簡單的 Python Web 程式說起

啟動Docker用戶端并登陸。在用戶端中輸入以下内容:

$ sudo docker run -d -P training/webapp python app.py

第一次輸入上面指令時,Docker會先從雲端鏡像庫中下載下傳training/webapp鏡像。

1.運作截圖

下面我們來詳細看看這條指令的具體内容,這一部分我們可以在官方文檔中找到詳細的英文解釋,這裡筆者将其翻譯過來并加了些自己的了解。

前面我們已經說過,Docker虛拟機系統實際也是基于Linux核心,是以這條語句實際上就是Linux的指令,我們可以輸入以下内容檢視docker指令的詳解:

$ sudo docker

2.docker指令的子指令清單

再回到第一條中,我們使用的子指令是run。

在子指令清單中我們看到run子指令解釋是:run Run a command in a new container,也就是在一個新的容器中運作一條指令。

我們的run指令後面跟的可選項有-d和-P。

查閱官方文檔我們可以知道,-d表示Docker會把目前指令的容器放到背景執行并監控起來。-P則表示讓Docker映射任何容器内部需要的端口到虛拟機上。這裡需要對Docker一些概念有所了解,我們這裡暫且簡單地了解為Docker虛拟機下的每個Docker容器都是一台子虛拟機,每個子虛拟機都有一塊虛拟網卡,當外部要通路容器時都必須通過Docker虛拟機,而-P就做了相關的端口映射。

指令執行後傳回的一長串字元串(也就是fc4028b21d84f5c075821ca2425d74d45dea87cd28c4eb92620ae39ddec22f46)則是Docker的容器ID,這是一個唯一的值,我們可以以它為辨別對容器做相應的操作。

當我們需要檢視和管理目前背景運作的所有容器時,我們可以輸入以下指令。

$ sudo docker ps

圖3.容器詳細資訊

這裡我們可以看到容器的詳細資訊,包括容器ID(精簡的ID),鏡像,指令,建立時間,狀态,端口,以及容器名字。

接下來的training/webapp就是我們運作的容器的源了,Docker中稱之為鏡像,這個鏡像是Docker官方之前就建立好的,裡面包含了一個簡單Python Flask web應用。

最後,我們在容器中執行了python app.py,python app.py啟動了我們的web應用。

二:通路頁面——從 Linux 和 Windows 的差別到對 Docker 層次的簡單了解

從上面我們檢視運作容器的詳細資訊時我們看到了,在PORTS這一欄中,有這樣的資訊:

0.0.0.0:49153->5000/tcp

上文中提到Docker虛拟機對容器做了端口映射,這裡我們可以更直覺的看到了,Docker虛拟機中的49153端口映射到了容器的5000端口(這裡我們運作的是web程式,是以是tcp協定,其他容器有需要可以指定成udp協定)。

在官方文檔中,這時我們通路localhost:49153,應該就能出現Hello world了,但是筆者在這個步驟根本通路不到這個頁面。

圖4.此時通路,浏覽器一直處于等待狀态

是以這裡我們需要重新看看這個虛拟網絡的結構,要看整個網絡的結構,我們應該先了解Docker的層次結構。在Linux中,Docker的邏輯結構是這樣的:

硬體

而我們在前文中提過,在Windows中要運作Docker,實際上是在虛拟機下運作的,是以在Windows中Docker的邏輯結構應該是:

硬體

是以官方文檔中用例應該是基于Linux下的,Linux此時通路localhost:49153是沒有問題的,因為Docker Kernel此時把49153端口映射給了容器的5000端口,而Windows則不行,因為我們隻是把Docker虛拟機的49153端口映射給了容器,我們在浏覽器中輸入localhost:49153明顯是通路的Windows層級别。

了解到這裡問題就已經解決了,我們隻需進入VirtualBox中,将Docker虛拟機的網絡做個橋接,或者端口映射就行了。

進入VirtualBox主界面,選中Docker虛拟機(boot2docker-vm),單擊設定按鈕,在設定中選擇網絡,這裡我們發現Docker虛拟機預設選擇了“網絡位址轉換(NAT)”。

圖5.Docker虛拟機的網絡連接配接方式預設是NAT

而且端口轉發中還預設有兩個端口映射。

圖6.Docker虛拟機和主控端預設的端口映射

不難猜測這裡可能是Docker用戶端和Docker虛拟機進行通信的端口,是以我們不能将Docker虛拟機的網絡連接配接方式改成橋接了,否則Docker用戶端無法和Docker虛拟機進行通信。

是以我們這裡選擇添加一個端口映射,将Windows系統的80端口映射到Docker虛拟機的的49153端口上去。端口映射的名稱随便取,協定一定要是TCP(HTTP基于TCP)

圖7.添加映射端口

此時我們可以在Windows下的浏覽器直接通路localhost了(一般來說浏覽器預設通路80端口,80端口可以省略),因為我們直接映射了80端口到Docker虛拟機的49153端口上,而Docker虛拟機的49153端口又映射到了我們剛剛建立的Docker容器的5000端口上,我們的web程式正是運作在該容器的5000端口上。

8.Hello world!

總結:

本文實際上隻運作了一個簡單的web程式,用例也是基于官方文檔,而且如果讀者是在Linux運作的話輸入完第一條指令應該直接在浏覽器中通路了。是以本文主要是對Docker的run指令做了簡單的解釋,并且通過Docker在Linux和Windows下的差別來簡單了解Docker邏輯層次結構。