docker
http://www.runoob.com/docker/docker-install-python.html
http://www.runoob.com/docker/docker-resources.html
Clients Hosts Registries
Docker鏡像 Images 用于創(chuàng)建容器的只讀模板,包含容器啟動所需的一切信息其监,包括運(yùn)行程序和配置數(shù)據(jù)
Docker容器 Container Hosts 獨(dú)立的應(yīng)用
Docker客戶端 Client
Docker主機(jī) Host 一個物理或者虛擬的機(jī)器用于執(zhí)行Docker守護(hù)進(jìn)程和容器
Docker倉庫 Registry 用于保存鏡像
Docker Machine Docker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應(yīng)的平臺上安裝Docker椭符,比如VirtualBox跟伏、 Digital Ocean、Microsoft Azure秧了。
-
三個組件:
Docker Client 是用戶界面跨扮,它支持用戶與Docker Daemon之間通信。
Docker Daemon運(yùn)行于主機(jī)上,處理服務(wù)請求衡创。
Docker Index是中央registry帝嗡,支持擁有公有與私有訪問權(quán)限的Docker容器鏡像的備份。
-
三要素:
Docker Containers 容器負(fù)責(zé)應(yīng)用程序的運(yùn)行璃氢,包括操作系統(tǒng)哟玷、用戶添加的文件以及元數(shù)據(jù)
Docker Images是一個只讀模板,用來運(yùn)行Docker容器拔莱。
DockerFile是文件指令集碗降,用來說明如何自動創(chuàng)建Docker鏡像。
Docker Client的是交互層
Docker Daemon負(fù)責(zé)實際操作:
1塘秦, 基于Dockerfile的指令構(gòu)建鏡像Docker Images讼渊, 然后推送到中央registry:Docker Index, 以供他人使用, 公有或者私有訪問權(quán)限
2尊剔,運(yùn)行容器 運(yùn)行容器源于我們在第一步中創(chuàng)建的鏡像爪幻。當(dāng)容器被啟動后,一個讀寫層會被添加到鏡像的頂層须误。當(dāng)分配到合適的網(wǎng)絡(luò)和IP地址后挨稿,需要的應(yīng)用程序就可以在容器中運(yùn)行了。
命令
docker info
sudo docker pull busybox 預(yù)構(gòu)建Image
(busybox是最小的Linux系統(tǒng))
docker run busybox /bin/echo Hello Docker 運(yùn)行應(yīng)用
sample_job=$(docker run -d busybox /bin/sh -c "while true; do echo Docker; sleep 1; done") 啟動sample_job的容器(后臺模式)
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
這個長字符叫做容器ID
docker logs 2b1b7a428627 查看容器內(nèi)的輸出
docker logs $sample_job 查看日志
docker help
docker ps 查看容器
docker stop $sample_job 停止容器
docker restart $sample_job
docker stop $sample_job;
docker rm $sample_job
docker images 查看鏡像列表
docker search (image-name)
docker history (image_name)
docker push (image_name) 將鏡像推送到registry
docker stats --help 查看docker stats 的用法
容器的使用
docker create # 創(chuàng)建一個容器但是不啟動它
docker run # 創(chuàng)建并啟動一個容器
docker stop # 停止容器運(yùn)行钉赁,發(fā)送信號SIGTERM
docker start # 啟動一個停止?fàn)顟B(tài)的容器
docker restart # 重啟一個容器
docker rm # 刪除一個容器
docker kill # 發(fā)送信號給容器讳苦,默認(rèn)SIGKILL
docker attach # 連接(進(jìn)入)到一個正在運(yùn)行的容器
docker wait # 阻塞到一個容器,直到容器停止運(yùn)行
獲取容器相關(guān)信息
docker ps # 顯示狀態(tài)為運(yùn)行(Up)的容器
docker ps -a # 顯示所有容器,包括運(yùn)行中(Up)的和退出的(Exited)
docker inspect # 深入容器內(nèi)部獲取容器所有信息
docker logs # 查看容器的日志(stdout/stderr)
docker events # 得到docker服務(wù)器的實時的事件
docker port # 顯示容器的端口映射
docker top # 顯示容器的進(jìn)程信息
docker diff # 顯示容器文件系統(tǒng)的前后變化
導(dǎo)出容器
docker cp # 從容器里向外拷貝文件或目錄
docker export # 將容器整個文件系統(tǒng)導(dǎo)出為一個tar包草描,不帶layers、tag等信息
執(zhí)行
docker exec # 在容器里執(zhí)行一個命令,可以執(zhí)行bash進(jìn)入交互式
運(yùn)行web應(yīng)用
docker run -d -P training/webapp python app.py 運(yùn)行一個python Flask應(yīng)用
-d 后臺模式
-P 將容器內(nèi)部使用的網(wǎng)絡(luò)端口映射到我們使用的主機(jī)上胰苏。
docker ps 這里多了端口信息。
Docker 開放了 5000 端口(默認(rèn) Python Flask 端口)映射到主機(jī)端口 32769 上陕赃。
這時我們可以通過瀏覽器訪問WEB應(yīng)用
runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py -p來綁定指定端口
docker port 可以查看指定 (ID或者名字)容器的某個確定端口映射到宿主機(jī)的端口號毙玻。
docker port 7a38a1ad55c6
docker port determined_swanson
docker logs [ID或者名字] 可以查看容器內(nèi)部的標(biāo)準(zhǔn)輸出。
-f:讓 dokcer logs 像使用 tail -f 一樣來輸出容器內(nèi)部的標(biāo)準(zhǔn)輸出。
docker top determined_swanson 查看容器內(nèi)部運(yùn)行的進(jìn)程
docker inspect determined_swanson 來查看Docker的底層信息米者。它會返回一個 JSON 文件記錄著 Docker 容器的配置和狀態(tài)信息韭畸。
docker stop determined_swanson
docker start determined_swanson
docker rm determined_swanson 要先停止再移除
Dickerfile
Docker為我們提供了Dockerfile來自動化構(gòu)建鏡像
所有Dockerfile都必須以FROM命令開始宇智。 FROM命令會指定鏡像基于哪個基礎(chǔ)鏡像創(chuàng)建,接下來的命令也會基于這個基礎(chǔ)鏡像(譯者注:CentOS和Ubuntu有些命令可是不一樣的)胰丁。FROM命令可以多次使用随橘,表示會創(chuàng)建多個鏡像。具體語法如下:
FROM <image name>
MAINTAINER <author name> 設(shè)置鏡像作者
RUN 《command》 在shell或者exec的環(huán)境下執(zhí)行的命令锦庸。RUN指令會在新創(chuàng)建的鏡像上添加新的層面机蔗,接下來提交的結(jié)果用在Dockerfile的下一條指令中
ADD 《src》 《destination》 復(fù)制文件指令。它有兩個參數(shù)<source>和<destination>甘萧。destination是容器內(nèi)的路徑萝嘁。source可以是URL或者是啟動配置上下文中的一個文件。
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
EXPOSE <port>; 指定容器運(yùn)行時的監(jiān)聽端口
鏡像的使用
docker images # 顯示本地所有的鏡像列表
docker import # 從一個tar包創(chuàng)建一個鏡像扬卷,往往和export結(jié)合使用
docker build # 使用Dockerfile創(chuàng)建鏡像(推薦)
docker commit # 從容器創(chuàng)建鏡像
docker rmi # 刪除一個鏡像
docker load # 從一個tar包創(chuàng)建一個鏡像牙言,和save配合使用
docker save # 將一個鏡像保存為一個tar包,帶layers和tag信息
docker history # 顯示生成一個鏡像的歷史命令
docker tag # 為鏡像起一個別名
docker images
REPOSTITORY:表示鏡像的倉庫源
TAG:鏡像的標(biāo)簽
IMAGE ID:鏡像ID
CREATED:鏡像創(chuàng)建時間
SIZE:鏡像大小
同一倉庫源可以有多個 TAG邀泉,代表這個倉庫源的不同個版本嬉挡,如ubuntu倉庫源里,有15.10汇恤、14.04等多個不同的版本庞钢,我們使用 REPOSTITORY:TAG 來定義不同的鏡像。
指定使用ubuntu:15.10倉庫源
docker run -t -i ubuntu:15.10 /bin/bash
-t:在新容器內(nèi)指定一個偽終端或終端因谎。
-i:允許你對容器內(nèi)的標(biāo)準(zhǔn)輸入 (STDIN) 進(jìn)行交互基括。
exist 退出
- 構(gòu)建新的鏡像
當(dāng)我們在本地主機(jī)上使用一個不存在的鏡像時 Docker 就會自動下載這個鏡像。如果我們想預(yù)先下載這個鏡像财岔,我們可以使用 docker pull 命令來下載它风皿。
docker pull ubuntu:13.10
- 查找鏡像
我們可以從 Docker Hub 網(wǎng)站來搜索鏡像,Docker Hub 網(wǎng)址為: https://hub.docker.com/
docker search httpd
NAME:鏡像倉庫源的名稱
DESCRIPTION:鏡像的描述
OFFICIAL:是否docker官方發(fā)布
- 創(chuàng)建鏡像
當(dāng)我們從docker鏡像倉庫中下載的鏡像不能滿足我們的需求時匠璧,我們可以通過以下兩種方式對鏡像進(jìn)行更改桐款。
1.從已經(jīng)創(chuàng)建的容器中更新鏡像,并且提交這個鏡像
2.使用 Dockerfile 指令來創(chuàng)建一個新的鏡像
- 更新鏡像
docker run -t -i ubuntu:15.10 /bin/bash
在運(yùn)行的容器內(nèi)使用 apt-get update 命令進(jìn)行更新夷恍。 exist退出
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2 提交容器副本
-m:提交的描述信息
-a:指定鏡像作者
e218edb10161:容器ID
runoob/ubuntu:v2:指定要創(chuàng)建的目標(biāo)鏡像名:標(biāo)簽
docker images
docker run -t -i runoob/ubuntu:v2 /bin/bash
- 構(gòu)建鏡像
們使用命令 docker build 魔眨, 從零開始來創(chuàng)建一個新的鏡像。為此酿雪,我們需要創(chuàng)建一個 Dockerfile 文件遏暴,其中包含一組指令來告訴 Docker 如何構(gòu)建我們的鏡像。
每一個指令都會在鏡像上創(chuàng)建一個新的層指黎,每一個指令的前綴都必須是大寫的朋凉。
第一條FROM,指定使用哪個鏡像源
RUN 指令告訴docker 在鏡像內(nèi)執(zhí)行命令醋安,安裝了什么杂彭。墓毒。。
然后盖灸,我們使用 Dockerfile 文件蚁鳖,通過 docker build 命令來構(gòu)建一個鏡像磺芭。
ROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
docker build -t runoob/centos:6.7 .
參數(shù)說明:
-t :指定要創(chuàng)建的目標(biāo)鏡像名
. :Dockerfile 文件所在目錄赁炎,可以指定Dockerfile 的絕對路徑
docker images
我們可以使用新的鏡像來創(chuàng)建容器
run -t -i runoob/centos:6.7 /bin/bash
- 鏡像標(biāo)簽
docker tag 860c279d2fec runoob/centos:dev
容器連接
docker run -d -P training/webapp python app.py
-P 參數(shù)創(chuàng)建一個容器,使用 docker ps 來看到端口5000綁定主機(jī)端口32768钾腺。
我們也可以使用 -p 標(biāo)識來指定容器端口綁定到主機(jī)端口徙垫。
兩種方式的區(qū)別是:
-P :是容器內(nèi)部端口隨機(jī)映射到主機(jī)的高端口。
-p : 是容器內(nèi)部端口綁定到指定的主機(jī)端口
docker run -d -p 5000:5000 training/webapp python app.py
另外放棒,我們可以指定容器綁定的網(wǎng)絡(luò)地址姻报,比如綁定127.0.0.1。
docker run -d -p 127.0.0.1:5001:5002 training/webapp python app.py
上面的例子中间螟,默認(rèn)都是綁定 tcp 端口吴旋,如果要綁定 UDP 端口,可以在端口后面加上 /udp厢破。
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
docker port 命令可以讓我們快捷地查看端口的綁定情況荣瑟。
docker port adoring_stonebraker 5002
- Docker容器連接
端口映射并不是唯一把 docker 連接到另一個容器的方法。
docker有一個連接系統(tǒng)允許將多個容器連接在一起摩泪,共享連接信息笆焰。
docker連接會創(chuàng)建一個父子關(guān)系,其中父容器可以看到子容器的信息见坑。
當(dāng)我們創(chuàng)建一個容器的時候嚷掠,docker會自動對它進(jìn)行命名。另外荞驴,我們也可以使用--name標(biāo)識來命名容器
docker run -d -P --name runoob training/webapp python app.py
Docker Registry
docker login # 登錄到一個registry
docker search # 從registry倉庫搜索鏡像
docker pull # 從倉庫下載鏡像到本地
docker push # 將一個鏡像push到registry倉庫中
Docker Registry不皆。它是所有倉庫(包括共有和私有)以及工作流的中央Registry。在深入Docker Registry之前熊楼,讓我們先去看看一些常見的術(shù)語和與倉庫相關(guān)的概念霹娄。
Repositories(倉庫)可以被標(biāo)記為喜歡或者像書簽一樣標(biāo)記起來
用戶可以在倉庫下評論。
私有倉庫和共有倉庫類似孙蒙,不同之處在于前者不會在搜索結(jié)果中顯示项棠,也沒有訪問它的權(quán)限。只有用戶設(shè)置為合作者才能訪問私有倉庫挎峦。
成功推送之后配置webhooks香追。
Docker Registry有三個角色,分別是index坦胶、registry和registry client透典。
Docker 安裝 Python
- 官方鏡像
docker search python
docker pull python:2.7
在~/python/myapp目錄下創(chuàng)建一個 helloworld.py 文件晴楔,代碼如下:
#!/usr/bin/python
print("Hello, World!");
運(yùn)行容器
runoob@runoob:~/python$ docker run -v $PWD/myapp:/usr/src/myapp -w /usr/src/myapp python:3.5 python helloworld.py
命令說明:
-v $PWD/myapp:/usr/src/myapp :將主機(jī)中當(dāng)前目錄下的myapp掛載到容器的/usr/src/myapp
-w /usr/src/myapp :指定容器的/usr/src/myapp目錄為工作目錄
python helloworld.py :使用容器的python命令來執(zhí)行工作目錄中的helloworld.py文件
輸出結(jié)果:
Hello, World!
- Dockerfile
創(chuàng)建Dockerfile
首先,創(chuàng)建目錄python,用于存放后面的相關(guān)東西峭咒。
mkdir -p ~/python ~/python/myapp
myapp目錄將映射為python容器配置的應(yīng)用目錄
cd ~/python
vim Dockerfile
docker build -t python:3.5
DockerFile
Dockerfile
Dockerfile是docker構(gòu)建鏡像的基礎(chǔ)税弃,也是docker區(qū)別于其他容器的重要特征,正是有了Dockerfile凑队,docker的自動化和可移植性才成為可能则果。
不論是開發(fā)還是運(yùn)維,學(xué)會編寫Dockerfile幾乎是必備的漩氨,這有助于你理解整個容器的運(yùn)行西壮。
FROM , 從一個基礎(chǔ)鏡像構(gòu)建新的鏡像
FROM ubuntu
MAINTAINER , 維護(hù)者信息
MAINTAINER William wlj@nicescale.com
ENV , 設(shè)置環(huán)境變量
ENV TEST 1
RUN , 非交互式運(yùn)行shell命令
RUN apt-get -y update
RUN apt-get -y install nginx
ADD , 將外部文件拷貝到鏡像里,src可以為url
ADD http://nicescale.com/ /data/nicescale.tgz
WORKDIR /path/to/workdir, 設(shè)置工作目錄
WORKDIR /var/www
USER , 設(shè)置用戶ID
USER nginx
VULUME <#dir>, 設(shè)置volume
VOLUME [‘/data’]
EXPOSE , 暴露哪些端口
EXPOSE 80 443
ENTRYPOINT [‘executable’, ‘param1’,’param2’]執(zhí)行命令
ENTRYPOINT ["/usr/sbin/nginx"]
CMD [“param1”,”param2”]
CMD ["start"]
docker創(chuàng)建、啟動container時執(zhí)行的命令叫惊,如果設(shè)置了ENTRYPOINT款青,則CMD將作為參數(shù)
Dockerfile最佳實踐
盡量將一些常用不變的指令放到前面
CMD和ENTRYPOINT盡量使用json數(shù)組方式
通過Dockerfile構(gòu)建image
docker build csphere/nginx:1.7 .