Docker快速入門(mén)

在日常工作中常常會(huì)用到docker,在這里整理一些docker的基本概念和操作,以及一些簡(jiǎn)單的使用心得。

本文主要內(nèi)容翻譯自官方文檔;部分內(nèi)容來(lái)源于網(wǎng)絡(luò)資料,在文末列出。

Docker簡(jiǎn)介

Docker 是一個(gè)開(kāi)源的容器引擎,而一個(gè)容器其實(shí)是一個(gè)虛擬化的獨(dú)立的環(huán)境,因此開(kāi)發(fā)者可以將應(yīng)用打包到這樣的一個(gè) docker 容器中,然后發(fā)布到任何可以運(yùn)行 docker 容器的機(jī)器中,實(shí)現(xiàn)一次打包多處部署,解決了因?yàn)榄h(huán)境問(wèn)題而導(dǎo)致的部署難題。
Docker容器本質(zhì)上是宿主機(jī)的進(jìn)程,Docker通過(guò)namespace實(shí)現(xiàn)了資源隔離,通過(guò)cgroups實(shí)現(xiàn)了資源限制,通過(guò)寫(xiě)時(shí)復(fù)制機(jī)制(copy-on-write)實(shí)現(xiàn)了高效的文件操作。


Docker和虛擬機(jī)的區(qū)別

Docker基本概念

Docker daemon
Docker使用一個(gè)C/S架構(gòu),Docker client會(huì)使用REST API與本地或遠(yuǎn)程的Docker daemon通信。Docker daemon (dockerd) 聽(tīng)取Docker API的請(qǐng)求,并管理鏡像、容器、網(wǎng)絡(luò)和卷等。

Docker client
Docker client (docker)是許多Docker用戶(hù)與Docker交互的主要方式。當(dāng)用戶(hù)使用諸如docker run等命令時(shí),client會(huì)將這些命令發(fā)送給dockerd來(lái)執(zhí)行。 一個(gè)client可以與多個(gè)daemon通信。

Docker image
一個(gè)鏡像(image)是一個(gè)只讀模板,提供建立容器的說(shuō)明。通常來(lái)說(shuō),一個(gè)鏡像是在另一個(gè)鏡像的基礎(chǔ)上添加修改制作的。因此鏡像會(huì)有分層結(jié)構(gòu)。
可以通過(guò)兩種不同的方式制作一個(gè)鏡像:

  • 使用docker commit命令將容器提交為鏡像;
  • 使用docker build命令,通過(guò) Dockerfile 來(lái)創(chuàng)建鏡像

Docker container
一個(gè)容器(container)是一個(gè)鏡像的可執(zhí)行實(shí)例。你可以通過(guò)Docker API或者CLI創(chuàng)建(create)、啟動(dòng)(start)、停止(stop)及刪除(delete)容器。你也可以從容器當(dāng)前的狀態(tài)中創(chuàng)建一個(gè)鏡像。
默認(rèn)條件下,容器之間以及容器和宿主機(jī)之間是相對(duì)獨(dú)立的。一個(gè)容器由其鏡像和其它的配置選項(xiàng)所決定。

Docker registry
Docker registry(比如Docker Hub)可以理解為一個(gè)托管服務(wù),用于存儲(chǔ)Docker鏡像。Docker也會(huì)主動(dòng)從Docker Hub中尋找鏡像。你也可以運(yùn)行你自己的私有registry。當(dāng)你使用docker pulldocker run命令時(shí),會(huì)從配置過(guò)的registry中拉下相應(yīng)的鏡像;當(dāng)使用docker push命令時(shí),鏡像會(huì)被推送到配置過(guò)的registry中。

Docker架構(gòu)

Docker基本操作

鏡像操作

  • 搜索并下載鏡像:
    docker search IMAGE_NAME
    docker pull IMAGE_NAME
    -上傳鏡像:
    docker push IMAGE_NAME
  • 查看現(xiàn)有鏡像:
    docker image ls / docker images

容器操作

  • 通過(guò)鏡像創(chuàng)建容器并運(yùn)行(如果本地沒(méi)有鏡像,則會(huì)自動(dòng)去registry中尋找并下載):
    docker run [OPTIONS] IMAGE_NAME [COMMAND] [ARG...]
    例如:docker run -i -t ubuntu --name myContainer /bin/bash
    其中:-i 選項(xiàng)表示使用交互模式,始終保持輸入流開(kāi)放;-t 選項(xiàng)表示分配一個(gè)偽終端;--name NAME 選項(xiàng)指定啟動(dòng)的容器的名字
    其他常用選項(xiàng):
    -e 選項(xiàng):用于指定容器運(yùn)行時(shí)的環(huán)境變量
    -v 選項(xiàng):用于掛載一個(gè)volume
    -p 選項(xiàng):用于將容器的端口暴露給宿主機(jī)的端口,通過(guò)端口映射,實(shí)現(xiàn)從外部通過(guò)宿主機(jī)的端口來(lái)訪問(wèn)容器內(nèi)部的應(yīng)用,常用格式為hostPort:contianerPort
  • 查看運(yùn)行中的(或者所有的)容器:
    docker ps [-a]
  • 啟動(dòng)一個(gè)容器:
    docker start CONTAINER_ID
  • 將標(biāo)準(zhǔn)輸入輸出錯(cuò)誤流附著到運(yùn)行中的容器:
    docker attach CONTAINER_ID
  • 在另一個(gè)終端接入運(yùn)行中的容器:
    docker exec -it CONTAINER_ID /bin/bash
  • 終止一個(gè)容器:
    docker stop CONTAINER_ID
  • 移除一個(gè)容器:
    docker rm CONTAINER_ID
  • 將容器提交為一個(gè)鏡像:
    docker commit CONTAINER_ID
  • 主機(jī)與容器之間文件拷貝:
    docker cp CONTAINER_ID:/path/to/source /path/to/dest
    docker cp /path/to/source CONTAINER_ID:/path/to/dest
  • 修改容器名字:
    docker rename OLD_NAME NEW_NAME

其他

  • Docker容器會(huì)使用主機(jī)的內(nèi)核,因此對(duì)于一些依賴(lài)于內(nèi)核版本的程序,不能安裝至docker中。
  • 如果需要在宿主機(jī)環(huán)境中打開(kāi)一些可視化窗口,可以使用xhost +命令來(lái)允許docker里面的進(jìn)程使用Xserver。

參考

https://www.cnblogs.com/zhangxingeng/p/11236968.html
https://www.cnblogs.com/didda/p/5453032.html
https://www.cnblogs.com/zingp/p/8746449.html
https://cloud.tencent.com/developer/article/1108108

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

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