初學者關於Docker的一些問題記錄

項目背景

搭建一個基於springcloud的分佈式博客系統,已經實現了基於eureka的配置中心和註冊中心,爲了減小本地的內存壓力,使用docker將配置中心註冊中心放到服務器上java

初學者初探

  • dockerfile中的WORKDIR的用處
docker build -t imageName path, 這裏path指的是上下文路徑,如ADD COPY等命令都須要一個源路徑和目標路徑,那麼源路徑和目標路徑的定位是相對於那個路徑呢? 源路徑就是相對於path,它只能訪問path下的目錄,在path外的目標是不能被訪問到,目標路徑相對的就是這個WORKDIR,表示當前容器在運行是訪問的根路徑,好比RUN java -jar target.jar的時候,這個target在容器中的某個目錄下,經過WORKDIR定位到這個目錄,就能能經過RUN 來執行到這個target.jar,而不須要在RUN中指定額外的相對或者絕對路徑定位這個jar文件
  • 製做一個含有jdk環境的Dockefile
製做這麼一個Dockerfile也不難,指定FROM centos, 經過add將jar解壓到容器目錄裏面,最後經過ENTRYPOINT 指定java -jar && tail -f > /etc/null執行springboot的jar包並保證進程不退出。但jdk的環境變量配置須要注意,有三種寫法,一種經過RUN SED -i "$a" /etc/profile 將jdk的環境變量寫進profile,第二種經過RUN echo "JAVA_HOME" >> /etc/profile,第三種直接經過dockerfile提供的ENV JAVA_HOME 來設置jdk的環境變量。前面兩種都是經過在/etc/profile中寫環境變量來完成,可是指定RUN source /etc/profile是行不通的,你須要進入容器中source /etc/profile才能讓/etc/profile的環境變量生效。第三種是最簡單的設置方法,設置了在容器容器時直接生效。
  • RUN命令中的&&命令鏈接
RUN command 一個RUN會產生一箇中間的容器,那麼一套相關的命令能夠經過RUM command && command來進行鏈接,換行能夠指定 ,若是不指定直接換行鏈接command會出現一些語法錯誤,這樣有什麼好處呢?更加直觀?命令功能分塊集中?你以爲好就對了何須教科書般的說出個之因此然來,RUM cd /usr/local && npm install這條命令若是分開寫成兩個RUN會如何? 致使install訪問不到/usr/local的文件,它由於是從新開始一個容器,訪問的路徑時WORKDIR指定的根目錄
  • CMD的ENTRYPOINT的區別
dockerfile中的一些指令都是能夠經過docker run來覆蓋的,好比 -v 掛載能夠覆蓋VOLUME -p 能夠覆蓋EXPOSE指定的端口, -w能夠覆蓋WORKDIR,-v 能夠覆蓋ENV環境變量,這裏的docker run imageId command 中的command能夠覆蓋CMD,因此容器的啓動後執行的命令仍是寫在ENTRYPOINT比較好,避免被覆蓋掉。
  • docker run中的-it是什麼意思,-d是什麼意思, 後面跟個command爲/bin/bash又是什麼意思
i表示交互,t表示僞終端,-d是後臺運行,/bin/bash是容器啓動時執行/bin/bash命令在容器中打開一個進程進入/bin/bash。解釋了可是沒有實踐又怎麼知道是怎麼個回事。那麼若是不指定-d,會使容器在前臺執行進程,將控制檯打印這些執行信息,若是指定了-d那麼容器進程在後臺執行,不會打印執行信息,也不用想辦法退出當前容器執行的進程。通常運行docker run之後直接在控制檯打印這個容器的id信息,可是我又想進入容器怎麼辦?docker exec嗎,我執行進去看看不想寫這個命令,這時候能夠經過docker run -it /bin/bash 執行完就能進入到這個容器裏面查看一些信息,這應該就是所謂的交互
  • dockerfile經過docker build經過docker images能夠找到這個鏡像,刪除dockerfile上下文會生效嗎
刪掉上下文之後,也是能夠經過docker run ,docker restart 來運行容器,須要注意一點,docker restart會從新執行一遍以前運行的docker run命令,若是這時候掛載點恰好是dockerfile上下文目錄,那麼docker restart之後發現宿主機找不到掛載目錄(已經被刪掉),就會生成一個指定的掛載目錄名(以前在dockerfile run -v指定的名字),同時容器若是執行一個jar包恰好在掛載目錄下,這時候就會找不到jar文件,從而報錯,想要查看docker 容器執行的日誌能夠經過docker logs imageId來完成
  • 掛載目錄的理解
掛載目錄能夠在dockerfile中經過volume指定,這隻能指定容器的掛載目錄,宿主機的掛載目錄自動生成,能夠經過docker inspect imageId查看,也能夠經過docker run -v path:path 指定,那麼我在宿主機的掛載目錄中更改一些信息,它會立馬響應到容器對應掛載的目錄裏面
  • dockerfile製做啓動springboot項目的鏡像,如何更新jar包
最初認爲只要掛載好宿主機的存放jar的目錄到指定的容器目錄中,經過docker restart從新執行dockerfile中的ENTRYPOINT java -jar target.jar命令來執行這個容器的掛載目錄更新的target.jar,這樣就能完成jar的更新,發現行不通每次發佈新的jar都須要經過docker build從新構建鏡像,具體還須要實際操做總結。
相關文章
相關標籤/搜索