# 映象從哪來的? 1 docker pull 拉的 2 透過容器打包成映象 -centos映象執行成容器---》裝了vim -把裝了vim的容器---》打包成映象 -以後拿到這個映象--》再執行成容器,都會帶vim命令 3 Dockerfile構建 # 容器儲存為映象 -執行一個centos容器 docker run -id --name centos_vim centos:centos7 -在容器中裝vim docker exec -it a6e240 /bin/bash yum install vim -y -把容器做成映象(centos+vim) docker commit centos_vim centos_vim_image -把centos_vim 容器刪除 docker rm centos_vim -f -基於新構建的映象,執行成容器 docker run -id --name centos_vim centos_vim_image:latest -進入到容器中,檢視,軟體都在 docker exec -it c3e633bd1 /bin/bash # 本地映象---推送到遠端docker倉庫中---》私有倉庫(公司內會有私有倉庫--》推送上去,給別人用) -早期 這個是免費的---》後期好像收費 -給映象打個tag docker tag 映象id 映象新名字(賬號名/映象名) -登入到你賬號中 docker login 輸入賬號密碼 -docker push 映象名字 docker push 映象新名字 -別人就可以下載了 程式碼寫好---》做到容器內---》拿到專案映象 專案映象 v1.1 專案映象 v1.2 專案映象 v1.3 專案映象 v2.1---->執行成容器 # 映象備份和恢復 docker save -o centos_vim_image.tar centos_vim_image -刪除容器,刪除映象 -把備份的映象恢復 docker load -i centos_vim_image.tar
# 映象從哪裡來的? 1 遠端倉庫拉取的 docker pull (hub.docker---》搭建私有倉庫) 2 用容器做成的映象 docker commit 3 把備份的恢復 docker load 4 使用Dockerfile來構建(這種多) # 什麼是Dockerfile Dockerfile是由一系列命令和引數構成的指令碼檔案,這些命令應用於基礎映象並最終建立一個新的映象 # centos7中,裝了vim,在根路徑下新建了一個檔案 lqz.txt,寫了寫內容 # Dockerfile的命令 FROM 基礎映象 #基於哪個基礎映象來構建 MAINTAINER lqz # 宣告映象的建立者 ENV key value # 設定環境變數 (可以寫多條) RUN command #是Dockerfile的核心部分(可以寫多條) ADD source_dir/file dest_dir/file #將宿主機的檔案複製到映象內,如果是一個壓縮檔案,將會在複製後自動解壓 COPY source_dir/file dest_dir/file # 和ADD相似,但是如果有壓縮檔案並不能解壓 WORKDIR lqz # 設定工作目錄,執行起這個容器,來到的路徑就是這個路徑 RUN # 啟動並執行容器執行的命令
# 構建一個帶vim的centos:7映象,根路徑下有/lqz/ss.py vim Dockerfile FROM centos:centos7 MAINTAINER lqz ENV name lqz RUN yum install vim -y RUN mkdir /lqz RUN touch /lqz/ss.py RUN echo 'print(1)' > /lqz/ss.py COPY ./aa.txt /lqz/aa.txt WORKDIR /lqz # 基於dockerfile構建映象,不要忘了 . 基於當前路徑下的Dockerfile 構建映象 docker build -t='centos_lqz_vim' . docker images # 基於這個映象執行容器 docker run -id --name xx centos_lqz_vim # 進入到容器 docker exec -it xx /bin/bash # 驗證vim,和資料夾,檔案是否存在
FROM centos:centos7 MAINTAINER lqz ENV name lqz RUN mkdir /lqz RUN touch /lqz/ss.py RUN echo 'input()' > /lqz/ss.py WORKDIR /lqz CMD ['python' './ss.py'] # 執行容器時會預設加上 /bin/sh -c # 基於dockerfile構建映象,不要忘了 . 基於當前路徑下的Dockerfile 構建映象 docker build -t='centos_py' . docker images # 基於這個映象執行容器 docker run -id --name yy centos_py python /lqz/ss.py # 進入到容器 docker exec -it xx /bin/bash # 檢視環境變數 # python看 os.environ.get('name') # shell看 echo $name
# https://zhuanlan.zhihu.com/p/419175543?utm_id=0 FROM: 指定基礎映象 RUN: 構建映象過程中需要執行的命令。可以有多條。docker build CMD:新增啟動容器時需要執行的命令。多條只有最後一條生效。可以在啟動容器時被覆蓋和修改 ENTRYPOINT:同CMD,但這個一定會被執行,不會被覆蓋修改。 MLABELAINTAINER:表明映象的作者。將被遺棄,被LABEL代替。 EXPOSE:設定對外暴露的埠。 ENV:設定執行命令時的環境變數,並且在構建完成後,仍然生效 ARG:設定只在構建過程中使用的環境變數,構建完成後,將消失 ADD:將本地檔案或目錄複製到映象的檔案系統中。能解壓特定格式檔案,能將URL作為要複製的檔案 COPY:將本地檔案或目錄複製到映象的檔案系統中。 VOLUME:新增資料卷 USER:指定以哪個使用者的名義執行RUN, CMD 和ENTRYPOINT等命令 WORKDIR:設定工作目錄 # docker logs 容器名字/id號 檢視映象執行成容器時,錯誤日誌 -如果容器沒起來,看日誌排查錯誤 # CMD ENTRYPOINT #相同點: 只能寫一條,如果寫了多條,那麼只有最後一條生效。 容器啟動時才執行,執行時機相同。 # 不同點: ENTRYPOINT不會被執行的command覆蓋,而CMD則會被覆蓋。 如果我們在Dockerfile中同時寫了ENTRYPOINT和CMD,並且CMD指令不是一個完整的可執行命令,那麼CMD指定的內容將會作為ENTRYPOINT的引數 # ARG 和 ENV ENV:設定執行命令時的環境變數,並且在構建完成後,仍然生效 ARG:設定只在構建過程中使用的環境變數,構建完成後,將消失
# 案例Dockerfile FROM centos:centos7 MAINTAINER lqz ENV name lqz ARG age=19 RUN mkdir /lqz RUN touch /lqz/ss.py RUN echo 'input()' > /lqz/ss.py RUN echo $age WORKDIR /lqz CMD python ./ss.py # docker build -t='xxxx' .
# 以圖書管理系統為例---》公司使用docker流程 # 公司中,使用Docker開發的工作流程 第一步:有一個專案,pycharm開發著,開發完後 第二步:在專案路徑下新建Dockerfile,寫入 FROM python:3.8 MAINTAINER lqz WORKDIR /soft COPY ./requirements.txt /soft/requirements.txt RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple CMD ["python","manage.py","runserver","0.0.0.0:8080"] 第三步:把程式碼提交到git ------------------ 第四步:上線人員:在上線機器上,把程式碼啦下來 git clone https://gitee.com/liuqingzheng/books.git 第五步:構建映象 docker build -t='django_books' . 第六步:執行容器 docker run -id --name=books -v /root/books:/soft -p 8080:8080 django_books:latest 第七步:其它人訪問宿主機的8080埠就能看到專案了 --------- 第八步:開發人員繼續提交程式碼 第九步:運維人員pull程式碼,重啟容器,使用者就可以看到最新的了 重啟docker容器即可(第三方依賴變了)--》重寫構建映象,執行容器
# 有個遠端倉庫 ,docker官方提供的 ---》我們可以把我們的映象傳上去
# 公司做的映象,一般不放在遠端倉庫,公司會自己搭建私有倉庫(把公司製作的映象傳到私有倉庫)
# 第0步:在遠端建立倉庫 # 第一步:給映象打標籤 docker tag 086e6b3e71c0 liuqingzheng/lqz_books:v1 # 第二步:登入到遠端 docker login 使用者名稱:不是郵箱 密碼:挺複雜 # 第三步:提交 docker push liuqingzheng/lqz_books:v1 # 第四步:別人就可以下載了 docker pull liuqingzheng/lqz_books:v1
每一個Dockerfile命令都會構建一層映象(本質上是每一層都會啟動一個容器,執行完命令後,將容器進行提交,透過檢視下載下來的映象,發現歷史層資訊的層ID是missing,其實是因為原本的層id只存在於構建映象的宿主機上,一旦轉移映象後,歷史層訊息中將只保留最新一層的ID # 只要執行一個命令就會多一層 RUN yum install vim -y RUN yum install git -y # 檢視映象分層的命令 docker history liuqingzheng/lqz_books:v1 # 好處: 構建快,分發方便,如果本地有某一層了,這一層就不需要下載了 # 補充:Dcokerfile寫命令,建議多條命令合為一條---》只會生成一層 RUN python -m pip install --upgrade pip &&\ python -m pip install --upgrade setuptools &&\ pip install -r requirements.txt
# 自己搭建私有倉庫 -harbor:企業級私有倉庫---》(有圖形化介面--》跟hub.docker 很像)https://blog.csdn.net/weixin_47085247/article/details/129237979 -registry:用docker搭建私有倉庫(沒有圖形化介面) # 搭建步驟:(使用docker搭建docker私有倉庫) -第一步:拉取映象 docker pull registry -第二步:執行容器:docker run -di --name=registry -p 5000:5000 registry -就是一個web服務端--》從瀏覽器中訪問它 -第三步:開啟瀏覽器 輸入地址http://10.0.0.110:5000/v2/_catalog看到{"repositories":[]} 表示私有倉庫搭建成功並且內容為空 -第四步:修改daemon.json vi /etc/docker/daemon.json { "insecure-registries":["10.0.0.110:5000"] } -第五步:重啟docker 讓配置生效 systemctl restart docker docker start registry -第六步:把某個映象tag成私有倉庫的映象 docker tag 映象名字/id 10.0.0.110:5000/django_books:v1 docker tag nginx:latest 10.0.0.110:5000/my_nginx:v1 -第七步:提交到私有倉庫 docker push 10.0.0.110:5000/my_nginx:v1 -第八步:其他人,只要配置了私有倉庫就可以直接拉取 docker pull 10.0.0.110:5000/my_nginx:v1 # 以後公司用harbor多---》自己搭建個harbor