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