Dockerfile和DockerCompose的使用

前言

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

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

基礎命令

基礎命令如下:

FROM openjdk:8-jre-alpine
LABEL author="kiba <[email protected]>" # 鏡像描述
LABEL describe="test image" #鏡像描述
MAINTAINER kiba <[email protected]> # 作者
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章