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)建容器的只讀模板,包含容器啟動(dòng)所需的一切信息,包括運(yùn)行程序和配置數(shù)據(jù)
Docker容器 Container Hosts 獨(dú)立的應(yīng)用
Docker客戶(hù)端 Client
Docker主機(jī) Host 一個(gè)物理或者虛擬的機(jī)器用于執(zhí)行Docker守護(hù)進(jìn)程和容器
Docker倉(cāng)庫(kù) Registry 用于保存鏡像
Docker Machine Docker Machine是一個(gè)簡(jiǎn)化Docker安裝的命令行工具,通過(guò)一個(gè)簡(jiǎn)單的命令行即可在相應(yīng)的平臺(tái)上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。
-
三個(gè)組件:
Docker Client 是用戶(hù)界面,它支持用戶(hù)與Docker Daemon之間通信。
Docker Daemon運(yùn)行于主機(jī)上,處理服務(wù)請(qǐng)求。
Docker Index是中央registry,支持擁有公有與私有訪問(wèn)權(quán)限的Docker容器鏡像的備份。
-
三要素:
Docker Containers 容器負(fù)責(zé)應(yīng)用程序的運(yùn)行,包括操作系統(tǒng)、用戶(hù)添加的文件以及元數(shù)據(jù)
Docker Images是一個(gè)只讀模板,用來(lái)運(yùn)行Docker容器。
DockerFile是文件指令集,用來(lái)說(shuō)明如何自動(dòng)創(chuàng)建Docker鏡像。
Docker Client的是交互層
Docker Daemon負(fù)責(zé)實(shí)際操作:
1, 基于Dockerfile的指令構(gòu)建鏡像Docker Images, 然后推送到中央registry:Docker Index, 以供他人使用, 公有或者私有訪問(wèn)權(quán)限
2,運(yùn)行容器 運(yùn)行容器源于我們?cè)诘谝徊街袆?chuàng)建的鏡像。當(dāng)容器被啟動(dòng)后,一個(gè)讀寫(xiě)層會(huì)被添加到鏡像的頂層。當(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") 啟動(dòng)sample_job的容器(后臺(tái)模式)
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
這個(gè)長(zhǎng)字符叫做容器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)建一個(gè)容器但是不啟動(dòng)它
docker run # 創(chuàng)建并啟動(dòng)一個(gè)容器
docker stop # 停止容器運(yùn)行,發(fā)送信號(hào)SIGTERM
docker start # 啟動(dòng)一個(gè)停止?fàn)顟B(tài)的容器
docker restart # 重啟一個(gè)容器
docker rm # 刪除一個(gè)容器
docker kill # 發(fā)送信號(hào)給容器,默認(rèn)SIGKILL
docker attach # 連接(進(jìn)入)到一個(gè)正在運(yùn)行的容器
docker wait # 阻塞到一個(gè)容器,直到容器停止運(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ù)器的實(shí)時(shí)的事件
docker port # 顯示容器的端口映射
docker top # 顯示容器的進(jìn)程信息
docker diff # 顯示容器文件系統(tǒng)的前后變化
導(dǎo)出容器
docker cp # 從容器里向外拷貝文件或目錄
docker export # 將容器整個(gè)文件系統(tǒng)導(dǎo)出為一個(gè)tar包,不帶layers、tag等信息
執(zhí)行
docker exec # 在容器里執(zhí)行一個(gè)命令,可以執(zhí)行bash進(jìn)入交互式
運(yùn)行web應(yīng)用
docker run -d -P training/webapp python app.py 運(yùn)行一個(gè)python Flask應(yīng)用
-d 后臺(tái)模式
-P 將容器內(nèi)部使用的網(wǎng)絡(luò)端口映射到我們使用的主機(jī)上。
docker ps 這里多了端口信息。
Docker 開(kāi)放了 5000 端口(默認(rèn) Python Flask 端口)映射到主機(jī)端口 32769 上。
這時(shí)我們可以通過(guò)瀏覽器訪問(wèn)WEB應(yīng)用
runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py -p來(lái)綁定指定端口
docker port 可以查看指定 (ID或者名字)容器的某個(gè)確定端口映射到宿主機(jī)的端口號(hào)。
docker port 7a38a1ad55c6
docker port determined_swanson
docker logs [ID或者名字] 可以查看容器內(nèi)部的標(biāo)準(zhǔn)輸出。
-f:讓 dokcer logs 像使用 tail -f 一樣來(lái)輸出容器內(nèi)部的標(biāo)準(zhǔn)輸出。
docker top determined_swanson 查看容器內(nèi)部運(yùn)行的進(jìn)程
docker inspect determined_swanson 來(lái)查看Docker的底層信息。它會(huì)返回一個(gè) JSON 文件記錄著 Docker 容器的配置和狀態(tài)信息。
docker stop determined_swanson
docker start determined_swanson
docker rm determined_swanson 要先停止再移除
Dickerfile
Docker為我們提供了Dockerfile來(lái)自動(dòng)化構(gòu)建鏡像
所有Dockerfile都必須以FROM命令開(kāi)始。 FROM命令會(huì)指定鏡像基于哪個(gè)基礎(chǔ)鏡像創(chuàng)建,接下來(lái)的命令也會(huì)基于這個(gè)基礎(chǔ)鏡像(譯者注:CentOS和Ubuntu有些命令可是不一樣的)。FROM命令可以多次使用,表示會(huì)創(chuàng)建多個(gè)鏡像。具體語(yǔ)法如下:
FROM <image name>
MAINTAINER <author name> 設(shè)置鏡像作者
RUN 《command》 在shell或者exec的環(huán)境下執(zhí)行的命令。RUN指令會(huì)在新創(chuàng)建的鏡像上添加新的層面,接下來(lái)提交的結(jié)果用在Dockerfile的下一條指令中
ADD 《src》 《destination》 復(fù)制文件指令。它有兩個(gè)參數(shù)<source>和<destination>。destination是容器內(nèi)的路徑。source可以是URL或者是啟動(dòng)配置上下文中的一個(gè)文件。
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
EXPOSE <port>; 指定容器運(yùn)行時(shí)的監(jiān)聽(tīng)端口
鏡像的使用
docker images # 顯示本地所有的鏡像列表
docker import # 從一個(gè)tar包創(chuàng)建一個(gè)鏡像,往往和export結(jié)合使用
docker build # 使用Dockerfile創(chuàng)建鏡像(推薦)
docker commit # 從容器創(chuàng)建鏡像
docker rmi # 刪除一個(gè)鏡像
docker load # 從一個(gè)tar包創(chuàng)建一個(gè)鏡像,和save配合使用
docker save # 將一個(gè)鏡像保存為一個(gè)tar包,帶layers和tag信息
docker history # 顯示生成一個(gè)鏡像的歷史命令
docker tag # 為鏡像起一個(gè)別名
docker images
REPOSTITORY:表示鏡像的倉(cāng)庫(kù)源
TAG:鏡像的標(biāo)簽
IMAGE ID:鏡像ID
CREATED:鏡像創(chuàng)建時(shí)間
SIZE:鏡像大小
同一倉(cāng)庫(kù)源可以有多個(gè) TAG,代表這個(gè)倉(cāng)庫(kù)源的不同個(gè)版本,如ubuntu倉(cāng)庫(kù)源里,有15.10、14.04等多個(gè)不同的版本,我們使用 REPOSTITORY:TAG 來(lái)定義不同的鏡像。
指定使用ubuntu:15.10倉(cāng)庫(kù)源
docker run -t -i ubuntu:15.10 /bin/bash
-t:在新容器內(nèi)指定一個(gè)偽終端或終端。
-i:允許你對(duì)容器內(nèi)的標(biāo)準(zhǔn)輸入 (STDIN) 進(jìn)行交互。
exist 退出
- 構(gòu)建新的鏡像
當(dāng)我們?cè)诒镜刂鳈C(jī)上使用一個(gè)不存在的鏡像時(shí) Docker 就會(huì)自動(dòng)下載這個(gè)鏡像。如果我們想預(yù)先下載這個(gè)鏡像,我們可以使用 docker pull 命令來(lái)下載它。
docker pull ubuntu:13.10
- 查找鏡像
我們可以從 Docker Hub 網(wǎng)站來(lái)搜索鏡像,Docker Hub 網(wǎng)址為: https://hub.docker.com/
docker search httpd
NAME:鏡像倉(cāng)庫(kù)源的名稱(chēng)
DESCRIPTION:鏡像的描述
OFFICIAL:是否docker官方發(fā)布
- 創(chuàng)建鏡像
當(dāng)我們從docker鏡像倉(cāng)庫(kù)中下載的鏡像不能滿(mǎn)足我們的需求時(shí),我們可以通過(guò)以下兩種方式對(duì)鏡像進(jìn)行更改。
1.從已經(jīng)創(chuàng)建的容器中更新鏡像,并且提交這個(gè)鏡像
2.使用 Dockerfile 指令來(lái)創(chuàng)建一個(gè)新的鏡像
- 更新鏡像
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:指定要?jiǎng)?chuàng)建的目標(biāo)鏡像名:標(biāo)簽
docker images
docker run -t -i runoob/ubuntu:v2 /bin/bash
- 構(gòu)建鏡像
們使用命令 docker build , 從零開(kāi)始來(lái)創(chuàng)建一個(gè)新的鏡像。為此,我們需要?jiǎng)?chuàng)建一個(gè) Dockerfile 文件,其中包含一組指令來(lái)告訴 Docker 如何構(gòu)建我們的鏡像。
每一個(gè)指令都會(huì)在鏡像上創(chuàng)建一個(gè)新的層,每一個(gè)指令的前綴都必須是大寫(xiě)的。
第一條FROM,指定使用哪個(gè)鏡像源
RUN 指令告訴docker 在鏡像內(nèi)執(zhí)行命令,安裝了什么。。。
然后,我們使用 Dockerfile 文件,通過(guò) docker build 命令來(lái)構(gòu)建一個(gè)鏡像。
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ù)說(shuō)明:
-t :指定要?jiǎng)?chuàng)建的目標(biāo)鏡像名
. :Dockerfile 文件所在目錄,可以指定Dockerfile 的絕對(duì)路徑
docker images
我們可以使用新的鏡像來(lái)創(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)建一個(gè)容器,使用 docker ps 來(lái)看到端口5000綁定主機(jī)端口32768。
我們也可以使用 -p 標(biāo)識(shí)來(lái)指定容器端口綁定到主機(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 連接到另一個(gè)容器的方法。
docker有一個(gè)連接系統(tǒng)允許將多個(gè)容器連接在一起,共享連接信息。
docker連接會(huì)創(chuàng)建一個(gè)父子關(guān)系,其中父容器可以看到子容器的信息。
當(dāng)我們創(chuàng)建一個(gè)容器的時(shí)候,docker會(huì)自動(dòng)對(duì)它進(jìn)行命名。另外,我們也可以使用--name標(biāo)識(shí)來(lái)命名容器
docker run -d -P --name runoob training/webapp python app.py
Docker Registry
docker login # 登錄到一個(gè)registry
docker search # 從registry倉(cāng)庫(kù)搜索鏡像
docker pull # 從倉(cāng)庫(kù)下載鏡像到本地
docker push # 將一個(gè)鏡像push到registry倉(cāng)庫(kù)中
Docker Registry。它是所有倉(cāng)庫(kù)(包括共有和私有)以及工作流的中央Registry。在深入Docker Registry之前,讓我們先去看看一些常見(jiàn)的術(shù)語(yǔ)和與倉(cāng)庫(kù)相關(guān)的概念。
Repositories(倉(cāng)庫(kù))可以被標(biāo)記為喜歡或者像書(shū)簽一樣標(biāo)記起來(lái)
用戶(hù)可以在倉(cāng)庫(kù)下評(píng)論。
私有倉(cāng)庫(kù)和共有倉(cāng)庫(kù)類(lèi)似,不同之處在于前者不會(huì)在搜索結(jié)果中顯示,也沒(méi)有訪問(wèn)它的權(quán)限。只有用戶(hù)設(shè)置為合作者才能訪問(wèn)私有倉(cāng)庫(kù)。
成功推送之后配置webhooks。
Docker Registry有三個(gè)角色,分別是index、registry和registry client。
Docker 安裝 Python
- 官方鏡像
docker search python
docker pull python:2.7
在~/python/myapp目錄下創(chuàng)建一個(gè) 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
命令說(shuō)明:
-v $PWD/myapp:/usr/src/myapp :將主機(jī)中當(dāng)前目錄下的myapp掛載到容器的/usr/src/myapp
-w /usr/src/myapp :指定容器的/usr/src/myapp目錄為工作目錄
python helloworld.py :使用容器的python命令來(lái)執(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的自動(dòng)化和可移植性才成為可能。
不論是開(kāi)發(fā)還是運(yùn)維,學(xué)會(huì)編寫(xiě)Dockerfile幾乎是必備的,這有助于你理解整個(gè)容器的運(yùn)行。
FROM , 從一個(gè)基礎(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è)置用戶(hù)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)建、啟動(dòng)container時(shí)執(zhí)行的命令,如果設(shè)置了ENTRYPOINT,則CMD將作為參數(shù)
Dockerfile最佳實(shí)踐
盡量將一些常用不變的指令放到前面
CMD和ENTRYPOINT盡量使用json數(shù)組方式
通過(guò)Dockerfile構(gòu)建image
docker build csphere/nginx:1.7 .