鏡像
獲取鏡像
docker pull
拉取鏡像
格式: docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標簽]
- Docker Registry 地址:
<域名/IP>[:端口號]
, 默認地址為Docker Hub - 倉庫名:用戶名/軟件名,在Docker Hub上管行,如果不寫用戶名厨埋,則默認為library(官方鏡像)
docker run
以鏡像啟動并運行一個容器
格式:docker run [選項] 鏡像標識 [啟動后要執(zhí)行命令] [參數...]
eg: docker run -it --rm -p 4000:80 ubuntu:18.04 bash
eg: docker run -it --rm -p 4000:80 ubuntu:18.04 ls
eg: docker run -d --rm -p 4000:80 ubuntu:18.04 ls
-
選項:
-
-it
:這是兩個參數,-t 選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上捐顷, -i 則讓容器的標準輸入保持打開荡陷。我們這里打算進入 bash 執(zhí)行一些命令并查看返回結果雨效,因此我們需要交互式終端。最后通過exit
退出废赞,如果沒有這個參數徽龟,則CRTL+C
退出 -
--rm
:容器退出后隨之將其刪除。 -
-d
:后臺守護運行 -
-p
:將容器內的端口與主機綁定唉地,將容器的80端口綁定到主機4000上 - 鏡像標識:可以是鏡像的名字+版本號据悔,也可以是鏡像的ID,如果沒有版本號耘沼,則默認是:latest版本
-
如果是鏡像的名字屠尊,并且本地沒有,則會默認先執(zhí)行docker pull將鏡像下載再啟動耕拷。
鏡像查詢
列出鏡像
docker images
或者docker image ls
列表中只會顯示頂層鏡像讼昆,一般來說這些信息就夠了
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python 2.7-slim 99079b24ed51 12 days ago 120MB
node 10.15.1 8fc2110c6978 2 weeks ago 897MB
<none> <none> 7b25fb2216b1 2 days ago 1.08GB
nginx latest f09fe80eb0e7 2 weeks ago 109MB
倉庫名
、標簽
骚烧、鏡像ID
浸赫、創(chuàng)建時間
和鏡像體積
列表上鏡像體積總和并非所有鏡像實際硬盤消耗空間。因為docker鏡像是多層存儲赃绊,可以繼承和復用既峡,所以不同鏡像可能使用相同的基礎鏡像,也就是共同層碧查。
查看鏡像占用空間
docker system df
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 9 2 1.895GB 1.663GB (87%)
Containers 2 0 2B 2B (100%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
虛懸鏡像(dangling image)
一個特殊的鏡像运敢,這個鏡像既沒有倉庫名,也沒有標簽忠售,均為 <none>传惠。
上面列表中的:
<none> <none> 7b25fb2216b1 2 days ago 1.08GB
這個鏡像原本是有鏡像名和標簽,出現這種情況的原因:
- 隨鏡像維護稻扬,發(fā)布新版本后卦方,重新
docker pull
時,這個鏡像名被轉移到新下載的鏡像上泰佳,舊的鏡像名稱則被取消 -
docker build
時盼砍,由于新舊鏡像同名,舊鏡像的名稱則被取消了
專門過濾查詢
docker images -f dangling=true
$ docker images -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 7b25fb2216b1 2 days ago 1.08GB
一般來說逝她,虛懸鏡像已經失去了存在的價值浇坐,是可以隨意刪除的,可以用docker image prune
刪除黔宛。
中間層鏡像
默認的docker image ls
或者docker images
列表中只會顯示頂層鏡像近刘,如果希望顯示包括中間層鏡像在內的所有鏡像的話,需要加 -a 參數。
$ docker images -a
這樣會看到很多無標簽的鏡像跌宛,與之前的虛懸鏡像不同酗宋,這些無標簽的鏡像很多都是中間層鏡像,是其它鏡像所依賴的鏡像疆拘。這些無標簽鏡像不應該刪除蜕猫,否則會導致上層鏡像因為依賴丟失而出錯
過濾查詢鏡像
docker images [參數或者條件]
- 根據倉庫名列出鏡像
$ docker images ubuntu
- 列出特定的某個鏡像,也就是說指定倉庫名和標簽
$ docker image ls ubuntu:18.04
- 過濾器參數
--filter
或者-f
- 查詢虛懸鏡像:
-f dangling=true
- 查詢在某個鏡像建立之后的鏡像:
-f since=ubuntu:18.04
- 之前:
-f before=ubuntu:18.04
- 如果鏡像構建時哎迄,定義了
LABEL
回右,還可以通過LABEL
來過濾:label=com.example.version=0.1
- 查詢虛懸鏡像:
輸出格式
- 只輸出鏡像ID
$ docker images -q
5f515359c7f8
05a60462f8ba
fe9198c04d62
- 自定義輸出
# 包含鏡像ID和倉庫名
$ docker image ls --format "{{.ID}}: {{.Repository}}"
05a60462f8ba: nginx
00285df0df87: <none>
f753707788c5: ubuntu
f753707788c5: ubuntu
1e0c3dd64ccd: ubuntu
# 以表格等距顯示,并且有標題行漱挚,和默認一樣翔烁,不過自己定義列:
$ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
IMAGE ID REPOSITORY TAG
05a60462f8ba nginx latest
00285df0df87 <none> <none>
f753707788c5 ubuntu 18.04
f753707788c5 ubuntu latest
刪除本地鏡像
docker image rm
或者docker rmi
格式:docker image rm [選項] <鏡像標識1> [<鏡像標識2> ...]
鏡像標識: 鏡像ID,倉庫名:標簽旨涝,鏡像摘要(太麻煩了蹬屹,這個不常用)
刪除行為
- Untagged 刪除當前指向的標簽,因為同一個鏡像有多個標簽白华,當刪除所指定的標簽后慨默,可能別的標簽指向了這個鏡像,這是不會刪除
- Deleted 真正刪除
組合批量刪除
# 刪除倉庫名為node的所有標簽鏡像
$ docker image rm $(docker image ls -q node)
# 刪除創(chuàng)建ubuntu:18.04之前的所有
$ docker image rm $(docker image ls -q -f before=ubuntu:18.04)
鏡像保存
類似于git commit
弧腥,不過一般不會使用厦取,而是用寫Dockerfile的形式生成。因為通過commit
生成的管搪,會把每一層的操作都記錄下來虾攻,包括一些不必要的操作,最后可能會導致鏡像臃腫更鲁。
格式:docker commit [選項] <容器ID或者容器名> [倉庫名[:標簽]]
eg: docker commit --auhtor "XXX@xxx.com" --message "修改了什么" server nginx:test
用Dockerfile定制鏡像
Dockerfile 是一個文本文件霎箍,其內包含了一條條的指令(Instruction),每一條指令構建一層岁经,因此每一條指令的內容朋沮,就是描述該層應當如何構建。
- 在一個空白目錄中缀壤,建立一個文本文件,命名為
Dockerfile
- Dockerfile內容為:
FROM nginx
RUN echo '<h1>hello world!</h1>' > /usr/share/nginx/html/index.html
- 構建鏡像
格式:docker build [選項] <上下文路徑或者URL或者tar壓縮包>
eg: docker build -t nginx:test1 .
以當前目錄為上下文構建名為nginx:test1的鏡像
eg: docker build https://github.com/twang2218/gitlab-ce-zh.git#:11.1
這行命令指定了構建所需的 Git repo纠亚,并且指定默認的 master 分支塘慕,構建目錄為 /11.1/,然后 Docker 就會自己去 git clone 這個項目蒂胞、切換到指定分支图呢、并進入到指定目錄后開始構建。
eg: docker build http://server/context.tar.gz
如果所給出的 URL 不是個 Git repo,而是個 tar 壓縮包蛤织,那么 Docker 引擎會下載這個包赴叹,并自動解壓縮,以其作為上下文指蚜,開始構建乞巧。
上下文: 構建鏡像時的基礎目錄,所有的構建所需文件都不能在這個上下文目錄之外摊鸡,在構建時會將上下文中的所有文件打包(除了
.dockerignore
中忽略的)绽媒,同時在Dockerfile中的命令的默認相對路徑會以這個上下文路徑為基礎,當然也不能超出這個目錄默認讀取的是當前執(zhí)行命令的路徑下名為
Dockerfile
的文件免猾,也可以手動指定-f ../node.Dockerfile
容器
容器是獨立運行的一個或一組應用是辕,以及它們的運行態(tài)環(huán)境。
容器啟動
新建并啟動
docker run
命令猎提,在獲取鏡像里面有获三,就不單說了
啟動時的流程:
- 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
- 利用鏡像創(chuàng)建并啟動一個容器
- 分配一個文件系統(tǒng)锨苏,并在只讀的鏡像層外面掛載一層可讀寫層
- 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
- 從地址池配置一個 ip 地址給容器
- 執(zhí)行用戶指定的應用程序
- 執(zhí)行完畢后容器被終止
啟動已經終止的容器
格式:docker container start [選項] 容器標識1 [容器標識2...]
守護態(tài)運行
后臺運行
增加參數-d
eg: docker run -d nginx
使用了-d
命令后疙教,容器會在后臺運行并不會把輸出的結果 (STDOUT) 打印到宿主機上面(輸出結果可以用docker logs
查看)。
docker container logs [容器ID或者容器名]
查看容器信息
docker container ls
守護態(tài)運行
容器是否會一直運行蚓炬,與docker run
指定的命令有關松逊,和-d
無關
eg:
# 不會一直運行的
$ docker run -d ubuntu:18.04 ls
b64f8e71882d26cffa34453284b40f73cbdc66054cd8a0ba79cb73092dc76726
$ docker logs b64f8e71882d26cffa34453284b40f73cbdc66054cd8a0ba79cb73092dc76726
bin
boot
dev
etc
...
# node index.js 是啟一個服務,所以會保持運行在后臺肯夏,如果沒有-d就是保持運行在前臺
$ docker run -d node node index.js
終止容器
除了在容器中關閉運行的應用來關閉容器外经宏,也可以使用docker container stop
來終止,用戶通過 exit 命令或 Ctrl+d 來退出終端時驯击,所創(chuàng)建的容器立刻終止烁兰。
格式:docker container stop 容器標識
終止狀態(tài)的容器可以用 docker container ls -a 命令看到
重新啟動終止態(tài)容器
docker container start
啟動處于終止狀態(tài)的容器
重啟容器
docker container restart
會將一個運行態(tài)的容器終止,然后再重新啟動它徊都。
進入容器
在使用 -d 參數時沪斟,容器啟動后會進入后臺。
某些時候需要進入容器進行操作暇矫,包括使用docker attach
命令或docker exec
命令主之,推薦使用 docker exec 命令
因為在attach
中,使用exit
會導致容器停止李根,而exec
不會
$ docker run -dit ubuntu
39ee1ddf67b9819fca8bbe71e15a131a6f4df18efabd229d199dabc744ce5be5
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39ee1ddf67b9 ubuntu:18.04 "/bin/bash" 36 seconds ago Up 35 seconds elegant_lumiere
# 沒有-t時槽奕,沒有分配偽終端,但是命令執(zhí)行結果任然可以返回
$ docker exec -i 39ee1ddf67b9 bash
$ ls
bin
boot
dev
...
# 分配了偽終端
$ docker exec -it 39ee1ddf67b9 bash
root@39ee1ddf67b9:/#
容器的導入和導出
導出容器
導出容器快照
docker export
eg:
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:18.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
$ docker export 7691a814370e > ubuntu.tar
導入容器
從容器快照中導入為鏡像
docker import
eg:
$ cat ubuntu.tar | docker import - test/ubuntu:test1
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu test1 9d37a6082e97 About a minute ago 171.3 MB
此外房轿,也可以通過指定 URL 或者某個目錄來導入
docker import http://example.com/exampleimage.tgz example/imagerepo
用戶既可以使用docker load
來導入鏡像存儲文件到本地鏡像庫粤攒,也可以使用docker import
來導入一個容器快照到本地鏡像庫所森。這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態(tài)),而鏡像存儲文件將保存完整記錄夯接,體積也要大焕济。此外,從容器快照文件導入時可以重新指定標簽等元數據信息盔几。
刪除容器
刪除終止狀態(tài)的容器
docker container rm
$ docker container rm test
test
如果需要刪除運行中的容器晴弃,需要加一個-f
的參數
清理所有處于終止狀態(tài)的容器
docker container prune
容器間通信
新建網絡
$ docker network create -d bridge web
a0ff52c9783cf21da40c2c62ed81765d165658e591b04f7e1c139fe689f4fe9e
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
a0ff52c9783c web bridge local
創(chuàng)建一個名為web的網絡
-d
指定網絡類型,有bridge
和overlay
问欠。其中overlay
用于Swarm mode
將容器連接到網絡上
運行一個容器并連接到新建的網絡上
$ docker run -it --rm --name node1 --network web node sh
再開一個新終端
$ docker run -it --rm --name node2 --network web node sh
再開一個終端
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2b50d6261a7 node "node" 26 seconds ago Up 25 seconds node2
da2b12415ff8 node "node" About a minute ago Up About a minute node1
連接測試
在node1中
$ ping node2
PING node2 (172.25.0.3) 56(84) bytes of data.
64 bytes from node2.web (172.25.0.3): icmp_seq=1 ttl=64 time=0.148 ms
64 bytes from node2.web (172.25.0.3): icmp_seq=2 ttl=64 time=0.168 ms
在node2中
$ ping node1
PING node1 (172.25.0.2) 56(84) bytes of data.
64 bytes from node1.web (172.25.0.2): icmp_seq=1 ttl=64 time=0.199 ms
64 bytes from node1.web (172.25.0.2): icmp_seq=2 ttl=64 time=0.174 ms
Docker Compose
通過一個單獨的 docker-compose.yml 模板文件(YAML 格式)來定義一組相關聯的應用容器為一個項目(project)
Compose 中有兩個重要的概念:
服務 (service):一個應用的容器肝匆,實際上可以包括若干運行相同鏡像的容器實例。
項目 (project):由一組關聯的應用容器組成的一個完整業(yè)務單元顺献,在 docker-compose.yml 文件中定義旗国。
Compose 的默認管理對象是項目,通過子命令對項目中的一組容器進行便捷地生命周期管理注整。
基礎使用
web應用
新建文件夾能曾,在其中創(chuàng)建server.js
const http = require('http')
const app = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' })
console.log(`<h1>【${req.method}】: ${req.url}</h1>`)
const resText = `<h1>【${req.method}】: ${req.url}</h1>`
res.end(resText)
})
app.listen(4000)
Dockerfile
FROM node
ADD . /web
WORKDIR /web
RUN npm config set registry http://registry.npm.taobao.org/ \
&& npm install
CMD ["node", "./server.js"]
docker-compose.yml
version: "3"
services:
web:
container_name: web
build:
context: ./
dockerfile: Dockerfile
port:
- "4001:4000"
運行compose
$ docker-compose up
Compose 命令
命令格式
$ docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
命令選項
-f, --file
指定使用的Compose模板文件,默認為當前目錄的docker-compose.yml肿轨,可以多次指定-p, --project-name
指定項目別名寿冕,默認將使用所在目錄名稱作為項目名--x-networking
使用Docker的可拔插網絡后端特性--x-network-driver
指定網絡后端的驅動,默認為bridge
--verbose
輸出更多調試信息-v, --version
打印版本并退出
相關命令使用
build
格式:docker-compose build [options] [SERVICE...]
構建(重新構建)項目中的服務容器椒袍。
服務容器一旦構建后驼唱,將會帶上一個標記名
可以隨時在項目目錄下運行 docker-compose build 來重新構建服務。
選項:
--force-rm
刪除構建過程中的臨時容器--no-cache
構建鏡像過程中不使用cache(會使構建過程時間變長)--pull
始終嘗試通過pull來獲取更新版本的鏡像
config
驗證 Compose 文件格式是否正確驹暑,若正確則顯示配置玫恳,若格式錯誤顯示錯誤原因。
down
此命令將會停止 up 命令所啟動的容器优俘,并移除網絡
exec
進入指定的容器京办。
images
列出 Compose 文件中包含的鏡像。
kill
格式:docker-compose kill [options] [SERVICE...]
logs
格式:docker-compose logs [options] [SERVICE...]
查看服務容器的輸出帆焕。默認情況下惭婿,docker-compose 將對不同的服務輸出使用不同的顏色來區(qū)分∫侗ⅲ可以通過--no-color
來關閉顏色财饥。
pause
格式:docker-compose pause [SERVICE...]
暫停一個服務容器。
ps
格式:docker-compose ps [options] [SERVICE...]
列出項目中目前的所有容器折晦。
選項:
-
-q
只打印容器的 ID 信息佑力。
pull
格式:docker-compose pull [options] [SERVICE...]
拉取服務依賴的鏡像
選項:
-
--ignore-pull-failures
忽略拉取鏡像過程中的錯誤。
push
推送服務依賴的鏡像到 Docker 鏡像倉庫筋遭。
restart
格式:docker-compose restart [options] [SERVICE...]
重啟項目中的服務
選項:
-
-t, --timeout
指定重啟前停止容器的超時(默認為10秒)
rm
格式:docker-compose rm [options] [SERVICE...]
刪除所有(停止狀態(tài)的)服務容器。推薦先執(zhí)行 docker-compose stop 命令來停止容器。
選項:
-
-f, --force
強制直接刪除漓滔,包括非停止狀態(tài)的容器编饺。一般盡量不要使用該選項。 -
-v
刪除容器所掛載的數據卷
run
格式:docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服務上執(zhí)行一個命令响驴。
eg:
$ docker-compose run ubuntu ping www.baidu.com
默認情況下透且,如果存在關聯,則所有關聯的服務將會自動被啟動豁鲤,除非這些服務已經在運行中秽誊。
如果不希望自動啟動關聯的容器,可以使用 --no-deps 選項,將不會啟動 web 容器所關聯的其它容器琳骡。
$ docker-compose run --no-deps web python manage.py shell
該命令類似啟動容器后運行指定的命令锅论,相關卷、鏈接等等都將會按照配置自動創(chuàng)建楣号。
與啟動容器后運行指定的命令不同點:
給定命令將會覆蓋原有的自動運行命令最易;
不會自動創(chuàng)建端口,以避免沖突蜈七。
選項:
-d
后臺運行容器--name
為容器起一個別名--entrypoint
覆蓋默認的容器啟動指令(CMD)-e KEY=VAL
設置環(huán)境變量值般堆,可多次使用選項設置多個環(huán)境-u, --user=""
指定運行容器的用戶名或者uid--no-deps
不自動啟動關聯的服務容器--rm
運行命令后自動刪除容器镀琉,-d
模式下忽略-p, --publish=[]
映射容器端口到本地主機--service-ports
配置服務端口并映射到本地主機
scale
格式:docker-compose scale [options] [SERVICE=NUM...]
設置指定服務運行的容器個數。
通過 service=num 的參數來設置數量嬉荆。
eg:
$ docker-compose scale web=3 db=2
將啟動 3 個容器運行 web 服務,2 個容器運行 db 服務酷含。
一般的鄙早,當指定數目多于該服務當前實際運行容器,將新創(chuàng)建并啟動容器第美;反之蝶锋,將停止容器。
選項:
-
-t, --timeout
停止容器時候的超時(默認10秒)
start
格式:docker-compose start [SERVICE...]
啟動已經存在的服務容器什往。
stop
格式:docker-compose stop [options] [SERVICE...]
停止已經處于運行狀態(tài)的容器扳缕,但不刪除它。通過 docker-compose start 可以再次啟動這些容器别威。
選項:
-
-t
同上
top
查看各個服務容器內運行的進程
unpause
格式:docker-compose unpause [SERVICE...]
恢復處于暫停狀態(tài)中的服務躯舔。
up
格式:docker-compose up [options] [SERVICE...]
該命令十分強大,它將嘗試自動完成包括構建鏡像省古,(重新)創(chuàng)建服務粥庄,啟動服務,并關聯服務相關容器的一系列操作豺妓。
鏈接的服務都將會被自動啟動惜互,除非已經處于運行狀態(tài)。
可以說训堆,大部分時候都可以直接通過該命令來啟動一個項目。
默認情況膘流,docker-compose up
啟動的容器都在前臺,控制臺將會同時打印所有容器的輸出信息鲁沥,可以很方便進行調試呼股。
當通過Ctrl-C
停止命令時,所有容器將會停止彭谁。
如果使用docker-compose up -d
,將會在后臺啟動并運行所有的容器马靠。一般推薦生產環(huán)境下使用該選項。
默認情況蔼两,如果服務容器已經存在甩鳄,docker-compose up
將會嘗試停止容器额划,然后重新創(chuàng)建(保持使用volumes-from
掛載的卷)妙啃,以保證新啟動的服務匹配docker-compose.yml
文件的最新內容俊戳。如果用戶不希望容器被停止并重新創(chuàng)建,可以使用docker-compose up --no-recreate
抑胎。這樣將只會啟動處于停止狀態(tài)的容器,而忽略已經運行的服務铭拧。如果用戶只想重新部署某個服務,可以使用docker-compose up --no-deps -d <SERVICE_NAME>
來重新創(chuàng)建服務并后臺停止舊服務搀菩,啟動新服務破托,并不會影響到其所依賴的服務肪跋。
選項:
-d
在后臺運行服務容器--no-color
不使用顏色來區(qū)分不同的服務的控制臺輸出--no-deps
不啟動服務所鏈接的容器--force-recreate
強制重新創(chuàng)建容器土砂,不能與--no-recreate
同時使用--no-recreate
如果容器已經存在谜洽,則不重新創(chuàng)建易桃,不能與--force-recreate
同時使用--no-build
不自動構建缺失的服務鏡像-t, --timeout
同上
version
格式:docker-compose version
打印版本信息