Docker鏡像與容器
一、Docker鏡像
1、獲取鏡像【docker pull】
Docker Hub中有很多可以直接用的鏡像,網址:https://hub.docker.com/search?q=&type=image
命令格式為:
docker pull [選項] [Docker Registry 地址[:埠號]/]倉庫名[:標簽]
其中選項:

地址的格式:<域名/IP>[:埠號],默認地址是 Docker Hub(docker.io)
倉庫名:<用戶名>/<軟體名>,其中docker hub中用戶名默認為Library
docker pull的實作步驟:用戶通過docker client發送命令,docker daemon接收到命令后向docker registry發送image下載請求,下載后存放在本地,示意圖如下(來源:https://zhuanlan.zhihu.com/p/187505981):

此處以拉取Ubuntu18.04版本為例,輸入命令
docker pull ubuntu:18.04
出現報錯
no matching manifest for windows/amd64 10.0.18363 in the manifest list entries
解決方法:在設定中的docker engine中的experimental設定為true,即可成功拉取


2、列出鏡像
docker image ls

3、洗掉鏡像
$ docker image rm [選項] <鏡像1> [<鏡像2> ...]
其中可以鏡像可以是鏡像的短ID(id的前面幾個字符)、鏡像長ID、鏡像名或鏡像摘要

有時洗掉鏡像時發生報錯:Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container da38f2757b97 is using its referenced image 545e4e38d9db,表明現在有容器正在使用該鏡像導致無法洗掉,將對應容器洗掉后即可洗掉,
查看所有容器:docker ps -a
洗掉所有容器:docker rm $(docker ps -a -q)

洗掉行為:Untagged、Deleted
一個鏡像可能會有多個標簽,洗掉鏡像操作實際上是洗掉某個標簽的鏡像,執行命令后則取消了符合標準的鏡像標簽,這就是Untagged
但是可能洗掉時不會洗掉所有鏡像標簽,所以docker rm命令不一定會發生delete行為,只有鏡像所有的標簽取消,才會觸發deleted
3、Dockerfile制作鏡像
通過命令列創建檔案并在檔案中撰寫指令
其中,FROM 鏡像名 可以指定一個鏡像為基礎,而如果指定鏡像為scratch,則表示不以任何鏡像為基礎,
RUN指令是執行命令列的命令,有shell和exec兩種格式,其中shell格式后接命令,而exec格式后接可執行檔案,
鏡像的層數是有最大限制的,沒運行一個RUN指令即創建一層,所以要避免冗余的,若命令都是為了同一個目的,可以只用一層RUN執行,Shell類行尾添加 \ 命令進行換行,使用&&將各個所需命令串聯,
每一層構建最后的時候需要清理掉無關的檔案,比如下載、展開的檔案,apt快取檔案等
此處實驗的是教程中定制nginx鏡像
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
撰寫好了dockerfile使用docker build構建鏡像
docker build命令格式:docker build [選項] <背景關系路徑/URL/->
在Dockerfile檔案所在的目錄執行:docker build -t nginx:v3 .
需要注意的是,最后需要加 . ,否則會出現以下報錯,.表示當前目錄
docker build" requires exactly 1 argument.
構建鏡像時,經常需要將一些本地檔案復制進鏡像,而docker build命令是在服務端構建鏡像,所以構建時需要指定背景關系的路徑,docker build 命令得知這個路徑后,會將路徑下的所有內容打包,然后上傳給 Docker 引擎,Dockerfile中的COPY、ADD等指令便會在背景關系目錄找檔案,
二、Docker容器
1、新建并啟動容器
docer run命令引數:
-a stdin:** 指定標準輸入輸出內容型別,可選 STDIN/STDOUT/STDERR 三項;
-d:** 后臺運行容器,并回傳容器ID;
-i:** 以互動模式運行容器,通常與 -t 同時使用;
-P:** 隨機埠映射,容器內部埠**隨機**映射到主機的埠
-p:** 指定埠映射,格式為:**主機(宿主)埠:容器埠**
-t:** 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
--name="nginx-lb":** 為容器指定一個名稱;
--dns 8.8.8.8:** 指定容器使用的DNS服務器,默認和宿主一致;
--dns-search example.com:** 指定容器DNS搜索域名,默認和宿主一致;
-h "mars":** 指定容器的hostname;
-e username="ritchie":** 設定環境變數;
--env-file=[]:** 從指定檔案讀入環境變數;
--cpuset="0-2" or --cpuset="0,1,2":** 系結容器到指定CPU運行;
-m :**設定容器使用記憶體最大值;
--net="bridge":** 指定容器的網路連接型別,支持 bridge/host/none/container: 四種型別;
--link=[]:** 添加鏈接到另一個容器;
--expose=[]:** 開放一個埠或一組埠;
--volume , -v 主機的檔案夾:容器的檔案夾** 系結一個卷
使用-i -t可以進入互動模式
docker run -t -i ubuntu:18.04 /bin/bash

通過exit命令退出互動模式
2、其他一些命令
# 停止容器 id為容器的id
docker stop 'id'
# 啟動容器 id為容器的id
docker start'id'
# 重啟容器 id為容器的id
docker restart 'id'
# 洗掉容器 id為容器的id
docker rm 'id'
# 進入容器 id為容器的id
docker exec -it 'id' bash
#查看所有已經創建的包括終止狀態的容器
docker container ls -a
#清理所有處于終止狀態容器
docker container prune
#匯出本地容器
docker export 'id'
#從容器快照檔案匯入鏡像
docker import 路徑/鏡像名 或指定URL/某個目錄匯入
#匯入鏡像存盤檔案到本地鏡像庫
docker load
容器快照檔案會丟棄歷史記錄與元資料資訊,僅保留容器快照狀態,
鏡像存盤檔案會保留完整記錄,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/277095.html
標籤:區塊鏈
