Docker基本概念和操作

Docker基本概念

Docker是一個能夠把開發(fā)的應(yīng)用程序自動部署到容器的開源引擎。相比虛擬機,容器更加輕量級,因為它直接調(diào)用OS接口,而不是運行一個虛擬機。通過容器,可以很容易的獲得一個完整的程序運行環(huán)境,我們可以用它來開發(fā)或者學(xué)習(xí)。
簡單來說,如果使用Windows,希望用一個Linux環(huán)境來做一些事情,那么現(xiàn)在可以不用虛擬機了(不用安裝VMWare或VirtualBox),也可以不用Vagrant,而是直接運行一個Docker容器就可以了。

Docker客戶端和服務(wù)器

Docker是C/S架構(gòu)的程序。用戶在Docker客戶端執(zhí)行命令,客戶端向服務(wù)器發(fā)起請求,服務(wù)器處理并返回結(jié)果,最終結(jié)果顯示到客戶端。

鏡像(Image)

Image包含了一個基本的OS(比如Ubuntu)和應(yīng)用需要的運行環(huán)境(即文件系統(tǒng)),這些文件系統(tǒng)中的文件可能是存在于多個layer的,最終呈現(xiàn)結(jié)果是這些layer的疊加結(jié)果。
通過Dockerfile可以構(gòu)建一個Image,Dockerfile定義了使用的base操作系統(tǒng),和一系列操作,比如RUN執(zhí)行命令,或者COPY把 Dockerfile同一級目錄的其他文件拷貝到Image中。每個命令的執(zhí)行都會產(chǎn)生一個新的Layer。
底層的Layer實際上是無法被修改的,所以不要期待后面的刪除命令可以讓Image的size變小。要減小size,只能是執(zhí)行命令讓size變大后的同一個RUN命令中,刪除不需要的垃圾,避免垃圾留在某一個layer中。
Image運行時,除了Image中包含的若干Layer,還在最上面有一個可寫的Layer。運行環(huán)境中的操作,都體現(xiàn)在可寫的Layer上。如果用docker commit提交,可以產(chǎn)生一個新的鏡像。

Rigistry

Docker用Rigistry來保存用戶構(gòu)建的鏡像,Docker公司運營的Rigistry叫Docker Hub。用戶可以在Docker Hub上注冊賬號,從而發(fā)布自己構(gòu)建的鏡像。而且,還可以在github上建立一個git倉,放入Dockerfile,然后在Docker Hub上創(chuàng)建一個自動構(gòu)建項目,關(guān)聯(lián)到上述github倉,則可以在git倉有更新時,自動觸發(fā)構(gòu)建。這種方式,可以非常有效的規(guī)避網(wǎng)絡(luò)不穩(wěn)定帶來的本地構(gòu)建鏡像的問題,比如apt-get安裝程序失敗。

容器(Container)

容器提供了程序的運行環(huán)境,把Image運行起來,就是一個容器。

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|

運行Image

docker run -i -t image-name /bin/bash

注1:-i表示交互式,-t表示啟動一個終端,/bin/bash表示啟動后運行一個交互式shell。
注2: image-name可以用上面查詢出的repository:tag表示(沒有沖突時用repository也行),或者用image id。
注3:執(zhí)行某個image時,如果該image還未下載,則會自動下載。當(dāng)然也可以先執(zhí)行docker pull image-name下載。
注4:如果沒有本地Image,可以在Docker Hub查找需要的image運行。

查看Docker容器

docker ps

注1:不帶參數(shù)查詢正在運行的docker容器。
注2:帶-a參數(shù)查看所有docker容器。
注3:帶-l -q參數(shù)查看最近退出的docker容器id。

重新進入正在運行的Docker容器命令行

方法一:重新附著到容器
docker attach container_name
方法二:在容器內(nèi)開啟一個執(zhí)行交互命令的進程
docker exec -t -i container_name /bin/bash

查看運行的Docker容器的統(tǒng)計信息

docker stats

停止容器

docker stop container_name

注1:容器名稱可以用容器ID。
注2:如果不是deamon形式的容器,交互式shell退出時容器也退出了。

刪除容器

docker rm container_id

刪除鏡像

docker rmi image_id

提交修改的鏡像

docker commit container_id image_name

注:修改后會產(chǎn)生一個新的Layer。

用Dockerfile構(gòu)建鏡像

docker build -t docker_image_tag .

Dockerfile編寫注意

  1. 每個RUN命令,都會產(chǎn)生一個Layer,所以一個命令有垃圾產(chǎn)生,則在同一個RUN命令中把它清理掉。
  2. 可以在下面網(wǎng)站編寫,它會檢查是否可以優(yōu)化:https://www.fromlatest.io/#/
  3. COPY命令可以把Dorckerfile同一級目錄/文件拷貝到容器image。
  4. 安裝程序的命令添加選項禁止安裝推薦的軟件包,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虛擬機運行時使用的代理參數(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
把一個當(dāng)前未在運行的docker image保存到文件。

加載Docker image

docker load -i file_path
加載Docker鏡像。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容