利用Dockerfile制作個(gè)人的鏡像文件詳細(xì)講解
1. Dockerfile簡(jiǎn)介
簡(jiǎn)單來(lái)說(shuō),Dockerfile就是把我們安裝環(huán)境的每個(gè)步驟和指令,放到一個(gè)文件,最后一鍵執(zhí)行,最后做成一個(gè)你想要的環(huán)境。
Dockerfile是用來(lái)構(gòu)建Docker鏡像的構(gòu)建文件,是由一系列命令和參數(shù)構(gòu)成的腳本。
Docker構(gòu)建三步曲:
- 編寫dockerfile文件
- docker build 構(gòu)建image鏡像文件
- docker run 運(yùn)行容器
2. Dockerfile相關(guān)指令
Dockerfile 是一個(gè)包含創(chuàng)建鏡像所有命令的文本文件,通過(guò)docker build命令可以根據(jù) Dockerfile 的內(nèi)容構(gòu)建鏡像,
在介紹如何構(gòu)建之前先介紹下 Dockerfile 的基本語(yǔ)法結(jié)構(gòu)。
Dockerfile 有以下指令選項(xiàng):
- FROM 基礎(chǔ)鏡像,當(dāng)前新鏡像是基于哪個(gè)鏡像的
- MAINTAINER 鏡像維護(hù)者的姓名和郵箱地址
- RUN 容器構(gòu)建時(shí)需要運(yùn)行的命令
- CMD 指定一個(gè)容器啟動(dòng)時(shí)要運(yùn)行的命令。
dockerfile中可以有多個(gè)CMD指令,但只有最后一個(gè)生效,CMD會(huì)被docker run之后的參數(shù)替換。 - EXPOSE 當(dāng)前容器對(duì)外暴露的端口號(hào)
- ENV 用來(lái)在構(gòu)建鏡像過(guò)程中設(shè)置環(huán)境變量
- ADD 將宿主機(jī)目錄下的文件拷貝到鏡像里面并且ADD命令會(huì)自動(dòng)處理URL和解壓tar壓縮包
- COPY COPY:類似ADD,拷貝文件和目錄到鏡像中,但是它只是拷貝,不會(huì)自動(dòng)處理URL和解壓tar壓縮包。
- ENTRYPOINT 指定一個(gè)容器啟動(dòng)時(shí)要運(yùn)行的命令。
- ENTRYPOIT的目的和CMD一樣,都是在指定容器啟動(dòng)程序及參數(shù)。
- VOLUME 容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作
- USER 指定運(yùn)行容器時(shí)的用戶名或UID,后續(xù)的 RUN 也會(huì)使用指定用戶
- WORKDIR 指定在容器創(chuàng)建后,終端默認(rèn)登錄進(jìn)來(lái)工作目錄,一個(gè)落腳點(diǎn)
- ONBUILD 當(dāng)構(gòu)建一個(gè)被繼承的Dockerfile時(shí)運(yùn)行命令,父鏡像在被子繼承后,父鏡像的onbuild被觸發(fā)。
3. Dockerfile編寫
在當(dāng)前目錄新建一個(gè)文件夾docker-run, cd進(jìn)入到文件夾,touch新建一個(gè)Dockerfile,然后vi打開文件,開始編輯
[root@yoyo ~]# mkdir docker-run [root@yoyo ~]# cd docker-run/ [root@yoyo docker-run]# touch Dockerfile [root@yoyo docker-run]# vi Dockerfile
編輯內(nèi)容如下:
# 更新pip RUN pip install --upgrade pip # 工作目錄 WORKDIR /code ADD . /code # pip安裝依賴包 RUN pip install -r requirements.txt # 傳遞參數(shù) ENTRYPOINT ["pytest"] # 默認(rèn)顯示help幫助信息 CMD ["--help"]
4. requirements.txt
requirements.txt是python的相關(guān)依賴包, 可以通過(guò)freeze命令生成
pip3 freeze >requirements.txt
[root@yoyo docker-run]# cat requirements.txt APScheduler==3.5.3 asn1crypto==0.24.0 atomicwrites==1.3.0 attrs==18.2.0 backports.csv==1.0.7 bcrypt==3.1.7 beautifulsoup4==4.7.1 cached-property==1.5.1 certifi==2018.11.29 cffi==1.12.3 chardet==3.0.4 cryptography==2.7 DBUtils==1.3 defusedxml==0.5.0 diff-match-patch==20181111 Django==2.1.4 django-bootstrap3==11.0.0 django-crispy-forms==1.7.2 django-formtools==2.1 django-import-export==1.2.0 django-ranged-response==0.2.0 django-reversion==3.0.3 django-simple-captcha==0.5.10 django-stdimage==4.0.1 docker==3.7.3 docker-compose==1.24.1 docker-pycreds==0.4.0 dockerpty==0.4.1 docopt==0.6.2 et-xmlfile==1.0.1 future==0.17.1 httplib2==0.12.1 idna==2.7 jdcal==1.4 jsonschema==2.6.0 more-itertools==6.0.0 mysqlclient==1.4.2.post1 odfpy==1.4.0 openpyxl==2.6.1 paramiko==2.6.0 Pillow==5.4.1 pluggy==0.6.0 progressbar2==3.39.3 py==1.7.0 pycparser==2.19 pymssql==2.1.4 PyMySQL==0.9.3 PyNaCl==1.3.0 pytest==3.6.3 python-utils==2.3.0 pytz==2018.7 PyYAML==3.13 requests==2.20.1 six==1.12.0 soupsieve==1.7.3 tablib==0.13.0 texttable==0.9.1 tzlocal==1.5.1 urllib3==1.24.1 websocket-client==0.56.0 xlrd==1.2.0 xlwt==1.3.0
5. build構(gòu)建鏡像文件
docker build 命令用于使用 Dockerfile 創(chuàng)建鏡像。OPTIONS說(shuō)明:
- -f :指定要使用的Dockerfile路徑;
- -pull :嘗試去更新鏡像的新版本;
- -quiet, -q :安靜模式,成功后只輸出鏡像 ID;
- -tag, -t: 鏡像的名字及標(biāo)簽,通常 name:tag 或者 name 格式;可以在一次構(gòu)建中為一個(gè)鏡像設(shè)置多個(gè)標(biāo)簽。
-t參數(shù)設(shè)置鏡像名稱yoyo_pytes和tag標(biāo)簽名稱v1,注意最后面有個(gè)點(diǎn).
docker build -t yoyo_pytest:v1 .
[root@yoyo docker-run]# docker build -t yoyo_pytest:v1 . Sending build context to Docker daemon 11.78kB Step 1/8 : FROM python:3.6 ---> cfcdf565ff94 Step 2/8 : MAINTAINER yoyo <283340479@qq.com> ---> Using cache ---> f523b919fcf9 Step 3/8 : RUN pip install --upgrade pip ---> Using cache ---> 3399b50dab4e Step 4/8 : WORKDIR /code ---> Using cache ---> 7223a20e17fd Step 5/8 : ADD . /code ---> 650b554ccd6c Step 6/8 : RUN pip install -r requirements.txt ---> Running in 0e49d444f7d8
運(yùn)行過(guò)程中可以看到按步驟運(yùn)行,如:Step 1/8
運(yùn)行完成后,可以通過(guò)docker images查看生成的鏡像
[root@yoyo docker-run]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE yoyo_pytest v1 6b4267ce7ac4 21 seconds ago 1.02GB [root@yoyo docker-run]#
6. run運(yùn)行容器
在當(dāng)前目錄新建一個(gè)test_h.py文件,寫入pytest測(cè)試腳本
import pytest def test_one(): print("正在執(zhí)行----test_one") x = "this" assert 'h' in x def test_two(): print("正在執(zhí)行----test_two") x = "hello" assert x def test_three(): print("正在執(zhí)行----test_three") a = "hello" b = "hello world" assert a in b if __name__ == "__main__": pytest.main(["-s", "test_h.py"])
使用docker run運(yùn)行容器
- -it -t讓docker分配一個(gè)偽終端并綁定到容器的標(biāo)準(zhǔn)輸入上, -i則讓容器的標(biāo)準(zhǔn)輸入保持打開.
- -rm 容器退出時(shí),自動(dòng)清除容器。
- -rm選項(xiàng)不能與-d同時(shí)使用
- -v 將容器的工作目錄/code掛載到宿主機(jī)的$PWD,也就是當(dāng)前目錄
- yoyo_pytest:v1 容器名稱和tag名稱
- test_h.py 后面跟著需要執(zhí)行的腳本名稱
[root@yoyo docker-run]# docker run -it --rm -v "$PWD":/code yoyo_pytest:v1 test_h.py -s ================================================================== test session starts ================================================================== platform linux -- Python 3.6.9, pytest-3.6.3, py-1.7.0, pluggy-0.6.0 rootdir: /code, inifile: collected 3 items test_h.py 正在執(zhí)行----test_one .正在執(zhí)行----test_two .正在執(zhí)行----test_three . =============================================================== 3 passed in 0.01 seconds
到此這篇關(guān)于利用Dockerfile制作個(gè)人的鏡像文件詳細(xì)講解的文章就介紹到這了,更多相關(guān)Dockerfile 鏡像文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker 搭建lamp應(yīng)用實(shí)例詳解
這篇文章主要介紹了Docker 搭建lamp應(yīng)用實(shí)例詳解的相關(guān)資料,這里對(duì)搭建 LAMP的步驟做了詳細(xì)介紹,需要的朋友可以參考下2016-11-11centos6使用docker部署zookeeper操作示例
這篇文章主要介紹了centos6使用docker部署zookeeper操作,結(jié)合實(shí)例形式分析了centos6平臺(tái)使用docker部署zookeeper相關(guān)命令與使用技巧,需要的朋友可以參考下2020-02-02docker運(yùn)行PostgreSQL數(shù)據(jù)庫(kù)維護(hù)執(zhí)行腳本備份數(shù)據(jù)庫(kù)與更新表結(jié)構(gòu)的方法
這篇文章主要介紹了docker運(yùn)行PostgreSQL數(shù)據(jù)庫(kù)維護(hù),執(zhí)行腳本備份數(shù)據(jù)庫(kù)與更新表結(jié)構(gòu),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05docker簡(jiǎn)單安裝部署mysql并配置遠(yuǎn)程連接
使用docker部署mysql,可以省去mysql的安裝配置過(guò)程,下面這篇文章主要給大家介紹了關(guān)于docker簡(jiǎn)單安裝部署mysql并配置遠(yuǎn)程連接的相關(guān)資料,需要的朋友可以參考下2023-06-06Docker容器的網(wǎng)絡(luò)管理和網(wǎng)絡(luò)隔離的實(shí)現(xiàn)
這篇文章主要介紹了Docker容器的網(wǎng)絡(luò)管理和網(wǎng)絡(luò)隔離的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05