docker生成鏡像的兩種方式


基於一個基礎鏡像構建一個自己的鏡像有兩種方式:
  1.更新鏡像:使用 docker commit 命令生成新的鏡像
  2.構建鏡像:使用 docker build 命令,需要創建Dockerfile文件
一:更新鏡像
  先使用基礎鏡像創建一個容器,然后對容器內容進行更改,然后使用 docker commit 命令提交為一個新的鏡像(以tomcat為例)。
  1.從倉庫拉取最新的鏡像
docker pull tomcat

  2.根據基礎鏡像,創建容器

docker run --name tomcat01 -p 80:8080 -d tomcat

 注意:如果是從阿里雲鏡像倉庫拿到的鏡像,在webapps里面沒有文件,因為阿里雲鏡像默認是最小的鏡像,所有不必要的都被剔除,將webapps.dist中的文件copy到webapp中即可解決(命令:cp -r webapps.dist/* webapps

 3.修改容器內容

docker exec -it tomcat01 /bin/bash cd webapps/ROOT rm -f index.jsp echo hello world > index.html exit

   4.提交為新鏡像

#docker commit -m="描述消息" -a="作者" 容器ID或容器名 鏡像名:TAG docker commit -m="自定義的Tomcat鏡像" -a="wk" mytomcat wk/tomcat:v1.0

  5.1 將自己的鏡像上傳到dockerHub

#第一步 先登錄自己的docker倉庫 docker login #輸入用戶名和密碼 #修改鏡像名字 #docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] 注意這里的目標鏡像需要使用你dockerhub上的用戶名 類似我的wkdocker01 docker tag wk/tomcat:v01 wkdocker01/tomcat:v1.0 #上傳自己的鏡像 docker push wkdocker01/tomcat:v1.0

  5.2 將自己的鏡像上傳到阿里雲

    阿里雲容器鏡像地址:https://cr.console.aliyun.com/cn-hangzhou/repositories

    首先在自己的阿里雲容器鏡像中創建自己的鏡像倉庫

               

    選本地倉庫 ,通過命令推送到阿里雲鏡像倉庫

     

     然后進入到自己的鏡像倉庫,這里有操作步驟教你上傳鏡像

    

  6.使用子的鏡像來運行容器(當然也可以在dockerHub上pull下來自己空間的鏡像)

docker run --name mytom -p 8091:8080 -d wk/tomcat:v1.0

 二:使用DockerFile構建spring boot項目鏡像

  1.准備:把自己的springboot項目打包成可執行jar包

  2.把jar包上傳到Linux服務器

  3.開始構建自己的項目容器

    3.1:在jar包路徑下創建Dockerfile文件 vi Dockerfile

# 指定基礎鏡像,本地沒有會從dockerHub pull下來 FROM java:8 #作者 MAINTAINER wk # 把可執行jar包復制到基礎鏡像的根目錄下 ADD smart-admin.jar /smart-admin.jar # 鏡像要暴露的端口,如要使用端口,在執行docker run命令時使用-p生效 
EXPOSE 8080 # 在鏡像運行為容器后執行的命令 ENTRYPOINT ["java","-jar","/smart-admin.jar"]

    3.2:使用 docker build 命令構建鏡像,基本語法

docker build -t wkdocker01/smart-admin:v1 . 
# -f指定Dockerfile文件的路徑
# -t指定鏡像名字和TAG
# .指當前目錄,這里實際上需要一個上下文路徑

  4.運行自己的項目

docker run --name smart-admin -p 8080:8080 -d wkdocker01/smart-admin:v1 

三:把自己的vue前端項目上傳到docker容器運行:

  1.首先創建一個default.conf文件,用戶替換nginx目錄下的default.conf文件

server { listen 80; server_name 127.0.0.1; # 修改為docker服務宿主機的ip location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html =404; } location /smart-admin-api{ # smart-admin-api是vue項目里.env.production里的地址 proxy_pass http://127.0.0.1:10086/smart-admin-api/; # 這里寫的是你后端接口的地址
 } error_page 500 502 503 504  /50x.html; location = /50x.html { root html; } }

  該配置文件定義了首頁的指向為 /usr/share/nginx/html/index.html, 所以我們可以一會把構建出來的index.html文件和相關的靜態資源放到/usr/share/nginx/html目錄下。

  2.創建DockerFile文件

FROM nginx MAINTAINER wk #刪除目錄下的default.conf文件 RUN rm /etc/nginx/conf.d/default.conf #將default.conf復制到/etc/nginx/conf.d/下,用本地的default.conf配置來替換nginx鏡像里的默認配置 ADD default.conf /etc/nginx/conf.d/ #將項目根目錄下dist文件夾(構建之后才會生成)下的所有文件復制到鏡像/usr/share/nginx/html/目錄下 COPY dist/ /usr/share/nginx/html/

  3.將通過npm run build 打包好的dist文件拷貝到當前路徑下

  4.通過docker build命令構建鏡像,注意不要少了. (點)

docker build -t smart-admin-vue:v1.0 .

  5.通過docke run 啟動容器

docker run --name smart-admin-vue -p 10085:80 -d smart-admin-vue:v1.0

  6.通過執行docker ps查看是否啟動成功容器

 四:dockerFile常用的幾個命令:

  FROM

  FROM指令是最重要的一個並且必須為Dockerfifile文件開篇的第一個非注釋行,用於為鏡像文件構建過程指定基礎鏡像,后續的指令運行於此基礎鏡像提供的運行環境

這個基礎鏡像可以是任何可用鏡像,默認情況下docker build會從本地倉庫找指定的鏡像文件,如果不存在就會從Docker Hub上拉取
  語法:
FROM <image> 
FROM <image>:<tag>
FROM <image>@<digest>

  MAINTAINER(depreacted)

  Dockerfifile的制作者提供的本人詳細信息

  Dockerfifile不限制MAINTAINER出現的位置,但是推薦放到FROM指令之后

  語法:

MAINTAINER <name>

  name可以是任何文本信息,一般用作者名稱或者郵箱

  LABEL
  給鏡像指定各種元數據
  語法:
LABEL <key>=<value> <key>=<value> <key>=<value>...

  一個Dockerfifile可以寫多個LABEL,但是不推薦這么做,Dockerfifile每一條指令都會生成一層鏡像,如果LABEL太長可以使用\符號換行。構建的鏡像會繼承基礎鏡像的LABEL,並且會去掉重復的,但如果值不同,則后面的值會覆蓋前面的值。

  COPY

  用於從宿主機復制文件到創建的新鏡像文件
  語法:
COPY <src>...<dest> 

COPY ["<src>",..."<dest>"]
# <src>:要復制的源文件或者目錄,可以使用通配符
# <dest>:目標路徑,即正在創建的image的文件系統路徑;建議<dest>使用絕對路徑,否則COPY指令則以WORKDIR為 其起始路徑
  注意:如果你的路徑中有空白字符,通常會使用第二種格式
  規則:
    <src> 必須是build上下文中的路徑,不能是其父目錄中的文件
    如果 <src> 是目錄,則其內部文件或子目錄會被遞歸復制,但 <src> 目錄自身不會被復制
    如果指定了多個 <src> ,或在 <src> 中使用了通配符,則 <dest> 必須是一個目錄,則必須以/符號結尾
    如果 <dest> 不存在,將會被自動創建,包括其父目錄路徑
  ADD
  基本用法和COPY指令一樣,ADD支持使用TAR文件和URL路徑
  語法:
ADD <src>...<dest> 

ADD ["<src>",..."<dest>"]
   規則:
  和COPY規則相同
  如果 <src> 為URL並且 <dest> 沒有以/結尾,則 <src> 指定的文件將被下載到 <dest>
  如果 <src> 是一個本地系統上壓縮格式的tar文件,它會展開成一個目錄;但是通過URL獲取的tar文件不會自動展開
  如果 <src> 有多個,直接或間接使用了通配符指定多個資源,則 <dest> 必須是目錄並且以/結尾
  WORKDIR
  用於為Dockerfifile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定設定工作目錄,只會影響當前WORKDIR之后的指令。
  語法:
WORKDIR <dirpath>
  在Dockerfifile文件中,WORKDIR可以出現多次,路徑可以是相對路徑,但是它是相對於前一個WORKDIR指令指定的路徑
  另外,WORKDIR可以是ENV指定定義的變量
  VOLUME
  用來創建掛載點,可以掛載宿主機上的卷或者其他容器上的卷
  語法:
VOLUME <mountpoint> 

VOLUME ["<mountpoint>"]

  不能指定宿主機當中的目錄,宿主機掛載的目錄是自動生成的

  EXPOSE
  用於給容器打開指定要監聽的端口以實現和外部通信
  語法:
EXPOSE <port>[/<protocol>] [<port>[/<protocol>]...]
   <protocol> 用於指定傳輸層協議,可以是TCP或者UDP,默認是TCP協議
  EXPOSE可以一次性指定多個端口,例如: EXPOSE 80/tcp 80/udp
  ENV
  用來給鏡像定義所需要的環境變量,並且可以被Dockerfile文件中位於其后的其他指令(如ENV、ADD、COPY等)所調用,調用格式:$variable_name或者${variable_name}
  語法:
ENV <key> <value> 

ENV <key>=<value>...
  第一種格式中, <key> 之后的所有內容都會被視為 <value> 的組成部分,所以一次只能設置一個變量
  第二種格式可以一次設置多個變量,如果 <value> 當中有空格可以使用\進行轉義或者對 <value> 加引號進行標識;另外\也可以用來續行 
  ARG
  用法同ENV
  語法:
ARG <name>[=<default value>]

  指定一個變量,可以在docker build創建鏡像的時候,使用 --build-arg <varname>=<value> 來指定參數

  RUN
  用來指定docker build過程中運行指定的命令
  語法:
RUN <command> 

RUN ["<executable>","<param1>","<param2>"]
  第一種格式里面的參數一般是一個shell命令,以 /bin/sh -c 來運行它
  第二種格式中的參數是一個JSON格式的數組,當中 <executable> 是要運行的命令,后面是傳遞給命令的選項或者參數;但是這種格式不會用 /bin/sh -c 來發起,所以常見的shell操作像變量替換和通配符替換不會進行;如果你運行的命令依賴shell特性,可以替換成類型以下的格式
RUN ["/bin/bash","-c","<executable>","<param1>"]
  CMD
  容器啟動時運行的命令
  語法:
CMD <command> 

CMD ["<executable>","<param1>","<param2>"]

CMD ["<param1>","<param2>"]
  前兩種語法和RUN相同
  第三種語法用於為ENTRYPOINT指令提供默認參數
  RUN和CMD區別:
  RUN指令運行於鏡像文件構建過程中,CMD則運行於基於Dockerfifile構建出的新鏡像文件啟動為一個容器的時候
  CMD指令的主要目的在於給啟動的容器指定默認要運行的程序,且在運行結束后,容器也將終止;不過,CMD命令可以被docker run的命令行選項給覆蓋
  Dockerfifile中可以存在多個CMD指令,但是只有最后一個會生效
  ENTRYPOINT
  類似於CMD指令功能,用於給容器指定默認運行程序
  語法:
ENTRYPOINT<command> 

ENTRYPOINT["<executable>","<param1>","<param2>"]
  和CMD不同的是ENTRYPOINT啟動的程序不會被docker run命令指定的參數所覆蓋,而且,這些命令行參數會被當做參數傳遞給ENTRYPOINT指定的程序(但是,docker run命令的--entrypoint參數可以覆蓋ENTRYPOINT)
  docker run命令傳入的參數會覆蓋CMD指令的內容並且附加到ENTRYPOINT命令最后作為其參數使用
  同樣,Dockerfifile中可以存在多個ENTRYPOINT指令,但是只有最后一個會生效
  Dockerfifile中如果既有CMD又有ENTRYPOINT,並且CMD是一個完整可執行命令,那么誰在最后誰生效
  ONBUILD
  用來在Dockerfifile中定義一個觸發器
  語法:
ONBUILD <instruction>
  Dockerfifile用來構建鏡像文件,鏡像文件也可以當成是基礎鏡像被另外一個Dockerfifile用作FROM指令的參數在后面這個Dockerfifile中的FROM指令在構建過程中被執行的時候,會觸發基礎鏡像里面的ONBUILD指令
ONBUILD不能自我嵌套,ONBUILD不會觸發FROM和MAINTAINER指令
在ONBUILD指令中使用ADD和COPY要小心,因為新構建過程中的上下文在缺少指定的源文件的時候會失敗
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM