一播赁、鏡像
1、獲取鏡像
?????? #docker pull NAME[:TAG] 默認會選擇latest標簽薪铜,及下載倉庫中最新版本的鏡像众弓。
?????? #docker pull ubuntu:14.04
2、查看鏡像信息
?????? #docker images 顯示的詳細字段如下:
?????? ?????? 來自于哪個倉庫隔箍,如ubunt倉庫谓娃;鏡像的標簽信息;鏡像的ID號(唯一)鞍恢;創(chuàng)建時間傻粘;鏡像大小
?????? ?????? 備注:可能出現(xiàn)兩個鏡像ID一致的情況每窖,其實指向了同一個鏡像文件帮掉,其tag號不一樣而已。
?????? #docker inspect [鏡像ID|容器ID]????? 查看鏡像或容器的詳細信息窒典,返回信息為JSON格式
?????? #docker inspect 容器ID |grep IP?????? 查看的Nerword信息
3蟆炊、搜索鏡像
?????? #docker search NAME
?????? ?????? -s=n 指定僅顯示評價微指定星級以上的鏡像
4、刪除鏡像
?????? #docker rmi NAME name可以為標簽或ID
?????? ?????? -f 強行刪除鏡像
5瀑志、創(chuàng)建鏡像
?????? #docker commit 備注信息 容器ID 創(chuàng)建鏡像名稱
?????? ?????? 備注信息:-a 作者信息 -m 提交信息 -p 提交時暫停容器運行
?????? ?????? 如:docker commit -m "abc" -a "my" bb62268edad2 nginx_save
6涩搓、存儲鏡像
?????? #docker save -o 保存名稱.tar 鏡像名稱:tag 保存在當(dāng)前目錄下
7、載入鏡像
?????? #docker load < 保存名稱.tar
二劈猪、容器
1昧甘、創(chuàng)建容器:docker create ... 新建并啟動:docker run ...
?????? -i 交互式操作 -t 終端。
?????? --rm 這個參數(shù)是說容器退出后隨之將其刪除战得〕浔撸可以避免浪費空間。
?????? -d后臺運行容器常侦,并返回容器ID浇冰;
?????? run來創(chuàng)建啟動容器時,運行標準操作如下
?????? ????? 1聋亡、創(chuàng)建本地是否存在指定鏡像肘习,不存在則從公有倉庫下載
?????? ????? 2、利用鏡像創(chuàng)建并啟動一個容器
?????? ????? 3坡倔、分配一個文件系統(tǒng)漂佩,并在只讀的鏡像層外面掛載一層可讀寫層
?????? ????? 4脖含、從宿主主機配置的王巧接口中橋接一個虛擬接口道容器中去
?????? ????? 5、從地址池配置一個IP地址給容器
?????? ????? 6仅仆、執(zhí)行用戶指定的應(yīng)用程序
?????? ????? 7器赞、執(zhí)行完畢后容器被終止
2、終止容器
?????? #docker stop NAME|ID
3墓拜、進入容器
?????? #docker exec -ti 容器ID /bin/bash
4港柜、刪除容器
?????? #docker rm 容器ID
?????? ?????? -f??? 強行終止并刪除一個運行中的容器
?????? ?????? -l??? 刪除容器的鏈接,但保留容器
?????? ?????? -v?? 刪除容器掛載的數(shù)據(jù)卷
????????? #docker? rm? $(docker ps -q -a)??? 刪除所有未開啟的容器
5咳榜、導(dǎo)出容器
?????? #docker export 容器ID > 保存路徑/test.save.tar
6夏醉、導(dǎo)入容器
?????? #cat test.save.tar | docker import - 鏡像名稱:tag 將導(dǎo)出的容器還原為鏡像
三、私有倉庫管理:
?????? 1涌韩、docker pull registry 獲取官方私有倉庫環(huán)境
?????? 2畔柔、docker run -d -p 5000:5000 registry 創(chuàng)建容器并映射本地5000端口
?????? ????? 或docker run -d -p 5000:5000 -v /本地理解:/tmp/registry registry
?????? 3、docker tag unbuntu:14:04 192.168.12.235:5000/test 修改鏡像tag
?????? 4臣樱、docker push 192.168.12.235:5000/test 上傳鏡像
?????? ????? 如有報錯請參考如下:http://ylw6006.blog.51cto.com/470441/1597873/或http://blog.csdn.net/wangtaoking1/article/details/44180901/
?????? 5靶擦、docker pull 192.168.12.235:5000/test 客戶端下載
四、數(shù)據(jù)管理(-v與--volunmes-from 可以多次使用)
?????? #run -v 主機路徑:容器路徑 ubuntu /bin/bash 掛載一個主機目錄作為數(shù)據(jù)卷
?????? 數(shù)據(jù)卷容器
?????? ?????? #docker run -it -v /dbdata --name dbdata ubuntu
?????? ?????? #docker run -it --volumes-from dbdata(容器名稱) --name db1 ubuntu
?????? ?????? #docker run -it --volumes-from dbdata(容器名稱) --name db2 ubuntu
?????? ?????? 此時dbdata雇毫、db1玄捕、db2共用dbdata目錄
?????? 數(shù)據(jù)卷容器遷移:備份
五、網(wǎng)絡(luò)基礎(chǔ)配置(-p可以多次使用)
????? ??????-P 隨機從主機一個49000~49900端口映射至容器中某個開放的網(wǎng)絡(luò)端口棚放。
????? ??????-p 8080:80 宿主機的8080端口映射到容器中的80端口
????? ??????-p ip:8080:80 映射到指定地址的指定端口
????? ??????-p ip::80/udp 映射到指定地址的任意端口枚粘,并且指定端口為udp
????? ??????查看容器端口映射信息
????? ????? #docker port 容器ID
六、容器互聯(lián)(容器名稱是唯一的)
????? ????? 1飘蚯、docker run -d --name db training/postgres 創(chuàng)建db容器
????? ????? 2馍迄、docker run -d -P --name web --link db:db training/webapp python app.py
????? ????? --link name:alias (name要鏈接的容器名稱,alias鏈接后的別名)
??????????? Docker 通過 2 種方式為容器公開連接信息:
環(huán)境變量
更新 /etc/hosts 文件
----------------------------------------------------------------------------------------------------------------------------
以下命令針對于Dockerfile:
COPY-------復(fù)制文件
COPY <源路徑>... <目標路徑>
COPY ["<源路徑1>",... "<目標路徑>"]
COPY 指令將從構(gòu)建上下文目錄中 <源路徑> 的文件/目錄復(fù)制到新的一層的鏡像內(nèi)的 <目標路徑> 位置局骤。比如:#COPY package.json /usr/src/app/
支持統(tǒng)配符號攀圈,如:#COPY hom* /mydir/
源文件的各種元數(shù)據(jù)都會保留。文件權(quán)限峦甩、文件變更時間等
----------------------------------------------------------------------------------------------------------------------------
ADD-------更高級的復(fù)制文件(在COPY基礎(chǔ)上增加了一些功能)
使用場景較少赘来、COPY一般已滿足使用。
僅在需要自動解壓縮的場合使用 ADD穴店,如:#ADD ubuntu-amd64- root.tar.gz
----------------------------------------------------------------------------------------------------------------------------
CMD-------容器啟動
shell 格式:CMD <命令>
exec 格式:CMD ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"...]
參數(shù)列表格式:CMD ["參數(shù)1", "參數(shù)2"...]撕捍。在指定了 ENTRYPOINT 指令后,用 CMD 指定具體的參數(shù)泣洞。
如果使用shell格式的話忧风,實際的命令會被包裝為sh -c的參數(shù)形式進行執(zhí)行,如:CMD echo $HOME球凰;實際表達為:CMD [ "sh", "-c", "echo $HOME" ]
正確的做法是直接執(zhí)行Nginx 可執(zhí)行文件狮腿,并且要求以前臺形式允許腿宰,如:CMD ["nginx", "-g", "daemon off;"]
----------------------------------------------------------------------------------------------------------------------------
ENTRYPOINT--入口點
ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啟動程序及參數(shù)缘厢。
----------------------------------------------------------------------------------------------------------------------------
ENV ---------設(shè)置環(huán)境變量
ENV
ENV = =...
使用方式如:ENV VERSION=1.0 DEBUG=on \
或:ENV NODE_VERSION 7.2.0
----------------------------------------------------------------------------------------------------------------------------
ARG-------構(gòu)建參數(shù)
構(gòu)建參數(shù)和 ENV 的效果一樣吃度,都是設(shè)置環(huán)境變量。所不同的是贴硫,ARG 所設(shè)置的構(gòu)建環(huán)境的環(huán)境變量椿每,在將來容器運行時是不會存在這些環(huán)境變量的。
VOLUME---定義匿名卷
VOLUME ["<路徑1>", "<路徑2>"...]
VOLUME <路徑>
使用方法:#VOLUME /data 指定匿名卷后英遭,在運行時如果用戶不指定掛載间护,其應(yīng)用也可以正常運行,不會向容器存儲層寫入大量數(shù)據(jù)挖诸。
運行時替換匿名卷的掛載地址#docker run -d -v mydata:/data xxxx 從/data替換為/mydata
----------------------------------------------------------------------------------------------------------------------------
EXPOSE----聲明端口
????????? 格式為 EXPOSE <端口1> [<端口2>...]汁尺。
????????? EXPOSE 指令是聲明運行時容器提供服務(wù)端口,這只是一個聲明多律,在運行時并不會因為這個聲明應(yīng)用就會開啟這個端口的服務(wù)痴突。
????????? 好處1:幫助鏡像使用者理解這個鏡像服務(wù)的守護端口,以方便配置映射狼荞;
????????? 好處2:在運行時使用隨機端口映射時辽装,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的端口粘秆。
----------------------------------------------------------------------------------------------------------------------------
WORKDIR----指定工作目錄
????????? 格式為 WORKDIR <工作目錄路徑>
????????? 使用 WORKDIR 指令可以來指定工作目錄(或者稱為當(dāng)前目錄)如迟,以后各層的當(dāng)前目錄就被改為指定的目錄收毫,如該目錄不存在攻走,WORKDIR 會幫你建立目錄。
????????? 錯誤使用如:RUN cd /app
????????? ???????? ???????? ???????? RUN echo "hello" > world.txt(第二層執(zhí)行是并非在/app目錄下)
????????? 正確使用如:WORKDIR /app
????????? ???????? ???????? ???????? RUN echo "hello" > world.txt
----------------------------------------------------------------------------------------------------------------------------
USER--------指定當(dāng)前用戶
????????? 格式:USER <用戶名>
????????? USER 指令和 WORKDIR 相似此再,都是改變環(huán)境狀態(tài)并影響以后的層昔搂。WORKDIR 是改變工作目錄,USER 則是改變之后層的執(zhí)行 RUN, CMD 以及 ???????? ENTRYPOINT 這類命令的身份输拇。
????????? 用戶必須是事先建立好的摘符,否則無法切換。使用如下:
????????? RUN groupadd -r redis && useradd -r -g redis redis
????????? USER redis
????????? RUN [ "redis-server" ]
----------------------------------------------------------------------------------------------------------------------------
HEALTHCHECK----健康檢查
HEALTHCHECK [選項] CMD <命令>:設(shè)置檢查容器健康狀況的命令
HEALTHCHECK NONE:如果基礎(chǔ)鏡像有健康檢查指令策吠,使用這行可以屏蔽掉其健康檢查指令
--interval=<間隔>:兩次健康檢查的間隔逛裤,默認為 30 秒;
--timeout=<時長>:健康檢查命令運行超時時間猴抹,如果超過這個時間带族,本次健康檢查就被視為失敗,默認 30 秒蟀给;
--retries=<次數(shù)>:當(dāng)連續(xù)失敗指定次數(shù)后蝙砌,則將容器狀態(tài)視為 unhealthy阳堕,默認 3 次。
#docker ps 可查看狀態(tài)health/unhealthy
----------------------------------------------------------------------------------------------------------------------------
ONBUILD-----為他人做嫁衣裳
????????? 格式:ONBUILD <其它指令>
????????? ONBUILD 是一個特殊的指令择克,它后面跟的是其它指令恬总,比如 RUN, COPY 等,而這些指令肚邢,在當(dāng)前鏡像構(gòu)建時并不會被執(zhí)行壹堰。只有當(dāng)以當(dāng)前鏡像為基礎(chǔ)鏡像,去構(gòu)建下一級鏡像的時候才會被執(zhí)行骡湖。
????????? FROM node:slim
????????? RUN "mkdir /app"
????????? WORKDIR /app
????????? ONBUILD COPY ./package.json /app
????????? ONBUILD? RUN [ "npm", "install" ]
????????? ONBUILD? COPY . /app/
????????? CMD [ "npm", "start" ]
????????? FROM my-node
????????? 在各個項目目錄中缀旁,用這個只有一行的 Dockerfile 構(gòu)建鏡像時,之前基礎(chǔ)鏡像的那三行 ONBUILD 就會開始執(zhí)行勺鸦,成功的將當(dāng)前項目的代碼復(fù)制進鏡像并巍、并且針對本項目執(zhí)行 npm install,生成應(yīng)用鏡像换途。
----------------------------------------------------------------------------------------------------------------------------