Docker是一項比較流行的容器化技術,可以讓開發者將應用以及應用依賴的環境,依賴包一起打包到容器中,然后部署容器到生產環境就可以了,解決了應用程序部署到不同服務器環境帶來的問題(很多開發人員都遇到過應用程序在自己本地服務器跑的好好的,部署到生產環境就運行不起來,各種奇葩的異常),實現了“一次構建,處處運行”。
官方為我們提供了針對不同系統的Docker版本,今天我們基於windows系統簡單介紹下如何使用。
Windows部署Docker
目前官方發布的Docker桌面版,僅支持Windows 10 64-bit: Pro, Enterprise(企業版), Education(教育版),其他windows操作系統版本使用Docker需借助官方發布的Docker ToolBox工具。
1.首先,我們到Git上下載Docker ToolBox(https://github.com/docker/toolbox/releases)
注意點:1)需要windows 7及以上的64位操作系統
2)系統上的虛擬化(Hyper-V )功能啟用
2.下載完成之后,直接雙擊啟動DockerToolbox-19.03.1.exe 安裝程序。按着指示往下執行即可
3.安裝成功之后,桌面上會出現如下三個圖標:
- 1)Docker QuickStart shell - 這是一個已經配置好Docker的命令行環境,啟動docker。
- 2)Oracle VM Virtualbox - 虛擬機,windows系統模擬了一個linux虛擬環境
- 3)Kitematic - 這是 Docker 的 GUI 版本,相較於以前的敲命令行,操作簡單了。
4.啟動docker
雙擊桌面上的Docker QuickStart shell的快捷方式,程序窗口顯示出“鯨魚”就表示啟動成功了。
這里我們會看到啟動成功后,提供給我們一個IP地址:192.168.99.100。大家這里需要注意,后面我會具體描述下。
Docker基礎使用
1.Image文件
Docker容器將應用程序及其依賴,打包到image文件中。然后,通過image文件來生成Docker容器,image文件可以當做是容器的模板,一個image文件可以生成多個同時運行容器。
image操作:
1.列出所有image $ docker image ls
2.從倉庫拉取可用的image $ docker image pull (image文件地址)
3.image文件刪除 $ docker image rmi (image文件ID)
我們可以自己制作image文件,也可以直接從倉庫拉取別人上傳的image文件。Docker Hub為我們提供了image文件的上傳和下載,實現了文件的共用。
2.容器Container
前面我們提到Docker容器是依靠image文件生成的,但是Docker容器生成后確是區別於image文件存在的。需要通過關鍵字“container”對容器進行操作。
# 列出正在運行的容器 $ docker container ls # 列出所有容器,包括終止運行的容器 $ docker container ls --all #終止容器運行 $ docker container kill (容器ID) #刪除容器 $ docker container rm (容器ID)
這里我們需要注意下,在刪除image文件時如果存在依賴image文件生成的容器,我們需先刪除容器才能刪除image文件。
3.Dockerfile文件
前面我們介紹了image文件和容器文件,那么image文件和容器具體是怎么生成的呢?實際項目中,image文件的生成需要依賴dockerfilew文件(一個不帶后綴的文本文件),大家可以把dockerfile理解成是生成image文件的一個配置文件,我們這里簡單介紹幾個常用的配置節點:
1)FROM:配置一個基礎鏡像,也就是后面你要生成的鏡像是基於此基礎來的。
2)WORKDIR:指定image文件的工作目錄
3)COPY:格式:copy [源地址] [目標地址],將源地址文件拷貝到image文件中的目標地址。
4)EXPOSE:暴露出容器對外的端口
5)ENTRYPOINT:容器運行后默認執行的cmd命令。
樣例:
FROM microsoft/dotnet:2.2-aspnetcore-runtime WORKDIR /app #指定工作目錄為/app COPY . . #.表示當前目錄 將當前命令行執行程序所在目錄文件都拷貝到image文件的當前工作目錄下 EXPOSE 7000 #容器對外暴露7000端口 ENTRYPOINT ["dotnet", "NetCoreSqlSugar.dll"] #容器生成后,默認執行cmd命令:dotnet NetCoreSqlSugar.dll
4.生成image文件和容器
有了dockerfile文件之后,我們就可以通過如下cmd命令生成image文件和容器。
1)首先cmd定位到dockerfile所在文件目錄。
2)生成image文件
$ docker image build -t myimage .
- -t 參數:指定image文件名稱。
- myimage是文件名稱。
- "."最后還有個符號,千萬不要忘記,這里表示的是dockerfile文件的路徑。
生成成功之后,我們通過命令 docker image ls 可以看到image文件已存在了。
3)生成容器
$ docker container run -p 8001:7000 -it -d myimage
-p
參數:容器的 7000 端口映射到宿主機的 8001 端口。-it
參數:容器的 Shell 映射到當前的 Shell,然后你在本機窗口輸入的命令,就會傳入容器。myimage
:image 文件的名字(如果有標簽,還需要提供標簽,默認是 latest 標簽)。-d參數
:容器啟動后,后台運行。
容器生成之后,我們通過命令 docker container ls 可以看到正在運行的容器。
.NetCore WebApi部署docker
好了,前面我們簡單了介紹了一些Docker的一些簡單入門,下面我們結合.netcore webapi應用程序具體給大家說一說實際項目中如何使用Docker。
1.新建一個.NetCore WebApi項目,並啟用docker支持。
如果創建的項目忘記啟用docker,也不用擔心,我們可以右鍵項目,添加-->docker支持。
2.修改dockerfile文件,如下:
FROM microsoft/dotnet:2.2-aspnetcore-runtime WORKDIR /app COPY . . EXPOSE 7000 ENTRYPOINT ["dotnet", "NetCoreSqlSugar.dll"]
dockerfile文件右鍵--屬性,選擇始終復制,可以直接發布到目錄。
3.修改應用程序端口號(Program.cs文件)
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseUrls("http://*:7000") .UseStartup<Startup>();
我這里用了最簡單的方式UseUrls方法定義了端口號,實際項目中並不推薦大家這么使用。偷懶了。。。哈哈
4.發布項目
發布應用程序到執行目錄,我們會發現發布目錄多了一個dockerfile文件。
5.生成image文件和容器
#生成image文件 $ docker image build -t myimage . #創建容器並運行 $ docker container run -p 8001:7000 -it -d myimage
到了這里,基本上我們任務都完成了。但是使用windows的同學會發現當我們使用http://localhost:8001/api/Values訪問API應用程序模板接口時,並不可行,那么問題來了???
這里我們回到docker啟動,docker啟動成功之后會提供我們一個IP地址:192.168.99.100。那么這個IP到底是干什么用的呢?
我們知道Docker是運行在Linux上的,在Windows中運行docker,實際上還是在Windows下先安裝了一個Linux虛擬環境,然后再運行的docker。也就是說,應用程序中使用的localhost指的是這個Linux環境的地址,而不是我們的宿主環境Windows。這下大家也就恍然大悟了。我們在瀏覽器輸入:http://192.168.99.100:8001/api/Values 果然可以正常訪問。
Nginx實現局域網訪問
上面我們在本地雖然可以通過192.168.99.100這個IP訪問容器中的API接口,但是並不能被其他同事訪問。前端時間剛好接觸了Nginx,於是,這里果斷搬了出來,通過Nginx的“反向代理”來解決這個問題。至於為什么選擇這種方式,其實也是自己想重溫下Nginx的使用,小小自私一下。。。關於Nginx的使用我這里就不贅述了,感興趣的同學可以去了解下。
Nginx配置
upstream serlist{ server 192.168.99.100:8001;#實際請求地址 } server { listen 8001; server_name 192.168.60.4;#本機地址 #charset koi8-r; #access_log logs/host.access.log main; location ~ { proxy_pass http://serlist; proxy_connect_timeout 10; #連接超時 默認為60秒 proxy_send_timeout 10; #讀取超時 默認為60秒 proxy_read_timeout 10; #發送超時 默認為60秒 } }
有了如上配置之后,局域網內的同事就可以通過我Windows下的本機地址192.168.60.4:8001直接訪問我本機容器內的接口了,方便了大家調試調用。
以上學習內容有不足的地方,歡迎大家多多交流。