Docker是一個開源的應用容器引擎,基於Go語言,並遵從Apache2.0協議開源。
Docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後發佈到任何流行的Linux機器上,也可以實現虛擬化。
Docker容器是完全使用沙箱機制,相互之間不會有任何接口,相比於虛擬機,容器啓動速度快,性能開銷極低。
Docker架構
首先介紹下Docker的架構,可以由下圖表示,主要由Clients、Hosts、Registries組成,下面提到了幾個專有名詞,我來一個個單獨介紹:
Image
Docker鏡像,用於創建 Docker 容器的模板。可以看成Java裏面的Class類。
Container
獨立運行的一個或者一組容器。啓動Images後會生成Container,因此可以看成Java裏面類的實例化對象。一個Image可以啓動多次生成多個Container。
Client
Docker 客戶端,使用 Docker Api與 Docker 的守護進程通信。一般在桌面開發中,Client和下面介紹到的Host都在同一個客戶端中,使我們感覺Client和Host是在一起的,其實原理是上單獨的兩個模塊。
Host
Docker 主機,一個物理或者虛擬的機器,用於執行 Docker 守護進程和容器。
Registry
Docker倉庫,用來保存鏡像。官方的Docker鏡像是 https://hub.docker.com/ ,註冊後可以在這裏存放你自己的Image。
Machine
docker-machine就是幫助你快速去創建安裝docker環境的工具,當我們需要在很多臺Server上安裝Docker環境時,我們可以使用Machine進行安裝。
Docker常用操作流程
日常工作中,用到的最多的Docker操作如下,主要包含:
- 從本地提交Image到遠端鏡像
- 從遠端獲取鏡像到本地
- 在本地進行鏡像的測試與製作
接下來進行Docker的實際安裝與操作。
安裝
Docker官方在這裏 https://docs.docker.com/install 給出了詳細的安裝流程,直接按照步驟一步步安裝,一般不會有什麼問題。
注意:在Ubuntu系統上進行安裝時,推薦使用
Install using the repository
的方式安裝,否則直接使用安裝包安裝會出現很多依賴問題。
Docker基本操作
Docker安裝好了以後,我們可以運行
docker run hello-world
來啓動我們的第一個docker容器,正常情況下,docker會從遠端倉庫下載好hello-world以後直接啓動。
Docker的操作主要包括兩類,一類是對Image鏡像的操作,另一類是對Container容器的操作。
容器與鏡像的關係
首先通過下圖再次認識一下容器與鏡像的關係,簡單來講,鏡像類似Class類,容器類似new對象。另外鏡像類似於Class類,也有繼承的關係,也就是說一個鏡像可以基於另一個鏡像,增加自己的新的功能和需求,這點在後續的製作Docker鏡像和Docker文件結構中會詳細講到。
鏡像操作
以下是主要的鏡像操作,
docker [images|rmi|tag|build|history|save|load]
- images:列出本地鏡像列表
- rmi [鏡像名:版本]:刪除鏡像
- tag [鏡像名:版本] [倉庫]/[鏡像名:版本]:標記本地鏡像,將其歸入某一倉庫
- build -t [鏡像名:版本] [path]:Dockerfile 創建鏡像
- history [鏡像名:版本]: 查看指定鏡像的創建歷史
- save -o xxx.tar [鏡像名:版本] / save [鏡像名:版本]>xxx.tar : 將鏡像保存成 tar 歸檔文件
- load --input xx.tar / docker load<xxx.tar : 從歸檔文件加載鏡像
容器操作
相比於對鏡像的操作,對於容器的操作更多,
docker [run|start|stop|restart|kill|rm|pause|unpause]
- run/create[鏡像名]: 創建一個新的容器並運行一個命令
- start/stop/restart[容器名]:啓動/停止/重啓一個容器
- kill [容器名]: 直接殺掉容器,不給進程響應時間
- rm[容器名]:刪除已經停止的容器
- pause/unpause[容器名]:暫停/恢復容器中的進程
docker [ps|inspect|exec|logs|export|import]
- ps:查看容器列表(默認查看正在運行的容器,-a查看所有容器)
- inspect[容器名]:查看容器配置元數據
- exec -it [容器名] /bin/bash:進入容器環境中交互操作
- logs --since="2019-02-01" -f --tail=10 [容器名]:查看容器日誌
- cp path1 [容器名]:path 容器與主機之間的數據拷貝
- export -o test.tar [容器名] / docker export [容器名]>test.tar : 文件系統作爲一個tar歸檔文件
- import test.tar [鏡像名:版本號]:導入歸檔文件,成爲一個鏡像
以上給出了容器和鏡像的基本操作,一般情況下,開發比較常見的是下面三個,
1. 啓動容器並且後臺運行
docker run -d --name myhello-world hello-world
注意到-d
參數是後臺運行,--name
指定容器的名稱.
同時在運行時可以綁定容器端口,比如啓動nginx容器的時候,可以將nginx的80端口綁定到本機的8080端口。
docker run -d -p 8080:80 --name nginx nginx:latest
2. 進入正在運行的容器
docker exec -it nginx /bin/bash
-it
交互式的啓動bash,這個在後面會經常用到,因爲經常會進入容器進行調試。
這一節主要介紹了Docker的基本架構和操作,後續會介紹Docker的文件結構和Docker的製作。
本文由『後端精進之路』原創,首發於博客 http://teckee.github.io/ , 轉載請註明出處
搜索『後端精進之路』關注公衆號,立刻獲取最新文章和價值2000元的BATJ精品面試課程。