docker_03days

拆尼斯、帕丁顿發表於2024-03-14

遷移備份

# 映象從哪來的?
    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

Dockerfile(很重要)

dockerfile介紹和常用命令

# 映象從哪裡來的?
    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,和資料夾,檔案是否存在

案例2

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:設定只在構建過程中使用的環境變數,構建完成後,將消失

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' . 

dockerfile構建一個djagno專案(books圖書管理系統)

# 以圖書管理系統為例---》公司使用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 私有倉庫

# 有個遠端倉庫 ,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