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
就這樣吧,結束。