最近妹萨,在公司做爬蟲用到了Docker贪薪,打算灌水一下。
Docker 是什么眠副?
關(guān)于這個(gè)話題画切,我就不用怎么說明了,具體見Docker官網(wǎng)囱怕。實(shí)際我也不知道怎么說霍弹,哈哈哈~~~~~
其實(shí)Docker鏡像的創(chuàng)建有兩種方式毫别,一是在其他的鏡像修改之上創(chuàng)建的,二是通過DockerFile文件來創(chuàng)建典格。本文通過DockerFile來創(chuàng)建鏡像岛宦。
DockerFile
首先我們來看一下語法:
(1) FROM
指定基礎(chǔ)鏡像,每一個(gè)鏡像的創(chuàng)建都需要一個(gè)基礎(chǔ)鏡像耍缴。
#image 代表的是鏡像名 tag 代表這個(gè)鏡像的版本
FROM <image>:<tag>
#這里有兩種寫法
FROM ubuntu:14.04
#如果沒有指定版本 則是默認(rèn)指定最新的版本
FROM ubuntu
(2) MAINTAINER
指定作者砾肺, 這個(gè)不用多說。
#name 隨意
MAINTAINER <name>
# 指定作者為sujian 附加了網(wǎng)址
MAINTAINER sujian "www.sujian.com"
(3) ENV
設(shè)置環(huán)境變量防嗡,方便后面的一些命令執(zhí)行变汪。
#key 變量名 value 變量值
ENV <key> <value>
# Python版本為2.7.13
ENV PYTHON_VERSION 2.7.13
#JAVA_HOMO目錄
ENV JAVA_HOME /xxx/xxx/xxx
(4) RUN
執(zhí)行基礎(chǔ)鏡像中的命令,前提是基礎(chǔ)鏡像中存在這個(gè)命令蚁趁。
#兩種格式 一是直接寫命令 另外一種將命令和執(zhí)行參數(shù)分開
#調(diào)用/bin/sh -c <command>
RUN <command>
#調(diào)用exec執(zhí)行
RUN ["executable", "param1", "param2" ... ]
# 運(yùn)行名為main的python文件
RUN python main.py
RUN ["python", "main.py"]
(5) ADD
將構(gòu)建環(huán)境中的文件或者目錄下的全部文件拷貝到鏡像中的指定目錄裙盾。
#src 文件或者目錄的相對(duì)路徑 dest 鏡像中的絕對(duì)路徑
ADD <src> <dest>
# 復(fù)制文件到指定文件 文件存在則內(nèi)容覆蓋,文件不存在則創(chuàng)建文件
ADD test.txt /root/test.txt
# 復(fù)制文件到指定文件夾 文件存在則內(nèi)容覆蓋他嫡,文件不存在則創(chuàng)建文件
ADD test.txt /root/
# 復(fù)制文件夾到指定文件夾
ADD test_dir data_dir
# 復(fù)制壓縮文件到指定文件夾 注意:ADD命令復(fù)制的是一個(gè)壓縮文件番官,會(huì)自動(dòng)解壓到指定目錄
ADD test.tar /test
(6) COPY
COPY命令和ADD基本一致,但是有一些差別钢属。
(1)如果復(fù)制的是一個(gè)解壓文件徘熔,COPY命令不會(huì)解壓到指定目錄中的,而是復(fù)制到指定目錄淆党。
(2)COPY命令不能從網(wǎng)絡(luò)下載近顷,但ADD命令可以從網(wǎng)絡(luò)下載。
(7) WORKDIR
切換目錄宁否,類似于Linux中的cd命令窒升。
#path 路徑
WORKDIR <path>
#切換到/python/project目錄
WORKDIR /python/project
(8) VOLUME
設(shè)置一個(gè)掛載點(diǎn),可以用來進(jìn)行容器間的數(shù)據(jù)共享或者實(shí)現(xiàn)容器的數(shù)據(jù)的遷移慕匠、備份和恢復(fù)饱须。
#path 路徑
VOLUME ["path"]
#設(shè)置/python/project為掛載點(diǎn)
VOLUME ["/python/project"]
(9) EXPOSE
將容器中的端口暴露給宿主機(jī),在容器運(yùn)行的時(shí)候需要與宿主機(jī)作端口映射台谊。
#port 暴露端口
EXPOSE <port> [<port>...]
#暴露8080 5000 給宿主機(jī)
EXPOSE 8080 5000
(10) CMD
容器啟動(dòng)時(shí)執(zhí)行的命令蓉媳,CMD在DockerFile中只能有一條,如果有多條只能最后一條能夠生效锅铅。
注意:執(zhí)行這個(gè)命令的時(shí)候酪呻,一般都是要執(zhí)行一個(gè)阻塞的服務(wù),因?yàn)橹挥羞@樣盐须,容器才會(huì)一直運(yùn)行玩荠,否則,容器只有很短的生命周期。如果開始的服務(wù)不是阻賽式的阶冈,可以用一個(gè)for循環(huán)闷尿,來一直執(zhí)行某條語句,保證程序不被結(jié)束女坑。
#調(diào)用exec執(zhí)行
CMD ["executable","param1","param2"]
#調(diào)用/bin/sh -c <command>
CMD command param1 param2
# 運(yùn)行名為main的python文件
CMD python main.py
#推薦使用這種方式
CMD ["python", "main.py"]
以上填具,是DockerFile創(chuàng)建鏡像常用的命令,下面我們來實(shí)戰(zhàn)一把匆骗,寫一個(gè)簡單的DockerFile劳景。
實(shí)戰(zhàn)--創(chuàng)建一個(gè)Web Server的鏡像
既然要?jiǎng)?chuàng)建一個(gè)Web Server的鏡像,我們首先得有呀碉就。我們使用Flask來作為一個(gè)Web框架盟广,F(xiàn)lask詳見 Flask文檔
#app.py
#這幾段代碼大概的意思就是在本地開啟一個(gè)服務(wù),映射的端口為5000
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello DockerFile!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
#運(yùn)行的命令
python app.py
運(yùn)行之后是這個(gè)樣子
好了下面我們來開始寫DockerFile吧
#Dockerfile
#基礎(chǔ)鏡像ubuntu
FROM ubuntu:14.04
#作者
MAINTAINER sujian
#更新 以及安裝python 這個(gè)不安裝 應(yīng)該也沒事的
RUN apt-get update && \
apt-get install -y \
python python-dev python-pip
#安裝flask
RUN ["pip","install","flask"]
#創(chuàng)建文件夾
RUN mkdir -p /flask/project
#復(fù)制文件到相應(yīng)目錄
COPY app.py /flask/project/
#切換目錄到/flask/project
WORKDIR /flask/project
#暴露端口
EXPOSE 5000
#容器啟動(dòng)時(shí) 執(zhí)行的命令 運(yùn)行flask程序
CMD ["python","app.py"]
我們來運(yùn)行一下铝噩,我是用的Window中的Docker中構(gòu)建的(在虛擬機(jī)中的Linux衡蚂,網(wǎng)速慢的要死窿克,如果有條件的話骏庸,可以用國外的服務(wù)器來構(gòu)建)
#首先把a(bǔ)pp.py Dockerfile文件一起放到一個(gè)文件夾下面 然后運(yùn)行
docker build -t flask . #flask 是鏡像的名字
運(yùn)行結(jié)果如下:
然后啟動(dòng)容器
#這條命令運(yùn)行flask鏡像 并把flask鏡像中的5000端口和宿主機(jī)中的6000端口作映射
docker run -p 6000:5000 flask
運(yùn)行結(jié)果如下:
好了,一個(gè)DockerFile就寫好了年叮,本文也就到此結(jié)束了具被,如有錯(cuò)誤歡迎斧正。