1、刪除鏡像image:
docker rmi -f name|imageId
$ docker rmi -f 7d9495d03763
$ docker rmi-fdocker-whale
2、將本地鏡像推送到hub.docker.com上
首先找到你要推送的iamge_id,可以通過 docker images查看全部鏡像
之后使用 docker tag 7d9495d03763 maryatdocker/docker-whale 會產生一個maryatdocker/docker-whale的鏡像
使用docker login 登陸到遠程hub.docker.com上,加上用戶驗證信息登陸
登陸成功之后 : docker push maryatdocker/docker-whale 將鏡像推送到服務器上
3、從服務器上拉取鏡像
首先刪除本地存在名字相同的鏡像
docker pull 鏡像名稱 拉取鏡像
docker run maryatdocker/docker-whale 下載並運行鏡像
4、查看鏡像:本地鏡像
查看本地所有鏡像 : docker images
根據名稱查看某一個鏡像: docker images 鏡像名稱
查看鏡像的詳細信息: docker inspect jametur01/apche2:webserver
5、查找鏡像:從docker hub上查找鏡像
docker search 鏡像名稱
7、構建鏡像
前提: 登陸賬號在docker hub上
兩種方式:
1) docker commit 命令
首先創建一個容器,並在容器中進行修改,最后在將修改提交為一個新鏡像
創建一個容器: sudo docker run -t -i ubuntu /bin/bash
對容器進行修改: 如安裝apche
apt-get -ypp update
apt-get -y install apache2
提交新修改的鏡像: sudo docker commit 容器Id 目標鏡像倉庫和鏡像名稱
也可以增加其他詳細的信息: -m =A new customer images"" --author="James B"
2) docker build 和 Dockerfile文件(推薦使用)
使用基於DSL語法的指令來構建一個Docker鏡像,之后使用docker build 命令基於Dockerfile中的指令構建一個新的鏡像
· 創建基本目錄:
mkdir static_web ===============該目錄為構建環境,docker中稱該目錄為上下文或是構建上下文
cd static_web
touch Dockerfile
編寫Dockerfile文件:
Dockerfile文件:
FROM ubuntu:14.04 ===========指定一個已經存在的鏡像當作基礎鏡像
MAINTAINER James Turnbull "james@example.com" ===告訴鏡像的作者是誰
RUN apt-get update =====RUN 運行你指定的命令,每條RUN都會創建一個新的鏡像層,執行成功提交鏡像層
RUN apt-get install -y nginx ==========默認情況下RUN是在shell里使用/bin/sh -c執行,若是在不支持shell可以使用exec格式
exec: RUN ["apt-get","install","-y","nginx"]
RUN echo 'hi, i am in you container' \>/usr/share/nginx/html/index.html
EXPOSE 80 =============指定應用程序使用的端口號,可以使用多個EXPOSE指令向外部公開多個端口號
Dockerfile中的指令按照順序往下執行
執行流程: Docker從基礎鏡像運行一個容器;執行每一條指令,對容器進行修改;執行類似docker commit的操作,提交一個新的鏡像層;docker再基於剛提交的鏡像運行一個新的容器;執行Dockfile中的下一條指令,直到所有指令都執行完畢
構建新鏡像:
cd static_web
sudo docker build -t="jamtur01/static_web:v1" .
-t 為新鏡像指定倉庫和名稱,也可以制定標簽v1,若是沒有指定標簽,docker會自動為鏡像設置一個latest標簽
構建鏡像粗壯乃構建緩存,若是想要去掉構建緩存需要添加參數: --no-cache,構建緩存的好處是可以實現簡單的Dockerfile模板
8、Dockerfile指令:
。CMD :
用於指定一個容器啟動時要運行的命令,類似於RUN,只不過RUN是在鏡像構建時要運行的命令,而CMD是在容器啟動時需要運行的命令,這和docker run啟動容器時指定要運行的參數非常相似:
docker run -i -t jamtur01/statis_web /bin/true
CMD ["/bin/true"], 也可以指定參數 CMD p["bin/bash","-1"]
注: docker run中運行的命令會覆蓋Dockerfile的CMD中的命令
。ENTRYPOINT:
和CMD的命令用法相同,作用相似,區別是,ENTRYPOINT指令提供的命令不容易在啟動時被覆蓋。實際上,docker run 命令行中指定的任何參數都會被當作參數再次傳給ENTRYPOINT指令中指定的命令。如果確實需要覆蓋ENTRYPOINT命令,可以通過docker run --entrypiont標志覆蓋
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
可以通過CMD和ENTRYPOINT一起用的方式使鏡像既可以運行一個默認的命令,也可以通過docker run使指定可覆蓋的選項或是標志
如:ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]
。WORKDIR:
用來在從鏡像創建一個容器時,在容器內部設置一個工作目錄,ENTRYPOINT 或是CMD的命令會在該目錄下執行。
WORKDIR /opt/webapp/ab
RUN bundle install
WORKDIR /opt/webapp
ENTRYPOINT ["rackup"]
docker run中使用 -w 覆蓋工作目錄
。ENV :
用來在鏡像構建過程中設置環境變量,
ENV RVM_PATH /home/rvm
。USER :
指定該鏡像一什么樣的用戶去運行
。VOLUME :
向基於鏡像創建的容器添加卷,一個卷是可以存在於一個或多個容器內的特定的目錄,這個目錄可以繞過聯合文件系統,並提供如下共享數據或是對數據進行持久化的功能。
。卷可以在容器間共享和重用
。一個容器可以不是必須和其他容器共享卷
。對卷的修改是立時生效的
。對卷的修改不會對更新鏡像產生影響
。卷會一直存在直到沒有任何容器在使用它
如: VOLUME ["/opt/project"] 將會為基於此鏡像創建的任何容器創建一個名為/opt/project的掛載點,
VOLUME ["/opt/project","/data"]指定多個卷
。ADD :
用來將構建環境下的文件和目錄復制到鏡像中。形式:ASS fromWhere towhere 。 目的地址若是末尾/,則是文件夾,無/則是文件。文件源也可是URL格式
如: ADD software.lic /opt/application/software.lic
ADD在處理本地歸檔文件時,如gzip,bzip2,xz為源文件,則會自動對其進行unpack
ADD latest.tar.gz /var/ww/ =============會將文件解壓到/var/ww/目錄下,若是該文件夾下已經存在該文件,不會進行覆蓋操作
注:ADD命令會使構建緩存失效,若是使用ADD向鏡像添加文件夾或是文件,那么后續的命令就不能用之前的緩存
。COPY :
COPY命令類似於ADD命令,不同的是COPY命令只關心在構建上下文中復制本地文件,而不會去做文件提取和解壓的共作。
COPY conf.d/ /etc/apche2/ ==>使conf.d文件夾下的內容復制到/etc/apche2/下
文件源路徑必須是一個與當前構建環境相對的文件或是目錄,本地文件都放到和Dockerfile同一個目錄下。不能復制該目錄之外的任何文件,因為構建環境將會上傳到Docker守護進程,而復制是在Docker守護進程中進行的。任何位於構建環境之外的東西都是不可用的。COPY指令的目的文職則必須是容器內部的一個絕對路徑。
任何由該命令創建的文件或是目錄的GID和UID的值都為0.
。ONBUILD
為鏡像添加觸發器trigger 。當一個鏡像被用作其他鏡像的基礎鏡像時觸發器會被執行
觸發器會在構建過程中插入新指令,我們可以認為這些指令是緊跟在FROM之后指定的,觸發器可以是任何構造指令。
如: ONBUILD ADD . /app/src
ONBUILD RUN cd /app/s& make
可以用docker inspect命令查看 ONBUILD命令