在日常工作中常常會(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基本概念
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 pull或docker run命令時(shí),會(huì)從配置過(guò)的registry中拉下相應(yīng)的鏡像;當(dāng)使用docker push命令時(shí),鏡像會(huì)被推送到配置過(guò)的registry中。

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