前言
學習命令的正確方式,其實是先手動操作一個簡單的命令,然後瞭解命令的基本含義,然後再看命令的相關文章。
所以,網上哪些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檔案,沒有字尾名。
然後編輯這個檔案,複製上面的命令進去。
複製時,注意刪掉#後面的註釋,如下圖:
然後CD到這個目錄,執行命令。
docker build -t kiba-test-image:latest .
注意最後的 【. 】必須有。
執行結果如下:
然後查詢映象。
docker images
如下圖,我們多了一個自定義映象。
現在,我們再來了解一下命令含義。
-
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-alpine
和java: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