Docker基本概念
Docker是一個(gè)能夠把開發(fā)的應(yīng)用程序自動(dòng)部署到容器的開源引擎摹芙。相比虛擬機(jī)纯路,容器更加輕量級(jí),因?yàn)樗苯诱{(diào)用OS接口,而不是運(yùn)行一個(gè)虛擬機(jī)上鞠。通過容器际邻,可以很容易的獲得一個(gè)完整的程序運(yùn)行環(huán)境,我們可以用它來開發(fā)或者學(xué)習(xí)芍阎。
簡單來說世曾,如果使用Windows,希望用一個(gè)Linux環(huán)境來做一些事情谴咸,那么現(xiàn)在可以不用虛擬機(jī)了(不用安裝VMWare或VirtualBox)轮听,也可以不用Vagrant,而是直接運(yùn)行一個(gè)Docker容器就可以了岭佳。
Docker客戶端和服務(wù)器
Docker是C/S架構(gòu)的程序血巍。用戶在Docker客戶端執(zhí)行命令,客戶端向服務(wù)器發(fā)起請(qǐng)求珊随,服務(wù)器處理并返回結(jié)果述寡,最終結(jié)果顯示到客戶端。
鏡像(Image)
Image包含了一個(gè)基本的OS(比如Ubuntu)和應(yīng)用需要的運(yùn)行環(huán)境(即文件系統(tǒng))叶洞,這些文件系統(tǒng)中的文件可能是存在于多個(gè)layer的鲫凶,最終呈現(xiàn)結(jié)果是這些layer的疊加結(jié)果。
通過Dockerfile可以構(gòu)建一個(gè)Image衩辟,Dockerfile定義了使用的base操作系統(tǒng)螟炫,和一系列操作,比如RUN執(zhí)行命令艺晴,或者COPY把 Dockerfile同一級(jí)目錄的其他文件拷貝到Image中昼钻。每個(gè)命令的執(zhí)行都會(huì)產(chǎn)生一個(gè)新的Layer。
底層的Layer實(shí)際上是無法被修改的财饥,所以不要期待后面的刪除命令可以讓Image的size變小换吧。要減小size折晦,只能是執(zhí)行命令讓size變大后的同一個(gè)RUN命令中钥星,刪除不需要的垃圾,避免垃圾留在某一個(gè)layer中满着。
Image運(yùn)行時(shí)谦炒,除了Image中包含的若干Layer,還在最上面有一個(gè)可寫的Layer风喇。運(yùn)行環(huán)境中的操作宁改,都體現(xiàn)在可寫的Layer上。如果用docker commit提交魂莫,可以產(chǎn)生一個(gè)新的鏡像还蹲。
Rigistry
Docker用Rigistry來保存用戶構(gòu)建的鏡像,Docker公司運(yùn)營的Rigistry叫Docker Hub。用戶可以在Docker Hub上注冊賬號(hào)谜喊,從而發(fā)布自己構(gòu)建的鏡像潭兽。而且,還可以在github上建立一個(gè)git倉斗遏,放入Dockerfile山卦,然后在Docker Hub上創(chuàng)建一個(gè)自動(dòng)構(gòu)建項(xiàng)目,關(guān)聯(lián)到上述github倉诵次,則可以在git倉有更新時(shí)账蓉,自動(dòng)觸發(fā)構(gòu)建。這種方式逾一,可以非常有效的規(guī)避網(wǎng)絡(luò)不穩(wěn)定帶來的本地構(gòu)建鏡像的問題铸本,比如apt-get安裝程序失敗。
容器(Container)
容器提供了程序的運(yùn)行環(huán)境嬉荆,把Image運(yùn)行起來归敬,就是一個(gè)容器。
Docker基本操作
查看Image
docker images
輸出結(jié)果:
|REPOSITORY|TAG|IMAGE ID|CREATED|SIZE|
|----------|---|--------|-------|----|
|friendlyhello|latest|6b7d6b366676|About a minute ago| 194 MB|
|python|2.7-slim|faea7032fa5c|3 days ago|183 MB|
|hello-world|latest|48b5124b2768|3 months ago|1.84 kB|
運(yùn)行Image
docker run -i -t image-name /bin/bash
注1:-i表示交互式鄙早,-t表示啟動(dòng)一個(gè)終端汪茧,/bin/bash表示啟動(dòng)后運(yùn)行一個(gè)交互式shell。
注2: image-name可以用上面查詢出的repository:tag表示(沒有沖突時(shí)用repository也行)限番,或者用image id舱污。
注3:執(zhí)行某個(gè)image時(shí),如果該image還未下載弥虐,則會(huì)自動(dòng)下載扩灯。當(dāng)然也可以先執(zhí)行docker pull image-name下載。
注4:如果沒有本地Image,可以在Docker Hub查找需要的image運(yùn)行霜瘪。
查看Docker容器
docker ps
注1:不帶參數(shù)查詢正在運(yùn)行的docker容器珠插。
注2:帶-a參數(shù)查看所有docker容器。
注3:帶-l -q參數(shù)查看最近退出的docker容器id颖对。
重新進(jìn)入正在運(yùn)行的Docker容器命令行
方法一:重新附著到容器
docker attach container_name
方法二:在容器內(nèi)開啟一個(gè)執(zhí)行交互命令的進(jìn)程
docker exec -t -i container_name /bin/bash
查看運(yùn)行的Docker容器的統(tǒng)計(jì)信息
docker stats
停止容器
docker stop container_name
注1:容器名稱可以用容器ID捻撑。
注2:如果不是deamon形式的容器,交互式shell退出時(shí)容器也退出了缤底。
刪除容器
docker rm container_id
刪除鏡像
docker rmi image_id
提交修改的鏡像
docker commit container_id image_name
注:修改后會(huì)產(chǎn)生一個(gè)新的Layer顾患。
用Dockerfile構(gòu)建鏡像
docker build -t docker_image_tag .
Dockerfile編寫注意
- 每個(gè)RUN命令,都會(huì)產(chǎn)生一個(gè)Layer个唧,所以一個(gè)命令有垃圾產(chǎn)生江解,則在同一個(gè)RUN命令中把它清理掉。
- 可以在下面網(wǎng)站編寫徙歼,它會(huì)檢查是否可以優(yōu)化:https://www.fromlatest.io/#/犁河。
- COPY命令可以把Dorckerfile同一級(jí)目錄/文件拷貝到容器image鳖枕。
- 安裝程序的命令添加選項(xiàng)禁止安裝推薦的軟件包,eg: apt-get install -y --no-install-recommends wget.
Docker容器和本地電腦拷貝文件/目錄
容器到本地:
docker cp container_name:/path/to/file .
本地到容器:
docker cp /path/to/file container_name:/dest/path
查詢Docker信息
docker info
注1:此命令可以查詢很多docker信息桨螺,包括docker虛擬機(jī)運(yùn)行時(shí)使用的代理參數(shù)等耕魄。
注2:如果是在內(nèi)網(wǎng)使用,需要配置docker代理彭谁,Ubuntu 14.04是在 /etc/defaults/docker中配置export https_proxy=https://user:pass@proxyurl.com:8080/ 以及 http_proxy的代理吸奴,然后重啟docker服務(wù):sudo service docker restart。
保存Docker image(持久化Docker鏡像)
docker save image_name -o file_path
把一個(gè)當(dāng)前未在運(yùn)行的docker image保存到文件缠局。
加載Docker image
docker load -i file_path
加載Docker鏡像则奥。