目錄
- Docker安裝
1.1. Windows
1.2. Ubuntu - Docker容器的使用
2.1. 啟動一個新的容器
2.2. 掛起運行的程序
2.3. 重啟被掛起的程序
2.4. 終止容器運行
2.5. 重新運行已有容器 - Docker資源的管理
3.1. 管理鏡像資源
3.2. 管理容器資源
3.3. 管理網(wǎng)絡資源
3.4. 創(chuàng)建自己的鏡像 - References
在我電腦上沒問題跋滤怼谓媒!
如果你看懂了上面這句話迫筑,說明我們是同道中人。寫程序有四種痛:
- 起早摸黑寫好了代碼搂妻,在自己的電腦上運行的好好欲主,但是到了另一臺電腦上各種問題層出不窮逝嚎,軟件越復雜依賴越多补君,頭就越大挽铁;
- 想干一件大事叽掘,辛歷盡千辛萬苦配置好了環(huán)境,換了電腦又要從頭再來盖腕±A校或者某天無意對電腦做了小小的改動哭廉,環(huán)境崩了;
- 想研究個新技術(shù)或者學個新技能增淹,僅僅是搭建環(huán)境已經(jīng)竭盡全力乌企,你還不能確定有沒有遺漏加酵;
- 頭發(fā)越來越少。
幸運的是冗澈,除了第四點亚亲,前三點已經(jīng)有了解決方案捌归,它就是Docker —— 容器化技術(shù)惜索。它可以通過容器來構(gòu)建、運行和分發(fā)應用程序猎物。借用Java的口號就是:一次配置霸奕,到處運行质帅。
或許你會問煤惩,既然已經(jīng)有了虛擬機魄揉,為什么還要搞出個容器洛退?容器化其實就是一種虛擬化技術(shù)杰标,與傳統(tǒng)虛擬機相比腔剂,它有著輕量、獨立绪爸、可伸縮奠货、可移植以及靈活等特點仇味。容器直接運行于內(nèi)核之上丹墨,多個容器共用系統(tǒng)的內(nèi)核嬉愧,直接通過內(nèi)核獲取系統(tǒng)資源没酣,用多少取多少裕便;而虛擬機則通過一個管理程序來獲取宿主系統(tǒng)的資源偿衰,運行在其上的程序有著自己的內(nèi)核下翎,就算你跑的是個Hello World
,它也占用這很大一塊資源胆萧。拿吃飯打個比方跌穗,容器是按點的菜收錢:你點多少菜付多少錢瞻离;虛擬機是按人頭收錢,只要你人在那鹤耍,就算你只喝了一口水也照樣收你這么多錢。它的區(qū)別如圖1所示喊衫。
當然族购,我不止一次說過寝杖,工具是不分優(yōu)劣的瑟幕。某種特定場合下只盹,某個工具更合適殖卑,僅此而已孵稽「匾保“殺雞焉用牛刀”睦袖,說的也不是那種刀比另一種刀更好馅笙。這篇文章的主要目的是介紹Docker的用法厉亏。
0. Docker簡介
Docker引擎由客戶端(Client)爱只、守護進程(Daemon)和注冊表(Register)三部分組成,如圖2所示疯暑。用戶通過客戶端發(fā)送命令來管理Docker的資源妇拯,包括鏡像越锈、容器膘滨、網(wǎng)絡等(鏡像和容器的關(guān)系就類似于程序和進程的誒關(guān)系)吏祸;守護進程接收客戶端以及API發(fā)過來命令來操縱容器贡翘,從而實現(xiàn)鏡像、容器泛鸟、網(wǎng)絡等資源的管理北滥;而注冊表就是一個倉庫闸翅,放著各種各樣的鏡像坚冀。因此记某,使用Docker主要就是使用Docker客戶端命令。
Docker客戶端的命令壳猜,可以大致分為三部分统扳,每個部分又可以接著細分:
- Docker安裝闪幽;
- Docker容器的使用;
- Docker資源的管理;
1. Docker安裝
安裝原本說是沒有什么好說的腕够,但是由于在Windows 10上Docker和VirtualBox不能共存帚湘,因此還是簡單介紹介紹下甚淡。
1.1. Windows
- 首先贯卦,在Windows下撵割,首先要打開
Hyper-V
選項,打開方式為:【控制面板】=>【程序】=>【程序和功能】=>【啟用或關(guān)閉Windows功能】羹与,然后勾選Hyper-V
及其子選項纵搁;
- 接下來,就直接到官網(wǎng)下載安裝Windows版本即可菲语。
值得注意的是,Docker和VirtualBox不能共存眼耀,因此你只能二選一哮伟。安裝了Docker后,回頭你再想用VirtualBox可能會遇到VT-x is not available (VERR_VMX_NO_VMX)
這個錯誤池凄,解決方法如下:
- 以管理員身份打開命令提示符肿仑;
- 輸入
bcdedit
回車尤慰,你看到的應該看到hypervisorlaunchtype
的值是auto
雷蹂; - 輸入
bcdedit /set hypervisorlaunchtype off
并回車匪煌; - 重啟電腦。
1.2. Ubuntu
在Ubuntu下安裝Docker霜医,依次輸入以下命令即可:
# Commands for install docker on Ubuntu,if command fail, consult [https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
# x86_64 / amd64
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# Test
sudo docker run hello-world
2. Docker容器的使用
Docker使用可分為以下三個部分:
- 啟動新容器;
- 掛起一個容器达舒;
- 重啟被掛起的容器巩搏;
- 停止容器贯底;
- 重新啟動已有容器
這里只列舉一些常用的,以及一般場景下夠用的命令笙什。
2.1. 啟動一個新的容器
啟動一個新容器的命令為docker run
,常用命令大致如下:
docker run -it -v <host dir>:<container dir> -w/<container dir> --name <your container name> --rm <your docker image name>
-it
表示啟動一個交互式的容器统屈,也就是你可以在命令行輸入命令進行交互;
-v
將本地目錄和容器中的一個目錄做映射腕扶,這樣在容器中就能直接訪問該目錄下的內(nèi)容半抱;
-w
指定容器啟動后的工作目錄代虾;
--name
用于個這個容器分配一個名字,方便表明該容器的目的以及后續(xù)管理江掩;
--rm
表示當容器退出后自動刪除环形。
例如:
docker run -it -v `pwd`/docker:/workspace -w/workspace --name ubuntu:16.04 ubuntu:16.04
上面命令中通過ubuntu:16.04這個鏡像創(chuàng)建了一個名叫ubuntu:16.04的容器可交互的抬吟。使用docker run
的時候火本,如果本地沒有指定的鏡像,Docker會嘗試從遠程注冊表(倉庫)中尋找茫陆,找到后拉炔局选(pull)到本地再創(chuàng)建。
2.2. 掛起運行的程序
docker pause CONTAINER [CONTAINER...]
2.3. 重啟被掛起的程序
docker unpause CONTAINER [CONTAINER...]
2.4. 終止容器運行
如果是交互式的容器喜最,直接輸入exit
便退出了容器返顺。如果是非交互式的容器,通過以下命令:
docker stop <container id or name>
有時候容器運行了很久振乏,我都不記得容器名字和ID了,怎么辦舟陆?可以通過以下命令獲取所有容器信息:
docker container ls -a
2.5. 重新運行已有容器
# -i , optional, starting interactive
docker start -i <container id or name>
3. Docker資源的管理
Docker的鏡像和容器的關(guān)系秦躯,就類似于程序和進程的關(guān)系踱承。鏡像是一個只讀文件茎活,它里面包含了如何創(chuàng)建一個容器的指令和模板载荔;而容器就是一個鏡像的實例丘损。鏡像和容器都是Docker引擎管理的重要資源煌珊,此外吏饿,還有網(wǎng)絡資源蔬浙、集群資源猪落、插件和磁盤資源等。這里只介紹簡單使用場景下常用的一些管理命令:
- 管理鏡像資源畴博;
- 管理容器資源笨忌;
- 管理網(wǎng)絡資源;
- 創(chuàng)建自己的鏡像俱病。
其實管理Docker資源的命令和我們一般使用的Linux命令很類似官疲,基本命令構(gòu)成為docker <resources type> <linux/git command>
袱结。<resources type>
可以是image
、container
途凫、network
等垢夹,而<linux/git command>
則可以是ls
果元、rm
阅畴、commit
等。例如:
# list local images
docker image ls -a
# remove local images
docker image rm <image id/name>
docker container ls -a
docker container rm <container id>
實際使用過程中昵仅,也可以類似Linux中man COMMAD
去查看某個命令用法一樣,可以使用直接使用`docker <resources type>查看具體命令的用法,例如:
$ docker network
Usage: docker network COMMAND
Manage Docker networks
Options:
--help Print usage
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
3.1. 管理鏡像資源
- 遠程鏡像搜索分蓖;
- 拉取鏡像到本地蒸甜;
- 本地鏡像查看辉巡;
- 本地鏡像移除咕痛。
我們使用Docker的時候,首先,可以向看看本地有沒有我們想要的鏡像:
docker images # or docker image ls -a
如果本地沒有,可以使用以下命令搜索注冊表上有沒有我們想要的:
docker search [OPTIONS] TERM
# 例如:docker search ubuntu
搜索出來所有可用的鏡像后選擇自己想要的,拉取到本地:
docer pull <image name>
# 例如:docker pull ubuntu:16.04
其實,當我們直接使用docker run
的時候撬呢,docker run
就是首先執(zhí)行上面三步晨另。
當有些鏡像我們不再需要了路翻,我們可以刪除
docker image rm <image id/name>
3.2. 管理容器資源
與鏡像資源類似,對容器的管理也是類似的:
- 查看已有容器厌小;
- 刪除已有容器癣蟋;
- 查看某個容器詳細信息幔欧;
- 容器的創(chuàng)建恒序、暫停屠缭、重新運行等铐殃。
查看容器:
docker container ls -a
通過列出的容器域帐,可以獲取到容器的ID或者名字许饿,進而可以刪除容器:
docker container rm <container id/name>
或者筒愚,查看容器的詳細信息:
docker container inspect <container id/name>
而對于容器的創(chuàng)建、重啟等操作前面已經(jīng)介紹過了含懊。
3.3. 管理網(wǎng)絡資源
網(wǎng)絡資源,其實就是專門給容器使用虛擬網(wǎng)絡設(shè)備呼胚。默認情況下會有個一個名字是brigde
的路由器,所有容器如果未經(jīng)指定都會鏈接到上面饭宾,組成一個局域網(wǎng)。對網(wǎng)絡資源的管理可以使用以下命令:
查看已有的網(wǎng)絡資源:
docker network ls
查看某個網(wǎng)絡資源的詳細信息:
docker network inspect <network id/name>
網(wǎng)絡資源的創(chuàng)建和刪除:
docker network create
docket network rm <network id/name>
網(wǎng)絡的鏈接和斷開:
docker network connect <network> <container>
docker network disconnect <network> <container>
3.4. 創(chuàng)建自己的鏡像
Docker相比于虛擬機的優(yōu)勢净嘀,主要就是它能夠很輕易的分享宵膨,或者說轉(zhuǎn)移已經(jīng)配置好的環(huán)境,并且體積相對于整個虛擬可以小很多练慕。這個是怎么實現(xiàn)的呢哪工?主要有兩種方法:
- 將已有容器打包成鏡像茴她,然后推到遠程倉庫;
- 在已有的鏡像基礎(chǔ)上粟按,通過Dockerfile中的命令創(chuàng)建一個新的鏡像矾利。
從已有容器打包可以使用以下命令:
docker container commit --author <author name> -m <new image description> <container id/name> <image name>
例如什荣,我運行了一個Ubuntu16.04的容器,并為它配置了adb(Android Debug Bridge)環(huán)境紫谷。為了能在別的機器上使用Ubuntu16.04的時候可以不用再配置adb,我將它打包成了一個新的鏡像格嘁,命令和結(jié)果顯示如下:
zhou@zhou:~$ docker container commit --author SunnyZhou -m 'Add adb' dbc7bdb56f2a ubuntu_with_adb:16.04
sha256:de247093e26e4e91eb4470d14067cdde094bddb46c063964ff254967282de113
zhou@zhou:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu_with_adb 16.04 de247093e26e 11 seconds ago 128MB
ubuntu 16.04 77be327e4b63 2 months ago 124MB
第二種方法是通過Dockerfile來創(chuàng)建新的容器,一個簡單的例子是,還是創(chuàng)建一個帶adb的Ubuntu16.04:
首先編寫Dockerfile(完整的Dockerfile命令參看文末參考文檔):
FROM ubuntu:16.04
COPY platform-tools/adb /sbin/adb
然后使用docker build
來創(chuàng)建:
zhou@zhou:~/docker$ vi Dockerfilezhou@zhou:~/docker$ docker build . --tag ubuntu-adb:16.04Sending build context to Docker daemon 26.95MB
Step 1/2 : FROM ubuntu:16.04
---> 77be327e4b63
Step 2/2 : COPY platform-tools/adb /sbin/adb
---> 1a5e2b476d20
Successfully built 1a5e2b476d20
Successfully tagged ubuntu-adb:16.04
這篇文章知識Docker的一篇概覽,也是我日常使用Docker最多的命令。完整的命令請參看參考文檔欣孤。
References
[1] https://docs.docker.com/engine/reference/commandline/docker/
[2] https://docs.docker.com/get-started/overview/
[3] https://docs.docker.com/docker-for-windows/install/
[4] https://docs.docker.com/engine/reference/builder/#usage
[5] https://github.com/docker/labs