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和其狀態
docker container stop containerName or ID
//stop container
docker container rm ID
//刪除container
docker container start ID
//運行一個創建了但是停掉了的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
// 動態跟蹤
- 交互:
docker exec -it ID sh(經常用)
//進入一個正在運行的容器內部shell
docker container run -it containerName sh
// 創建一個容器并且進入交互式模式
docker container top id
- docker container run -d --p 80:80 --name 容器別名 nginx
上面命令執行的細節:
1.在本地查找是否有nginx這個image鏡像,但是沒有發現去遠程的image registry查找nginx鏡像(默認的registry是Docker Hub),而且下載最新版本的nginx鏡像 (nginx:latest 默認)
2.基于nginx鏡像來創建一個新的容器,并且準備運行
3.docker engine分配給這個容器一個虛擬IP地址
4.在宿主機上打開80端口并把容器的80端口轉發到宿主機上
5.啟動容器,運行指定的命令(這里是一個shell腳本去啟動nginx)
- image獲取:
1.docker hub
docker image pull imageName:版本號/
/拉取image,版本號默認為lasted
docker image inspect imageId
// 查看image詳細信息.
docker image rm id
(只有coantainer里面也rm 了才可以刪除,stop也不行,或者強制刪除)
2.離線導入導出
docker image save imagename -o filename
//將image導出為一個文件
docker image load -i filename
3.dockerfile
docker image build -f dockerfilename -t imageName:tag .
(.表示當前目錄)
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
鏡像選擇原則
官方鏡像優于非官方的鏡像,如果沒有官方鏡像,則盡量選擇Dockerfile開源的
固定版本tag而不是每次都使用latest
盡量選擇體積小的鏡像
docker image build -f dockerFileNmae -t imageName .//將dockerFileName 構建為名字為imageName的鏡像 .表示當前路徑
FROM 選擇基礎鏡像
RUN 主要用于在Image里執行指令,比如安裝軟件,下載文件等。盡量把語句寫一個run里面
文件復制和目錄操作,COPY ADD
把本地的一個文件復制到鏡像里,如果鏡像沒有目標文件,則會自動創建。比如把本地的 hello.py 復制到 /app 目錄下。 /app這個鏡像不存在,則會自動創建。
ADD和COPY區別就是復制的是一個gzip等壓縮文件時,ADD會幫助我們自動去解壓縮文件。需要自動解壓縮的場合使用 ADD。
- WORKDIR: 切換當前鏡像的目錄,如果不存在就創建目錄
- ENV ARG 環境變量
ENV 設置的變量可以在Image中保持,并在容器中的環境變量里
ARG 可以在鏡像build的時候動態修改value, 通過 --build-arg
- 容器啟動命令CMD ENTRYPOINT:CMD可以用來設置容器啟動時默認會執行的命令。
注意:如果docker container run啟動容器時指定了其它命令,則CMD命令會被忽略并且如果定義了多個CMD,只有最后一個會被執行。但是ENTRYPOINT一定會執行**
- DockerFile 技巧
1.合理使用緩存,把改變的盡量放到后面。
2.合理使用 .dockerignore
3.鏡像的多階段構建
4.盡量使用非root用戶
docker的存儲
Docker主要提供了兩種方式做數據的持久化
- Data Volume, 由Docker管理, 持久化數據的最好方式
- Bind Mount,由用戶指定存儲的數據具體mount在系統什么位置
docker volume ls //查看volume DIRVER 和 VOLUMENAME
docker volume inspect VOLUMENAME //查看volume詳細信息
dcoker volume prune //一次性刪除所有volume
docekr container run -v localDir:containerDir imageName //把本地文件作為volume映射到容器。(如果兩個不同的容器映射同一個本地的文件,在A容器里面修改volume對B容器可見)
Bind Mount
用戶自己指定host機器的目錄mount到container中。但是bind mount在不同的宿主機系統時不可移植的,比如Windows和Linux的目錄結構是不一樣的,bind mount所指向的host目錄也不能一樣。所以bind mount不能出現在Dockerfile中的原因,因為這樣Dockerfile就不可移植了。