Dockerfile和DockerCompose的使用

kiba518發表於2024-03-14

前言

學習命令的正確方式,其實是先手動操作一個簡單的命令,然後瞭解命令的基本含義,然後再看命令的相關文章。

所以,網上哪些docker的文章,基本上都不適於學習入門。

基礎命令

基礎命令如下:

FROM openjdk:8-jre-alpine
LABEL author="kiba <xxx@126.com>" # 映象描述
LABEL describe="test image" #映象描述
MAINTAINER kiba <xxx@126.com> # 作者
COPY java /opt/program # 複製java資料夾的內容到 /opt/program 不存在的目錄自動建立
EXPOSE 8520 #明確指定容器執行時需要暴露的埠。這個指定一般來說不用,因為建立容器時會用 -p來暴露埠
ENTRYPOINT ["java", "-jar", "/opt/program/app-kiba-spring-kafka-1.0.0.jar"]

首先連線linux,然後建立一個資料夾,然後建立一個Dockerfile檔案,沒有字尾名。

image

然後編輯這個檔案,複製上面的命令進去。

複製時,注意刪掉#後面的註釋,如下圖:

image

然後CD到這個目錄,執行命令。

docker build -t kiba-test-image:latest .

注意最後的 【. 】必須有。

執行結果如下:

image

然後查詢映象。

docker images

如下圖,我們多了一個自定義映象。

image

現在,我們再來了解一下命令含義。

  • FROM:指定基礎映象,後續的指令將基於這個基礎映象進行構建。

  • RUN:在容器中執行命令。可以執行任意的命令,例如安裝軟體包、執行指令碼等。run執行的命令都是在建立映象時執行的,並不是在建立容器時執行的。

  • COPY:將檔案從宿主機複製到容器中。可以是單個檔案,也可以是整個目錄。COPY的目標目錄不存在會自動建立。

  • ADD:與 COPY 類似,但還可以從 URL 下載檔案並新增到容器中。

  • ENV:設定環境變數。

  • EXPOSE:暴露容器中的埠,使其可以被外部訪問。

  • CMD:指定容器啟動時執行的命令。

  • ENTRYPOINT:與 CMD 類似,但 ENTRYPOINT 命令會覆蓋 Dockerfile 中後續的 CMD 命令。它的引數用逗號分隔,這裡的逗號分隔,等於命令裡的空格。

  • VOLUME:建立一個資料卷,用於容器與宿主機之間共享資料。

  • USER:指定執行容器時的使用者。

  • WORKDIR:設定容器的工作目錄 類似於CD到了這個目錄 ,該命令後面的命令,如RUN、CMD、ENTRYPOINT、COPY、ADD等命令都在此目錄下作為當前工作目錄。例如:WORKDIR /opt

  • ARG:定義構建時的引數,這些引數可以在構建時透過命令列進行傳遞。

瞭解了命令內容,就知道了,剛才的命令是從網上下載一個openjdk:8-jre-alpine映象,然後對其進行編輯,並複製了一個jar包進去,然後,要求該映象,建立容器時,啟動這個jar包。

現在,我們建立一個容器

docker run -it -d --name kiba-test-container -p 8051:8520 kiba-test-image:latest

注意:這裡的-d一定要加,不然docker就會在前臺執行。

然後訪問,我們的jar包的網站即可,如下:

http://10.1.0.100:8051/code/doc.html

如果不加-d,就是在前臺執行,可以使用Ctrl+C退出。

刪除容器相關命令如下:

docker rm kiba-test-container # 刪除容器
docker ps -a # 檢視全部容器
rmi kiba-test-image # 刪除映象
docker images # 檢視全部映象

因為copy命令複製的資料夾下,還有個startup.sh,然後就嘗試一下用sh啟動。

但結果不盡如人意,一直未能啟動成功。

嘗試錯誤命令組合如下:

#RUN chmod 777 /opt/startup.sh
#ENTRYPOINT ["sh", "/opt/startup.sh"] #啟動異常  Exited
#RUN chmod u+x /soft/app-kiba-spring-kafka/startup.sh
#RUN chmod 777 /startup.sh
#ENTRYPOINT ["sh", "/startup.sh"] #啟動異常  Exited 
#ENTRYPOINT ["./startup.sh"] #啟動異常 exec ./startup.sh: exec format error
# CMD ["sh", "/startup.sh"] #啟動異常  Exited 
# CMD ["/startup.sh"] #啟動異常  Exited docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/startup.sh": permission denied: unknown.
#CMD ["/startup.sh"] 啟動異常  Exited

上網調查了一下,有說能執行sh的,有說不能執行sh的。想來是比較麻煩,不過命令可以直接執行,sh執行不了也不用太糾結。

建立映象

經過測試,感覺還是自動建立映象更加省心。

建立映象

建立映象命令。

docker pull java:openjdk-8u111-jre
docker run -it -d  --name kiba-test-custom -p 8052:8520 java:openjdk-8u111-jre /bin/bash
docker exec -it kiba-test-custom /bin/bash

下面這個命令不成立,因為openjdk:8-jre-alpine沒有/bin/bash。

docker run -it -d  --name kiba-test-custom -p 8052:8520 openjdk:8-jre-alpine /bin/bash

openjdk:8-jdk-alpinejava:openjdk-8u111-jre都是Java的安裝包,但它們的來源和用途略有不同。

openjdk:8-jdk-alpine是基於Alpine Linux構建的輕量級JDK版本,它包含了Java執行環境所需的基本元件,體積更小巧,適合於資源有限的環境。你可以使用它在Docker容器中執行Java應用程式。

java:openjdk-8u111-jre則是OpenJDK發行的標準JRE(Java Runtime Environment),它包含Java虛擬機器(JVM)和Java應用程式所需的類庫。它是一個獨立的安裝包,可以在各種作業系統上安裝和使用。

然後使用docker cp複製檔案。

docker cp /soft/resources/app-kiba-spring-kafka-1.0.0.jar  kiba-test-custom:/resources/app-kiba-spring-kafka-1.0.0.jar

然後,再手動處理容器,讓jar可以執行,再將這個容器提交為新映象。

docker commit kiba-test-custom kiba-test-custom-image;

然後再使用自定義映象,這樣用起來更方便。

docker compose

再同級目錄編寫docker-compose.yml檔案,編寫程式碼如下:

version: "2.22.0"

services:
  kibaDocker:
    build:
      context: .
      dockerfile: Dockerfile
    image: kiba-tewt-image_10
    container_name: kiba-test-container-10
    ports:
      - 8529:8520 # 宿主:容器

version對應上dockercompose就行,對不上也行。

然後下面的內容,就可以字面理解了,就上面手動建立容器的命令。

然後執行。

docker-compose up -d

-d是後臺執行的意思。

然後就正式執行成了。訪問http://10.1.0.145:8529/code/doc.html即可


注:此文章為原創,任何形式的轉載都請聯絡作者獲得授權並註明出處!



若您覺得這篇文章還不錯,請點選下方的【推薦】,非常感謝!

https://www.cnblogs.com/kiba/p/18072670

相關文章