docker之鏡像管理——倉庫使用


倉庫使用

docker官方倉庫

注冊

https://hub.docker.com

自由注冊,郵件激活即可使用

 

 

命令使用

Docker  pull/search/login/push/tag

 

tag [鏡像名:版本]  [倉庫]/[鏡像名:版本]標記本地鏡像,將其歸入某一倉庫

Push [倉庫]/[鏡像名:版本]: 推送鏡像到倉庫  --需要登陸

Search [鏡像名]:在倉庫中查詢鏡像 – 無法查詢到tag版本

Pull [鏡像名:版本] 下載鏡像到本地

Login:登陸倉庫

1、命令登陸dockerhub

 

2、再使用tag命令標記一個鏡像,指定自己的倉庫

 

3、使用push命令推送此鏡像到倉庫里

 

4、打開查詢自己倉庫的鏡像

 

私有倉庫

搭建

下載registry鏡像:docker pull registry

-----可配置加速器加速下載

 

啟動

docker run -d --name reg -p 5000:5000 registry

 

然后可以通過restful接口查看倉庫中的鏡像(當前倉庫是空的)

 

配置http傳輸

私服默認只能使用https,需要配置開放http

 

配置完畢重啟下docker服務

systemctl daemon-reload

systemctl restart docker

私服倉庫推送鏡像

docker tag hello-world   192.168.244.7:5000/hello-world

 

docker push 192.168.244.7:5000/hello-world

 

查詢鏡像:http://192.168.244.5:5000/v2/_catalog   

 

查詢hello版本:   http://192.168.244.5:5000/v2/hello/tags/list

 

commit鏡像並上傳倉庫

創建一個centos容器:

啟動后自動進入此容器

 

容器內安裝nginx服務:

添加一下nginx源:

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

yum search nginx    ##搜索一下看看

yum install nginx -y    ## 安裝

啟動nginx服務

 

 ctrl +P+Q退出容器,在主機環境內校驗nginx請求,正常得到歡迎頁

 

 commit服務為一個nginx鏡像

現在要將cent容器提交成為一個鏡像,命令如下:

docker commit cent cent-ng:v1

可看到得到了新的鏡像cent-ng:v1

 

 啟動此nginx鏡像

1、使用新建的鏡像創建容器,並進入查看,發現已安裝有nginx,但nginx並未啟動

 

 容器內啟動nginx服務,並退出容器。在主機方校驗,nginx歡迎頁面出現

 

 2、現在我們希望啟動容器時,直接啟動nginx服務,怎么做?

docker run -d --name ngx3 cent-ng:v1  /usr/sbin/nginx  -g  "daemon off;"

 

可看到,容器內nginx服務也已正常運行

 

ps:后面運行的命令都是容器命令,由於nginx命令沒有設置到path中,所以全路徑啟動,

nginx -g這個參數是指可以在外面添加指令到nginx的配置文件中,

daemon off是指nginx服務不運行在后端,而是在前台運行(container中的服務必須運行在前台)

commit創建鏡像方式的本質

 

 

原容器與commit后的鏡像,在文件系統上並無區別。只是把容器層原來的可寫屬性,置成了只讀。於是變成了一個不可改的鏡像

數據管理

docker容器運行,產生一些數據/文件/等等持久化的東西,不應該放在容器內部。應當以掛載的形式存在主機文件系統中。

docker的文件系統

 

 

  1. 鏡像與容器讀寫層,通過聯合文件系統,組成系統文件視角
  2. 容器服務運行中,一定會生成數據
  3. 容器只是運行態的服務器,是瞬時的,不承載數據的持久功能

volume文件掛載的探究

1volume參數創建容器數據卷

 

 

2我們通過docker inspect data查看容器元數據,可看到掛載信息

 

 

3、在容器端添加一個文件

 

 

回主機目錄查看,果然存在此文件:

 

 

4、在主機方添加一個文件

 

 

回容器里查看,果然也同步增加了此文件

 

 

5、指定主機目錄方式掛載文件

格式:-v path1path2

如下命令,容器方會自動增加一個data目錄

 

 

宿主機方,同樣自動增加一個/opt/data目錄

 

 

volumes-from引用數據卷

新啟一容器,引入上一步的data容器目錄

 

 

自動得到同一個目錄,內容與data容器里掛載一樣

 

 

 

備份/恢復數據卷   

 

備份:docker run --rm --volumes-from data -v $(pwd):/backup centos tar cvf /backup/data.tar /opt/data

恢復:docker run --rm --volumes-from data -v $(pwd):/backup centos tar xvf /backup/data.tar -C /

 

釋義:

docker  run --rm ----- 啟動一個新的容器,執行完畢刪除

--volumes-from data ------- data容器中掛載卷

-v $(pwd):/backup   --------掛載當前目錄到容器中為backup

cvf /backup/data.tar /opt/data --------- 備份/opt/data目錄(即卷中所有的數據data.tar

 

xvf /backup/data.tar -C /  ---------- 解壓data.tar 到根目錄/ ,因tar歸檔中已包含了/opt/data路徑

 

刪除數據卷:

docker rm -v data

 

Dockerfile使用

dockerfile方式創建容器

最簡單的dockerfile

 

 

創建鏡像

 

 

使用此鏡像運行一個容器

 

 

dockerfile基本要素

 

 

dockerfile指令

FROM

  FROM {base鏡像}

  必須放在DOckerfile的第一行,表示從哪個baseimage開始構建 

MAINTAINER

可選的,用來標識image作者的地方

RUN 

RUN都是啟動一個容器、執行命令、然后提交存儲層文件變更。

第一層 RUN command1 的執行僅僅是當前進程,一個內存上的變化而已,其結果不會造成任何文件。

而到第二層的時候,啟動的是一個全新的容器,跟第一層的容器更完全沒關系,自然不可能繼承前一層構建過程中的內存變化。

而如果需要將兩條命令或者多條命令聯合起來執行需要加上&&

如:cd /usr/local/src && wget xxxxxxx

CMD

  CMD的作用是作為執行container時候的默認行為(容器默認的啟動命令)

  當運行container的時候聲明了command,則不再用image中的CMD默認所定義的命令

一個Dockerfile中只能有一個有效的CMD,當定義多個CMD的時候,只有最后一個才會起作用

EXPOSE

EXPOSE 指令是聲明運行時容器提供服務端口,這只是一個聲明,在運行時並不會因為這個聲明應用就會開啟這個端口的服務。在 Dockerfile 中寫入這樣的聲明有兩個好處,一個是幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射;另一個用處則是在運行時使用隨機端口映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的端口。

entrypoint

entrypoint的作用是,把整個container變成可執行的文件,且不能夠通過替換CMD的方法來改變創建container的方式。但是可以通過參數傳遞的方法影響到container內部

每個Dockerfile只能夠包含一個entrypoint,多個entrypoint只有最后一個有效

當定義了entrypoint以后,CMD只能夠作為參數進行傳遞

ADD & COPY

  host上的文件或者目錄復制到image中(能夠進行自動解壓壓縮包)  

ENV

  用來設置環境變量,后續的RUN可以使用它所創建的環境變量 

WORKDIR

  用來指定當前工作目錄(或者稱為當前目錄) 

USER

  運行RUN指令的用戶 

VOLUME

  用來創建一個在image之外的mount point

nginx鏡像制作實戰

編譯/安裝nginx

mkdir一個目錄,在此目錄內下載nginx源碼包

wget  http://nginx.org/download/nginx-1.13.2.tar.gz

 

並創建一個Dockerfile文件,文件內制作一系列nginx的編譯安裝流程,內容如文件:

 

 

 

其中,每一個RUN就是增加一個鏡像層文件,一層層的RUN命令最終形成一系列鏡像層

 

運行build指令(注意最后的.代表當前路徑),制作鏡像

docker build -t cent-ngx2  .

 

 

我們查看一下這個鏡像的層次歷史

 

 

可看到,此鏡像層基本與dockerfile文件的RUN是一一對應的

 

使用制作的nginx鏡像,創建一個容器。

因此鏡像無前台命令,因為必須指定啟動命令 /usr/local/nginx/sbin/nginx -g "daemon off;"

 

 

為鏡像指定環境變量,掛載目錄,默認啟動命令

在上一版鏡像的基礎上,我們新加配置

 

 

執行:docker build -t cent-ngx3  .

 

 

查看鏡像的歷史,可看到比ngx2的鏡像多了幾個層

 

 

ngx3的鏡像創建容器,已經不需要再指定cmd命令了

可執行命令自行校驗:docker run -d --name ng2 cent-ngx3

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM