Docker瞭解及初步學習

  部署項目是一件很麻煩的事,尤其是當同一個項目部署到很多服務器的時候,這種麻煩變得更加讓人難受。

  在我剛到公司的時候,公司之前的先項目採用的就是使用Web服務器Tomcat部署項目,但是後來的新項目是微服務的架構,所以部署十幾個服務變得比較麻煩,後來技術經理想到了使用Docker,現在也來學習如何快捷的部署自己的項目。

  剛開始學習當然是先安裝了,這裏使用的macOS,安裝和其他的軟件沒有什麼區別,就是下載完畢後直接拖到application裏面就完成安裝了。

  安裝完畢後需要修改鏡像加速地址。

  具體的安裝在下面的網站也有詳細的步驟。http://www.runoob.com/docker/docker-tutorial.html

  安裝完畢後在終端輸入:docker --version。顯示如下界面表示成功。

  安裝完畢就要介紹一些部署的流程,順便介紹一下Docker的一些結構。

  Docker的一些簡單介紹這裏就不在累述了。具體的一些信息可以在下面的網站了解:http://www.runoob.com/docker/docker-tutorial.html

  Docker是一個虛擬化的容器引擎,具體的服務可以在虛擬機中運行,和宿主主機分開,達到了不依賴宿主環境的效果,這也是Docker可以簡化部署的原因,Docker的優點還有很多。這裏也不再詳細介紹。

  Docker具體的部署分爲三步:

  1.將項目變爲一個鏡像。

  2.將廠庫中的鏡像pull下來並且實例化爲容器。

  3.將容器啓動,完成部署。

  這裏的鏡像和Java中的類差不多,容器和Java中的對象差不多,一個鏡像可以實例化爲好多的對象,一個鏡像也可以在其他鏡像的基礎上面進行修改。而廠庫的概念又有點想git,一個鏡像也好像git裏面的代碼,代碼也是有着名字和地址的,同時版本還擁有版本號,這些鏡像都有。

  因爲自己的具體Docker實現是將一個SpringBoot項目打包到Docker中完成部署,但是一些中間件還是使用宿主機器的。這就是大致的一個思路。

  下面就說說具體的實現:

  先是將項目添加Docker的插件和Dockerfile文件。

  在pom.xml文件中添加插件如下:

<!-- 加入maven插件 docker-maven-plugin -->
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.4.13</version>
    <configuration>
        <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
        <dockerDirectory>src/main/docker</dockerDirectory>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

  這裏要注意幾個路徑的參數,修改到自己的項目中時要發生一些變化。

  Dockerfile文件裏的內容如下:

# Usage: FROM [image name]
FROM java:8
# Usage: MAINTAINER [name]
MAINTAINER yanyu
VOLUME /tmp
ADD spring-boot-train-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
# Usage: EXPOSE [port]
EXPOSE 8080

  這些添加完畢,項目就可以打包成鏡像了。

  先cd到項目到根目錄下,在執行打包命令,打包命令是:

mvn clean package docker:build

  上面到命令是打包和build一起執行到,在命令不報錯到情況下,會直接生成一個鏡像,後面運行鏡像就可以了。運行命令如下:

docker run --name nginx_web -d -p 8080:80   name

  上面到參數有些可以看懂,--name就是指定容器name,-d是後臺運行,-p是指定端口映射,最後的name就是鏡像的名字。

  如果這個地方不報錯,就可以直接訪問你到項目了。部署項目到Docker就是完成了。

  下面就講一下自己踩到的坑。

  在最開始嘗試到時候建立了很多的容器,想刪除鏡像時卻無法刪除,這裏的原因就是在刪除鏡像之前一定要先刪除容器(不是停止容器,是刪除容器),然後才能刪除鏡像。

  打包的時候出錯非常多了,這裏面的問題也是有很多,大部分都是配置的問題,下面就說幾個點:項目的名字最好不要用大寫字母,因爲Docker會報錯。項目一定寫上打包的地址在哪裏,同時在Docker插件的添加中也要聲明Dockerfile文件的位置。

  打包完成後並不是代表你的項目就部署完畢了,因爲項目是部署在虛擬機上面,所以在你機器上面測試通過的代碼可能就會有問題。比如MySQL的URL問題,因爲Docker容器和宿主主機不是同一個ip,所以代碼中localhost可能就會出問題,上面的端口映射講的就是這個問題,就是將宿主主機上面對於8080端口的請求都映射到虛擬機上面,至於MySQL的問題爲這裏也是有一個不是解決辦法的解決辦法,就是使用電腦的ip地址,比如10.168。55.123。網絡的問題還是比較複雜的,自己對於一些具體的細節還是沒有深入瞭解。

  下面就說說Dockerfile文件內參數的意思:

  ADD

  ADD命令有兩個參數,源和目標。它的基本作用是從源系統的文件系統上覆制文件到目標容器的文件系統。如果源是一個URL,那該URL的內容將被下載並複製到容器中。

  CMD

  和RUN命令相似,CMD可以用於執行特定的命令。和RUN不同的是,這些命令不是在鏡像構建的過程中執行的,而是在用鏡像構建容器後被調用。

  ENTRYPOINT

  配置容器啓動後執行的命令,並且不可被 docker run 提供的參數覆蓋。每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。

  ENTRYPOINT 幫助你配置一個容器使之可執行化,如果你結合CMD命令和ENTRYPOINT命令,你可以從CMD命令中移除“application”而僅僅保留參數,參數將傳遞給ENTRYPOINT命令。

  ENV

  ENV命令用於設置環境變量。這些變量以”key=value”的形式存在,並可以在容器內被腳本或者程序調用。這個機制給在容器中運行應用帶來了極大的便利。

  EXPOSE

  EXPOSE用來指定端口,使容器內的應用可以通過端口和外界交互。

  FROM

  FROM命令可能是最重要的Dockerfile命令。改命令定義了使用哪個基礎鏡像啓動構建流程。基礎鏡像可以爲任意鏡 像。如果基礎鏡像沒有被發現,Docker將試圖從Docker image index來查找該鏡像。FROM命令必須是Dockerfile的首個命令。

  FROM ubuntu

  MAINTAINER

  我建議這個命令放在Dockerfile的起始部分,雖然理論上它可以放置於Dockerfile的任意位置。這個命令用於聲明作者,並應該放在FROM的後面。

  RUN

  RUN命令是Dockerfile執行命令的核心部分。它接受命令作爲參數並用於創建鏡像。不像CMD命令,RUN命令用於創建鏡像(在之前commit的層之上形成新的層)。

  USER

  USER命令用於設置運行容器的UID。

  VOLUME

  VOLUME命令用於讓你的容器訪問宿主機上的目錄。

  WORKDIR

  WORKDIR命令用於設置CMD指明的命令的運行目錄。

  上面關於參數的解釋參考了一些博客。

  下面在說說Docker常用的命令。上面使用到不再累述。

  查看容器日誌:docker logs name

  刪除容器: docker rm id

  刪除鏡像: docker rmi id

  刪除所有的容器: docker rm $(docker ps -a -q)

  查看所有的容器: docker ps -a

  查看正在運行的容器: docker ps

  剩下就沒有什麼問題了,在貼上具體的一些參考的博客。

  Docker的詳解和具體實現:https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html#autoid-0-0-0

  Docker的網絡問題解析:https://zhuanlan.zhihu.com/p/26418829?utm_medium=social&utm_source=weibo

  就這樣吧,結束。

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