docker 筆記(部分)
- 查看docker的基本信息
docker version
docker info
docker image ls
//查看鏡像
docker image rm imageName
//刪除imageName
docker container run imageName
//run imageName(如果image imageName不存在會去拉取)
docker container ls -a
//查看所有container和其狀態(tài)
docker container stop containerName or ID
//stop container
docker container rm ID
//刪除container
docker container start ID
//運行一個創(chuàng)建了但是停掉了的container
docker container ps -aq
//列出所有container id
docker container stop $(docker container ps -aq)
//停止所有的container
不能直接刪除一個run 的container磨取,但是可以-f 強制刪除
容器的兩種模式:attached(前臺) detached(后臺)
docker image run -d -p 80:80 nginx
//后臺運行detach
docker attach id
//detach -->attach
docker container logs id
查看detach的 id的 logs
docker container logs -f id
// 動態(tài)跟蹤
- 交互:
docker exec -it ID sh(經(jīng)常用)
//進入一個正在運行的容器內(nèi)部shell
docker container run -it containerName sh
// 創(chuàng)建一個容器并且進入交互式模式
docker container top id
- docker container run -d --p 80:80 --name 容器別名 nginx
上面命令執(zhí)行的細(xì)節(jié):
1.在本地查找是否有nginx這個image鏡像遗增,但是沒有發(fā)現(xiàn)去遠程的image registry查找nginx鏡像(默認(rèn)的registry是Docker Hub)袄秩,而且下載最新版本的nginx鏡像 (nginx:latest 默認(rèn))
2.基于nginx鏡像來創(chuàng)建一個新的容器,并且準(zhǔn)備運行
3.docker engine分配給這個容器一個虛擬IP地址
4.在宿主機上打開80端口并把容器的80端口轉(zhuǎn)發(fā)到宿主機上
5.啟動容器,運行指定的命令(這里是一個shell腳本去啟動nginx)
- image獲取:
1.docker hub
docker image pull imageName:版本號/
/拉取image,版本號默認(rèn)為lasted
docker image inspect imageId
// 查看image詳細(xì)信息.
docker image rm id
(只有coantainer里面也rm 了才可以刪除,stop也不行,或者強制刪除)
2.離線導(dǎo)入導(dǎo)出
docker image save imagename -o filename
//將image導(dǎo)出為一個文件
docker image load -i filename
3.dockerfile
docker image build -f dockerfilename -t imageName:tag .
(.表示當(dāng)前目錄)
docekr image push userID/imageName:tag
//push自己的image到docker hub.
docker image pull userID/imageName:tage
//拉取user的版本為tag的image到本地.
- docker commit
docker container commint containerID imageName:tag
//將一個container 打包成一個image(用的少)
- scratch
是一個空的鏡像亚享,什么都沒有
dockerfile
鏡像選擇原則
官方鏡像優(yōu)于非官方的鏡像,如果沒有官方鏡像绘面,則盡量選擇Dockerfile開源的
固定版本tag而不是每次都使用latest
盡量選擇體積小的鏡像
docker image build -f dockerFileNmae -t imageName .//將dockerFileName 構(gòu)建為名字為imageName的鏡像 .表示當(dāng)前路徑
FROM 選擇基礎(chǔ)鏡像
RUN 主要用于在Image里執(zhí)行指令欺税,比如安裝軟件侈沪,下載文件等。盡量把語句寫一個run里面
文件復(fù)制和目錄操作,COPY ADD
把本地的一個文件復(fù)制到鏡像里晚凿,如果鏡像沒有目標(biāo)文件亭罪,則會自動創(chuàng)建。比如把本地的 hello.py 復(fù)制到 /app 目錄下歼秽。 /app這個鏡像不存在应役,則會自動創(chuàng)建。
ADD和COPY區(qū)別就是復(fù)制的是一個gzip等壓縮文件時燥筷,ADD會幫助我們自動去解壓縮文件箩祥。需要自動解壓縮的場合使用 ADD。
- WORKDIR: 切換當(dāng)前鏡像的目錄肆氓,如果不存在就創(chuàng)建目錄
- ENV ARG 環(huán)境變量
ENV 設(shè)置的變量可以在Image中保持袍祖,并在容器中的環(huán)境變量里
ARG 可以在鏡像build的時候動態(tài)修改value, 通過 --build-arg
- 容器啟動命令CMD ENTRYPOINT:CMD可以用來設(shè)置容器啟動時默認(rèn)會執(zhí)行的命令。
注意:如果docker container run啟動容器時指定了其它命令做院,則CMD命令會被忽略并且如果定義了多個CMD盲泛,只有最后一個會被執(zhí)行。但是ENTRYPOINT一定會執(zhí)行**
- DockerFile 技巧
1.合理使用緩存键耕,把改變的盡量放到后面。
2.合理使用 .dockerignore
3.鏡像的多階段構(gòu)建
4.盡量使用非root用戶
docker的存儲
Docker主要提供了兩種方式做數(shù)據(jù)的持久化
- Data Volume, 由Docker管理, 持久化數(shù)據(jù)的最好方式
- Bind Mount柑营,由用戶指定存儲的數(shù)據(jù)具體mount在系統(tǒng)什么位置
docker volume ls //查看volume DIRVER 和 VOLUMENAME
docker volume inspect VOLUMENAME //查看volume詳細(xì)信息
dcoker volume prune //一次性刪除所有volume
docekr container run -v localDir:containerDir imageName //把本地文件作為volume映射到容器屈雄。(如果兩個不同的容器映射同一個本地的文件,在A容器里面修改volume對B容器可見)
Bind Mount
用戶自己指定host機器的目錄mount到container中官套。但是bind mount在不同的宿主機系統(tǒng)時不可移植的酒奶,比如Windows和Linux的目錄結(jié)構(gòu)是不一樣的,bind mount所指向的host目錄也不能一樣奶赔。所以bind mount不能出現(xiàn)在Dockerfile中的原因惋嚎,因為這樣Dockerfile就不可移植了。