Docker入門學習教程
- 0x01 關於Docker 你應該瞭解的
- 1.1 Docker 解決了什麼問題?
- 1.2 Docker 是什麼?
- 1.3 爲什麼不用虛擬機?
- 1.4 虛擬機和Docker 的區別是什麼?
- 1.5 Docker, Docker Desktop, Docker Hub , Kubernetes(k8s) 什麼關係?
- 1.6 Docker 和image 什麼關係?
- 1.7 Docker 適用於什麼場景?
- 1.8 Docker 收費還是付費?
- 0x02 Docker Desktop如何安裝?
- 0x03 如何使用Docker?
- 0x04 Docker 常用命令
- 4.1 列出下載到本地機器的鏡像
- 4.2 列出所有正在運行的容器列表
- 4.3 編譯構建Docker 鏡像
- 4.4 如何啓動一個Docker容器
- 4.5 停止一個Docker容器
- 4.6 查看Docker容器日誌
- 4.7 刪除一個Docker容器
- 0x05 參考資料
0x01 關於Docker 你應該瞭解的
1.1 Docker 解決了什麼問題?
我們知道當我們開發一個應用程序後發佈到生產環境,如果想讓它正常運行,往往還需要配置這個應用程序所需要的各種環境,比如安裝JRE, 配置環境變量等,而且不同操作系統部署又有些差異,部署成本相對來說比較繁瑣。
那麼有沒有什麼比較好的辦法呢?
答案是肯定的,那就是使用Docker
1.2 Docker 是什麼?
Docker是供開發人員和系統管理員使用容器構建,運行和共享應用程序的平臺.
我的理解是:Docker 是一個將應用程序和運行環境一起打包部署的工具庫。
1.3 爲什麼不用虛擬機?
虛擬機(virtual machine)其實也是帶環境安裝的一種解決方案,但是它和Docker相比起來,所需要的硬件配置更高,而且因爲它是一個獨立的系統,除了運行你的應用程序,還需要其他一些程序運行來保持操作系統保持正常運行,在加上啓動慢的缺點,所以最好的解決方案是使用Docker 而不是虛擬機。
1.4 虛擬機和Docker 的區別是什麼?
虛擬機和Docker 的一個很顯著的差別是:虛擬機是對整個操作系統的打包,而Docker 只是對所需要的組件進行打包。
左邊是Docker ,右邊是虛擬機。
Docker 是一個虛擬化軟件容器,怎麼理解呢?
我覺得我們可以把它當作一個箱子,我們把自己的應用程序和它運行所需要的東西都放到這個箱子裏,那麼換另一個地方仍然可以正常使用它,而不是再進行各種繁瑣的應用程序部署配置。
1.5 Docker, Docker Desktop, Docker Hub , Kubernetes(k8s) 什麼關係?
這四者之間有什麼關係呢?
如果你足夠細心的話,我想你應該可以在Docker 官網提供了兩個產品。
一個是Docker Desktop ,另外一個是Docker Hub.
- Docker 是一個軟件虛擬化容器,可以將應用程序和運行環境打包發佈。
- Docker Desktop 就是一個本地開發工具庫,可以幫助我們將應用程序和環境打包,更新,發佈。
- Docker Hub 就相當於一個代碼倉庫,也可以理解爲商店,我們的應用程序可以發佈到上面,供其他人下載使用。
- Kubernetes 我想可能是音譯過來就是K8s ,因此很多人這麼簡稱它,Docker 如果說是一個微服務和運行環境的打包,那麼k8s 就是對這些很多打包成Docker 的微服務進行服務編排管理的一個工具
1.6 Docker 和image 什麼關係?
- 從根本上講,一個容器不過是一個正在運行的進程,並對其應用了一些附加的封裝功能,以使其與主機和其他容器隔離。
- 容器隔離的最重要方面之一是每個容器都與自己的專用文件系統進行交互。 該文件系統由Docker Image提供。
- image包括運行應用程序所需的一切-代碼或二進制文件,運行時,依賴項以及所需的任何其他文件系統對象。
容器理解成一個個隔離進程的箱子,鏡像則是將應用程序和運行環境打包的盒子
1.7 Docker 適用於什麼場景?
Docker 適用於如下場景:
- 持續構建和持續交付
- 更加自動,輕量,快捷的DevOps(開發和部署)流程
- 彈性雲服務的動態擴容與縮容。
- 搭建微服務架構
1.8 Docker 收費還是付費?
打開官網價格頁面,我們可以看到這個問題的答案
也就是說,分爲兩種:
- 個人使用
- 團隊使用
如果你是個人,想要免費的話可以使用Docker 開發的基礎功能和擁有一個私有倉庫,其他發佈的Docker 必須是公開的。
如果你想體驗更好的服務,比如並行構建和無限制的私有倉庫,那麼你需要每個月付費7美元。
摺合人民幣是多少錢呢?如果有興趣可以看https://www.baidu.com/s?wd=7%E7%BE%8E%E5%85%83
如果你是團隊,最低每月7美元起步,具體價格就是越貴,提供服務越好
適用於團隊的高級協作和管理工具,包括具有基於角色的訪問控制,並行構建和私有存儲庫的組織和團隊管理。
0x02 Docker Desktop如何安裝?
- 打開Docker 官網我們可以看到這樣的界面
-
點擊Download for Mac 即可下載Mac OS X 操作系統上的Docker 安裝包
-
點擊Download for Windows ,即可下載windows 操作系統上的Docker 安裝包。
具體安裝的過程,我就不囉嗦了。
0x03 如何使用Docker?
3.1 驗證是否安裝成功
安裝完Docker 要做的第一件事就是驗證我們的Docker 有沒有安裝成功。
驗證方法很簡單,只需要在我們的命令行中輸入如下命令:
docker --version
如果看到類似下面的內容,就說明安裝成功了
3.2 如何運行一個Docker 容器
想要運行一個Hello world Docker 容器命令很簡單,只需要輸入如下命令即可:
命令語法:
docker run 應用程序名稱
由於應用程序的名稱是hello-world 因此我們輸入如下命令:
docker run hello-world
值得注意的是,Docker hub 倉庫中存在寫好的Hello World 應用程序,如果第一次運行它需要先從Docker hub 倉庫中下載到你的電腦裏,然後才能運行。
因此我們可能會看到這樣的內容
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:ca0eeb6fb05351dfc8759c20733c91def84cb8007aa89a5bf606bc8b315b9fc7
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
如果運行成功可以看到類似下面這樣的內容:
3.3 如何編譯和運行一個image鏡像?
前面步驟我們已經安裝了Docker Desktop, 因此現在我們可以用它來開發容器化的應用程序。
通常步驟流程是:
- 創建image 鏡像文件,爲應用程序的每個組件創建和測試單獨的容器。
- 將容器和支持基礎結構組裝成一個完整的應用程序
- 測試,共享和部署完整的容器化應用程序
3.3.1 使用git 下載一個實例項目
- 假設你的電腦已經安裝好了git,那麼我們可以選擇一個文件夾下,然後執行如下命令下載一個示例項目。
git clone https://github.com/dockersamples/node-bulletin-board
3.3.2 用Dockerfile定義一個容器
編寫Dockerfile是容器化應用程序的第一步.
- 下載完成後我們輸入如下命令進入這個node-bulletin-board 文件夾
cd node-bulletin-board/
node-bulletin-board項目是一個簡單的公告板應用程序,使用Node.js編寫。
在此示例中,假設我們編寫了此應用,現在正嘗試對其進行容器化。
然後再進入bulletin-board-app 文件夾
cd bulletin-board-ap/
接下來我們可以看到這樣一個Dockerfile
文件,爲了更容易理解,這裏圖形用戶界面展示下
- 使用vi 命令或者文本編輯器打開這個文件
vi Dockerfile
文件內容增加英文註釋後如下所示:
# Use the official image as a parent image
FROM node:current-slim
# Set the working directory
WORKDIR /usr/src/app
# Copy the file from your host to your current location
COPY package.json .
# Run the command inside your image filesystem
RUN npm install
# Inform Docker that the container is listening on the specified port at runtime.
EXPOSE 8080
# Run the specified command within the container.
CMD [ "npm", "start" ]
# Copy the rest of your app's source code from your host to your image filesystem.
COPY ..
可能你會好奇這些內容是什麼意思呢?
FROM node:current-slim
:這是一個由node.js供應商構建的官方鏡像,並已由Docker驗證爲包含Node.js長期支持(LTS)解釋器和基本依賴項的高質量image鏡像。WORKDIR
:可以指定所有後續操作均應從鏡像文件系統中的/usr/src/app
目錄中執行(而不是主機的文件系統中)。COPY
:將文件package.json
從主機複製到鏡像中的當前位置,這裏會複製到/usr/src/app/package.json
)RUN
: 在鏡像文件系統中運行命令npm install
(將讀取package.json以確定應用程序的節點依賴性,然後安裝它們)COPY
: 將應用的其餘源代碼從主機複製到鏡像文件系統。CMD
指令是在圖像中指定一些元數據的第一個示例,該元數據描述瞭如何基於該圖像運行容器。在這種情況下,這就是說該鏡像應支持的容器化過程是npm start
。EXPOSE 8080
通知Docker該容器在運行時正在監聽8080端口
上面就是一個構建一個Dockerfile 的簡單示例,更多用法請參考Dockerfile reference
Dockerfile 文件的編寫規則:
始終以FROM命令開頭,然後按照步驟構建我們的私有文件系統,並以任何元數據規範作爲結束。
3.3.3 構建和測試我們的應用程序
我們需要在node-bulletin-board/bulletin-board-app
目錄下執行如下命令:
docker image build -t bulletinboard:1.0 .
執行成功如下所示:
如果能看到Successfully tagged bulletinboard:1.0
說明構建成功了。
3.3.4 將鏡像當作一個容器來運行
輸入如下命令運行剛纔構建的鏡像
docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0
這裏有三個參數
--publish
:要求Docker將主機端口8000上傳入的流量轉發到容器的端口8080。容器具有自己的專用端口集,因此,如果要從網絡訪問某個端口,則必須以這種方式將流量轉發到該端口。否則,作爲默認的安全狀態,防火牆規則將阻止所有網絡流量到達您的容器.--detach
:要求Docker在後臺運行此容器--name
:指定一個應用程序別名,您可以在後續命令中使用該名稱來引用我們的容器
另請注意,我們並沒有指定要運行容器的進程。 我們不需要這樣做,因爲在構建Dockerfile時使用了CMD指令; 因此,Docker知道在啓動時會自動在容器內運行npm start
進程
3.3.5 訪問我們的應用程序
打開網址: http://localhost:8000/
如果成功可以看到如下內容:
3.4 如何分享我們的鏡像到Docker Hub?
- 將我們鏡像分享到Docker Hub 的,就需要我們註冊一個賬號。
打開註冊地址:https://hub.docker.com/signup
填寫註冊信息然後通過郵件認證後我們就擁有了一個Docker hub 賬號(Docker ID)
-
打開Docker 登陸網址 http://hub.docker.com/sso/start
-
登陸成功後我們可以看到如下內容
登陸成功後我們可以選擇創建一個倉庫,或者瀏覽其他官方提供的鏡像,比如ningx,mongoDB,Redis 等等。 -
當我們點擊Create a Repository 之後可以進入這樣的界面
注意的是
- 個人免費版只能使用一個私有倉庫,其他必須是公開的,如果想私有化,那麼就需要我們每個月付7美元。
- 如果我們想把本地鏡像推送到Docker Hub ,那麼需要執行如下格式的命令
docker tag local-image:tagname new-repo:tagname
- 執行提交命令
docker push new-repo:tagname
- 相信聰明的你一定發現了,這些流程和Github 上的操作很是類似。
- 接下來我們就把剛纔編譯構建的應用發佈出去
不同人的命令稍微有差異,由於我的情況是這樣
因此應該輸入如下命令:
docker image tag bulletinboard:1.0 fairyxingyun/my-first-docker-app:1.0
值得注意的上面的綁定規則必須符合
<Docker ID>/<Repository Name>:<tag>
- 將鏡像推送到Docker hub
docker image push fairyxingyun/my-first-docker-app:1.0
然後只需要靜靜等待就可以了。
- 命令執行成功後,我們打開自己的Docker hub 首頁
- 點擊Public View 按鈕,我們就可以看到這樣的界面
- 如果別人想使用我們的鏡像,那麼只需要輸入上圖中的Docker Pull 命令即可
命令如下:
docker pull fairyxingyun/my-first-docker-app
示例地址:https://hub.docker.com/r/fairyxingyun/my-first-docker-app
0x04 Docker 常用命令
4.1 列出下載到本地機器的鏡像
docker image ls
執行效果如下所示:
4.2 列出所有正在運行的容器列表
docker container ls --all
執行效果如下所示:
4.3 編譯構建Docker 鏡像
打包應用程序到當前位置,需要在編寫有Dockerfile 的根目錄下,執行如下命令
docker image build -t 應用程序名稱:版本號 .
4.4 如何啓動一個Docker容器
- 啓動一個已存在的Docker 容器的語法
docker container start [containerID]
- 新建方式啓動Docker容器的語法
docker container run [containerID]
如果新建容器,每運行一次,就會新建一個容器。同樣的命令運行兩次,就會生成兩個一模一樣的容器文件。
4.5 停止一個Docker容器
停止一個Docker容器的語法格式:
container stop [containerID]
4.6 查看Docker容器日誌
查看一個Docker容器的日誌語法格式
docker container logs [containerID]
4.7 刪除一個Docker容器
刪除一個Docker容器的命令語法:
docker container rm --force [containerID]
--fore
加上這個參數可以刪除正在運行的容器。
0x05 參考資料
本篇完~
喜歡我的博文,歡迎點贊關注或轉發,感謝你的閱讀~
交流即分享,分享才能進步~