# 鏡像操作
docker images
列出docker本地鏡像docker search [鏡像名]
從網(wǎng)絡(luò)中搜索鏡像,我們可以制作一個鏡像上傳到docker hub上,然后通過這個命令就能搜索出來
參數(shù):
-s 列出關(guān)注度大于某個值的鏡像,如:docker search -s 100 centos;
--no-trunc 列出docker search命令搜索到的鏡像的詳細信息docker pull [鏡像名]:[標(biāo)簽]
從docker hub上拉去鏡像docker rmi [鏡像名]:[標(biāo)簽] 或者 docker rm [鏡像ID]
刪除單個鏡像docker rmi
docker images -q
刪除本地所有鏡像(反單引號docker images -q:查看本地所有鏡像ID)
# 容器操作
如果想從容器中回到宿主機,而又不停止容器可以使用快捷鍵:ctrl q p
docker ps
列出所有正在運行的容器docker ps -a
列出所有容器docker ps -l
列出最后一次運行的容器docker ps -f status=[狀態(tài)]
列出所有符合條件的容器:如:docker ps -f status=exited,列出所有已停止的容器docker run [選項] 鏡像:標(biāo)簽
創(chuàng)建容器
選項:
-i 表示交互式運行容器(就是創(chuàng)建容器后馬上啟動容器并進入容器)通常與-t選項一起用。
-t 啟動后會進入其容器的命令行,通常與-i同時使用,使用-it兩個選項后,容器創(chuàng)建就能登錄進去,即分配一個偽終端。
--name 為創(chuàng)建的容器指定一個名字
-d 創(chuàng)建一個守護式容器在后臺運行,并返回容器ID,這樣創(chuàng)建容器后不會自動登錄容器,如果加-i選項,創(chuàng)建后就會運行容器。
-v 表示目錄映射,格式為:-p 宿主機目錄:容器目錄,注意:最好做目錄映射,在宿主機上修改然后共享到容器上。
-p 表示端口映射,格式為:-p 宿主機端口:容器端口exit
退出并停止容器,這個命令只能在容器命令行中操作,不能在宿主命令行中docker stop [鏡像名]:[標(biāo)簽] 或者 docker stop [鏡像ID]
在宿主機命令行退出某個容器docker stop
docker ps -a -q
停止所有容器,(其中反單引號docker ps -a -q,是查詢所有容器ID)docker start
docker ps -a -q
啟動所有容器,(其中反單引號docker ps -a -q,是查詢所有容器ID)
docker kill [鏡像名]:[標(biāo)簽] 或者 docker kill [鏡像ID]
在宿主機命令行退出某個容器,非正常停止docker exec -it 容器名|容器ID /bin/bash ('|'是或者)
進入某個已啟動的容器并打開命令行,注意通過exec進入的容器使用exit退出容器后是不會停止容器的docker cp 要拷貝的宿主機文件或目錄 容器ID:容器文件或目錄
將宿主機的文件或目錄復(fù)制到容器docker cp 容器ID:要拷貝的容器文件或目錄 宿主機文件或目錄
將容器的文件或目錄復(fù)制到宿主機docker run -id -v /宿主機絕對路徑目錄:/容器內(nèi)目錄 --name 容器名 鏡像名
我們可以在創(chuàng)建容器的時候,將主機的目錄與容器的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而去修改容器的文件,使用 -v 選項docker run -id -v /宿主機絕對路徑目錄:/容器內(nèi)目錄:ro --name 容器名 鏡像名
我們可以在創(chuàng)建容器的時候,將主機的目錄與容器的目錄進行容器端只讀映射,這樣我們就可以通過修改宿主機某個目錄的文件從而去修改容器的文件,而在容器中映射的目錄或文件權(quán)限為只讀,不能對文件做更改docker inspect 容器ID
查看容器的內(nèi)部信息,比如容器網(wǎng)關(guān)、IP地址、與宿主機的掛載信息、容器ID等docker rm 容器名稱|容器ID
移除一個非運行容器,不能移除正在運行的容器,需要先停止才能移除
# 實戰(zhàn)相關(guān)
將容器保存為鏡像(無目錄掛載)
docker commit [-m="提交的描述信息"] [-a="創(chuàng)建者"] 容器名|容器ID 生成的鏡像名[:標(biāo)簽名]
這里創(chuàng)建的鏡像會保存容器中的項目,這樣可以多處復(fù)用將容器打包成鏡像(有掛載目錄)
問題:如果docker對容器掛載了數(shù)據(jù)目錄,將容器打包為鏡像時,數(shù)據(jù)不會被打包到鏡像中
原因:因為宿主機與容器做了路徑映射,再commit一個新鏡像時,該路徑下的所有數(shù)據(jù)都會被拋棄,不會保存到新鏡像中,可通過docker inspect 鏡像名查看是否有目錄掛載。
解決:兩種方法
映射方法:先把宿主機的數(shù)據(jù)備份在某個目錄下,在docker run 的時候使用-v參數(shù)將宿主機上備份的數(shù)據(jù)目錄映射到容器里的目標(biāo)路徑中(如:tomcat是/usr/local/tomcat/webapps,mysql是 var/lib/mysql)
拷貝方法(推薦使用):先把在宿主機的數(shù)據(jù)備份在某個目錄下,在創(chuàng)建新容器后使用拷貝(docker cp ...)的方法將備份的數(shù)據(jù)復(fù)制進容器中(如:tomcat是/usr/local/tomcat/webapps,mysql是 var/lib/mysql)創(chuàng)建tomcat容器
下載tomcat鏡像(忽略);使用:docker run -id --name=my_tomcat -p 8888:8080 -v /usr/local/project:/usr/local/tomcat/webapps --privileged=true tomcat:8
解析:
docker run -id --name=my_tomcat: 是創(chuàng)建并啟動一個守護進程設(shè)置name為my_tomcat;
-p 8888:8080 做端口映射
-v /usr/local/project:/usr/local/tomcat/webapps 做目錄映射
--privileged=true 解決權(quán)限問題(又是不加會出錯,最好都加上)
tomcat:8 鏡像名:標(biāo)簽名怎樣將鏡像交給其它服務(wù)器使用?
首先,鏡像備份:docker save -o 包名.tar 鏡像名:鏡像標(biāo)簽,-o指定輸出到的文件
其次,數(shù)據(jù)備份:如果有掛載數(shù)據(jù),需要將掛載數(shù)據(jù)打包與鏡像包一起交給其它服務(wù)器使用,其它服務(wù)器通過鏡像包和數(shù)據(jù)包就可以恢復(fù)打包前的容器鏡像恢復(fù)與遷移:通過以上兩部我們可以將一個本地容器和數(shù)據(jù)打包交給其它服務(wù)器使用,接收到鏡像包和數(shù)據(jù)包的服務(wù)器怎樣恢復(fù)容器?
首先,鏡像恢復(fù):使用 docker load -i 鏡像包.bar 來獲取到鏡像文件,使用docker run ... 創(chuàng)建容器
其次,數(shù)據(jù)恢復(fù):使用接收到的數(shù)據(jù)包,來掛載或者使用 docker cp 將數(shù)據(jù)恢復(fù)到新建的容器中。
# dockfile
dockerfile 用于構(gòu)建一個新的Docker鏡像的腳本文件,是由一系列命令和參數(shù)構(gòu)成的腳本
構(gòu)建新鏡像的步驟:
- 編寫dockerfile文件
- 通過docker build命令生成新的鏡像
- 通過docker run命令運行
dockerfile常用命令:
FROM 鏡像名:標(biāo)簽名
RUN <命令行命令> | ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"],用于執(zhí)行后面跟著的命令行命令
COPY 復(fù)制指令,從宿主機目錄中復(fù)制文件或者目錄到容器里指定路徑。
格式如:COPY [--chown=<user>:<group>] <源路徑1>... <目標(biāo)路徑>
[--chown=<user>:<group>]:可選參數(shù),用戶改變復(fù)制到容器內(nèi)文件的擁有者和屬組。
<源路徑>:源文件或者源目錄,這里可以是通配符表達式,其通配符規(guī)則要滿足 Go 的 filepath.Match 規(guī)則
<目標(biāo)路徑>:容器內(nèi)的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動創(chuàng)建。ADD
ADD 指令和 COPY 的使用格式一致(同樣需求下,官方推薦使用 COPY)。功能也類似,不同之處如下:ADD 的優(yōu)點:在執(zhí)行 <源文件> 為 tar 壓縮文件的話,壓縮格式為 gzip, bzip2 以及 xz 的情況下,會自動復(fù)制并解壓到 <目標(biāo)路徑>。
ADD 的缺點:在不解壓的前提下,無法復(fù)制 tar 壓縮文件。會令鏡像構(gòu)建緩存失效,從而可能會令鏡像構(gòu)建變得比較緩慢。具體是否使用,可以根據(jù)是否需要自動解壓來決定。CMD
格式:CMD ["<可執(zhí)行文件或命令>","<param1>","<param2>",...]
類似于 RUN 指令,用于運行程序,但二者運行的時間點不同:
CMD 在docker run 時運行。
RUN 是在 docker build。
作用:為啟動的容器指定默認要運行的程序,程序運行結(jié)束,容器也就結(jié)束。CMD 指令指定的程序可被 docker run 命令行參數(shù)中指定要運行的程序所覆蓋。注意:如果 Dockerfile 中如果存在多個 CMD 指令,僅最后一個生效。ENTRYPOINT
格式:ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
類似于 CMD 指令,但其不會被 docker run 的命令行參數(shù)指定的指令所覆蓋,而且這些命令行參數(shù)會被當(dāng)作參數(shù)送給 ENTRYPOINT 指令指定的程序。 但是, 如果運行 docker run 時使用了 --entrypoint 選項,此選項的參數(shù)可當(dāng)作要運行的程序覆蓋 ENTRYPOINT 指令指定的程序。優(yōu)點:在執(zhí)行 docker run 的時候可以指定 ENTRYPOINT 運行所需的參數(shù)。注意:如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最后一個生效。 可以搭配 CMD 命令使用:一般是變參才會使用 CMD ,這里的 CMD 等于是在給 ENTRYPOINT 傳參。ENV
格式:ENV<key1>=<value1> <key2>=<value2>...
設(shè)置環(huán)境變量,定義了環(huán)境變量,那么在后續(xù)的指令中,就可以使用這個環(huán)境變量。ARG
格式:ARG <參數(shù)名>[=<默認值>]
構(gòu)建參數(shù),與 ENV 作用一至。不過作用域不一樣。ARG 設(shè)置的環(huán)境變量僅對 Dockerfile 內(nèi)有效,也就是說只有 docker build 的過程中有效,構(gòu)建好的鏡像內(nèi)不存在此環(huán)境變量。構(gòu)建命令 docker build 中可以用 --build-arg <參數(shù)名>=<值> 來覆蓋。VOLUME
格式:VOLUME ["<路徑1>", "<路徑2>"...] | VOLUME <路徑>
定義匿名數(shù)據(jù)卷。在啟動容器時忘記掛載數(shù)據(jù)卷,會自動掛載到匿名卷。作用:避免重要的數(shù)據(jù),因容器重啟而丟失,這是非常致命的。避免容器不斷變大。在啟動容器 docker run 的時候,我們可以通過 -v 參數(shù)修改掛載點。EXPOSE
格式:EXPOSE <端口1> [<端口2>...]
僅僅只是聲明端口。
作用:幫助鏡像使用者理解這個鏡像服務(wù)的守護端口,以方便配置映射。在運行時使用隨機端口映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的端口。WORKDIR
格式:WORKDIR <工作目錄路徑>
指定工作目錄。用 WORKDIR 指定的工作目錄,會在構(gòu)建鏡像的每一層中都存在。(WORKDIR 指定的工作目錄,必須是提前創(chuàng)建好的)。docker build 構(gòu)建鏡像過程中的,每一個 RUN 命令都是新建的一層。只有通過 WORKDIR 創(chuàng)建的目錄才會一直存在。USER
格式:USER <用戶名>[:<用戶組>]
用于指定執(zhí)行后續(xù)命令的用戶和用戶組,這邊只是切換后續(xù)命令執(zhí)行的用戶(用戶和用戶組必須提前已經(jīng)存在)。HEALTHCHECK
格式:
HEALTHCHECK [選項] CMD <命令>:設(shè)置檢查容器健康狀況的命令
HEALTHCHECK NONE:如果基礎(chǔ)鏡像有健康檢查指令,使用這行可以屏蔽掉其健康檢查指令
HEALTHCHECK [選項] CMD <命令> : 這邊 CMD 后面跟隨的命令使用,可以參考 CMD 的用法。
用于指定某個程序或者指令來監(jiān)控 docker 容器服務(wù)的運行狀態(tài)。ONBUILD
格式:ONBUILD <其它指令>
用于延遲構(gòu)建命令的執(zhí)行。簡單的說,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次構(gòu)建鏡像的過程中不會執(zhí)行(假設(shè)鏡像為 test-build)。當(dāng)有新的 Dockerfile 使用了之前構(gòu)建的鏡像 FROM test-build ,這是執(zhí)行新鏡像的 Dockerfile 構(gòu)建時候,會執(zhí)行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。MAINTAINER [user_name]
鏡像創(chuàng)建者的名稱以及郵箱