天天看點

Docker學習筆記(二) 使用Docker鏡像和倉庫

11.2記

列出鏡像:

sudo docker images : 檢視主機可用鏡像

拉取鏡像:

sudo docker pull fedora : 拉取fedora系列鏡像到本地

sudo docker pull fedora:20 : 隻拉取指定标簽的鏡像(fedora:20)

sudo docker images fedora : 檢視fedora鏡像的内容

查找鏡像:

sudo docker search puppet: 查找所有帶有puppet的鏡像

建構鏡像:

  • 使用docker commit指令
  • 使用docker build指令 和 Dockerfile檔案

用commit方式步驟:

先在docker hub建立賬号

然後登入:sudo docker login

1.建立一個容器并打開shell

sudo docker run -i -t ubuntu /bin/bash

2.下載下傳apache2

apt-get update

apt-get install apache2

3.sudo docker commit 4aab3ce3cb76(容器ID) erliccao/apache2

或者:sudo docker commit -m="A new custon image" --author="erliccao" 90cf5e70ccb5 erliccao/apache2:webserver

-m添加送出資訊, --author指定作者    :webserver添加标簽

4.sudo docker inspect erliccao/apache2:webserver 檢視送出的鏡像

5.用建構的鏡像建立容器

sudo docker run -i -t  erliccao/apache2:webserver /bin/bash

用Dockerfile建構鏡像(推薦)

建立一個static_web目錄用來儲存Dockerfile,這個目錄就是建構環境,Docker則稱此環境為上下文或者建構上下文。

Dockerfile:

# Verision: 0.0.1
# 指定基礎鏡像
FROM ubuntu:latest
# 指定作者
MAINTAINER Erlic Cao "[email protected]"
# 執行指令
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am in your container' /usr/share/nginx/html/index.html 
# 指定容器内的應用程式使用容器的指定端口
EXPOSE 80
           

sudo docker build -t="erliccao/static_web"  .

根據Dockerfile建構鏡像

-t指定倉庫和鏡像名

.告訴Docker到本地目錄中找Dockerfile檔案。 也可以添加一個标簽,如"erliccao/static_web:v1"

指令失敗會怎樣?

如果執行中因為把nginx拼成ngin而安裝nginx失敗了,這時候需要調試一下這次失敗。我們可以用docker run指令來基于這次建構到目前已經成功的最後一步建立一個容器,然後調試找出哪裡出錯。 解決問題後退出容器,使用正确的包名來修改Dockerfile檔案,之後再嘗試建構。

 Dockerfile指令

除了上述的RUN和EXPOSE指令,Dockerfile中還有很多其它指令。

1.CMD

CMD指令用于指定一個容器啟動時要運作的指令。差別于RUN指令,RUN是指定鏡像建構時要運作的指令,CMD是指定容器啟動時要運作的指令,這和docker run指令指定啟動容器運作的指令類似。

例如:CMD ["/bin/bash"] = sudo docker run -i -t erliccao/static_web /bin/bash

注意:使用docker run指令可以覆寫CMD指令。如果在Dockfile中指定了CMD,同時在docker run指令行中也指定了要運作指令,docker run會覆寫CMD指令。

2.ENTRYPOINT

ENTRYPOINT和CMD類似,隻是ENTRYPOINT在啟動容器時不會被覆寫。實際上docker run中指定的任何參數都會被當作參數再次傳遞給ENTRYPOINT指令中的指令。

例如設定:ENTRYPOINT ["/usr/sbin/nginx"]

建構新鏡像:sudo dcoker build -t="erliccao/static_web" 

啟動一個容器:sudo docker run -t -i erliccao/static_web  -g "daemon off;"

-g "daemon off;"參數會傳遞給/usr/sbin/nginx 相當于  /usr/sbin/nginx  -g "daemon off;"

該指令會以前台運作的方式啟動Nginx守護程序。

3.WORKDIR

WORKDIR指令用來從鏡像中建立一個新容器時,在内部設定一個工作目錄。ENTRYPOINT或CMD指定的程式會在此目錄下執行

4.ENV

ENV指令用來在鏡像建構過程中設定環境變量。

ENV TARGET_DIR  /home/app

WORKDIR $TARGET_DIR   : WORKDIR被指定為/home/app

這些環境變量會持久儲存到我們的鏡像建立的任何容器中。

5.USER

USER指令用來指定該鏡像會以什麼使用者來運作。

USER nginx:基于該鏡像啟動的容器會以nginx使用者的身份來運作。可以指定使用者名或以及組或GID

例如:USER user:group  ;   USER uid:gid;  USER uid:group

6.VOLUME

VOLUME指令用來向基于鏡像建立的容器添加卷。一個卷可以存在與一個或者多個容器内特定的目錄

7.ADD

ADD指令用來将建構環境下的檔案和目錄複制到鏡像中。

ADD software.lic /opt/application/software.lic

這裡會将建構目錄下的software.lic複制到鏡像的/opt/application目錄下。指向源檔案的位置參數可以是一個URL,或者建構上下文或環境中檔案名或目錄。

URL格式:

ADD http://wordpress.org/latest.zip  /root/wordpress.zip

8.COPY

COPY指令類似于ADD,COPY指令隻關心在建構上下文中複制本地檔案,而不會去做檔案提取和解壓工作

9.ONBUILD

ONBUILD指令能為鏡像添加觸發器(trigger)。當一個鏡像被用作其它鏡像的基礎鏡像時,該鏡像中的觸發器将會被執行。

例如:

ONBUILD ADD .   /app/src

ONBUILD RUN cd /app/src && make

上面的觸發器會在建立鏡像時把建構上下文複制到/app/src目錄,并且執行切換到該目錄并make的指令

将鏡像推送到Docker Hub

可以通過docker push指令将本地鏡像erliccao/apache2推送到Docker Hub。

sudo docker push erliccao/apache2

删除鏡像:

sudo docker rmi erliccao/apache2

運作自己的Docker Registry

有時我們希望建構和存儲包含不想被公開的資訊或資料的鏡像。有兩種選擇:

利用Docker Hub上的私有倉庫

在防火牆後面運作自己的Registry

從容器運作Registry

sudo docker run -p 5000:5000 registry
           

該指令會啟動一個運作Registry應用的容器,并綁定到本地主控端的5000端口上。

将本地鏡像上傳到我們的新Registry上

首先檢視鏡像的ID:sudo docker images erliccao/apache2

接着使用Registry為該鏡像打上标簽,需要在鏡像名前加上主機名和端口字首。在這個例子中Registry主機名為:docker.example.com

sudo docker tag 5b5e4d6e344d docker.example.com:5000/erliccao/apache2
           

打完标簽後,就能通過docker push 指令将它推送到新的Registry中:

sudo docker push docker.example.com:5000/erliccao/apache2

這個鏡像就被送出到了本地的Registry中,并且可以将其用于使用docker run指令建構新容器:

sudo docker run -t -i docker.example.com:5000/erliccao/apache2  /bin/bash