[docker]Centos7環境JAVA基礎docker映象構建
寫在前面
對於初入Docker的童鞋來說,構建基礎映象可能無從下手。此文以java例,對構架Docker基礎映象的過程做簡要的記錄。
建立映象也可以使用Dockerfile
。本文主要介紹使用最基礎的自定義方式建立映象。
環境要求:
- Centos7
- 安裝Docker CE版。參見這裡
構建JAVA映象環境
以centos為基礎映象,啟動一個docker例項。attach到這個環境內部:
sudo docker run -it -v <your-local-volumn-dir>:<docker-volumn-dir> centos /bin/bash
其中相關引數包括:
-i
:表示以互動模式執行容器
-t
:表示容器啟動後會進入其命令列
-v
:表示需要將本地哪個目錄掛載到容器中,格式-v<宿主機目錄>:<容器目錄>
假設我們的所有安裝程式(例如java安裝包、maven安裝包等)都放在了宿主機的/root/software/
目錄下,現在需要將其掛載到容器的/mnt/software/
目錄下,就可以將上述命令中的-v
部分寫成:
-v /root/software/:/mnt/software/
現在,就可以為這個容器安裝軟體了。
另:Docker 傳送檔案命令
docker cp more.log <Docker ID>:/tmp/
安裝JAVA環境
安裝jdk。
2.1 從Oracle官網下載所需要的JDK壓縮包。進入Docker啟動時指定的存放軟體的目錄中,解壓JDK,然後重新命名資料夾mv jdk1.8.0_73/jdk/
2.2 配置環境變數(重要)
vim ~/.bashrc
在檔案末尾新增如下配置:export JAVA_HOME=/usr/local/jdk export PATH=$PATH:$JAVA_HOME
用文字編輯器開啟
/etc/profile
,在profile檔案末尾加入:export JAVA_HOME=/usr/local/jdk export JRE_HOME=$JAVA_HOME/jre export
儲存檔案,退出。使用source命令,讓環境變數生效:
$ source ~/.bashrc $ source /etc/profile
上傳docker映象
退出你剛才配置好的docker例項:$ exit
使用以下命令可以看到剛才退出的docker例項(這個命令類似與Linux的
ps -a
可以檢視所有docker例項,包括正在執行的和停止執行的):$ docker ps -a
可以看到,你剛才停止的docker例項的
Docker ID
,假設為89c153ff574e
。使用以下命令,根據某Docker ID
來建立一個新的image
:docker commit 89c153ff574e java-base:1.8
該容器ID是
89c153ff574e
,所建立的映象名是java-base:1.8
提交了新的映象你可以把這個映象儲存tar包:docker -o ~/java-base.tar java-base
docker save -o 儲存的目錄 映象名
檢視映象
用docker images
看看當前所有的映象,可以看到剛才提交的映象。
用docker push <your-image-name:TAG>
可以將映象提交到DockerHub。(需要先註冊)
在完成上述操作後,你就有一個centos
為作業系統的java8
環境了。可以以此為基礎構建專案、工程。
構建自己的專案
使用以上述java8 Docker映象構建專案,本質上是以上述映象為底層映象,將你的專案的jar包、啟動命令(假設是shell指令碼)打包構建成一個新的映象。打包方式可以使用Dockerfile
.
可以考慮這種做法:
將專案jar包放在某個對映路徑下(例如上文中的/root/software/),在啟動指令碼中,將此jar包拷貝到工作路徑下,然後再啟動。這樣可以確保你的專案的base映象肯定可以執行(因為在最初建立base映象的時候,有個初始的jar包在工作路徑下),而後續更新,只需要更新宿主的對映路徑下的專案jar包即可。
示例Dockerfile
:
FROM <your-repository>/java-base:1.8
WORKDIR /var/project
COPY /home/docker1/certs /var/prog/certs
COPY /home/docker1/project /mnt/software/project
EXPOSE 8080
CMD ["/bin/bash", "./start_api.sh"]
start_api.sh
示例:
#!/bin/bash
cp /mnt/software/project/* .
/usr/local/jdk/bin/java -cp your-project.jar com.your.project.Application &
關於Dockerfile
中的ADD
, COPY
的簡單區別,可以參見這裡
啟動專案
命令列啟動:
docker run -d -p 10000:8080 -v /home/docker1/project:/var/project -v /home/docker1/certs:/var/project/certs <your-repository>/<your-image-name> /var/project/start_api.sh
引數解釋:
-d
: 表示後臺執行。用於啟動一個服務,例如後端伺服器、web伺服器等等。
-p <local-port>:<docker-inside-port>
: 指定將宿主機的port對映到docker內部的port。這樣通過訪問宿主機的port,就可以訪問docker內部對應的服務。
最後一個引數,是啟動時執行的指令。這裡假設是通過某個shell指令碼啟動的,就指定執行該指令碼。
使用指令碼啟動時,需要注意:如果開頭這一行#!/bin/bash
丟了,會報錯使用
docker-compose
更為方便的啟動方式,是使用docker-compose
命令。先建立一個空的docker-compose.yml
檔案,例如:version: '2' services: <your-service-name>: image: "<your-repository>/<your-image-name>" ports: - "10000:8080" volumes: - /home/docker1/project:/var/project - /home/docker1/certs:/var/project/certs
在
docker-compose.yml
所在路徑,使用命令:$ docker-compose
即可自動按照
docker-compose.yml
中的配置啟動docker例項。如果專案需要在docker中增加自定義的hosts,即修改/etc/hosts檔案。
命令列啟動方式:
在docker run
命令中使用--add-host <your-host-name>:<your-host-ip>
選項增加。如果有多個,就寫多個--add-host
docker-compose
方式:
使用extra_hosts
來指定。示例:version: '2' services: <your-service-name>: image: "<your-repository>/<your-image-name>" ... extra_hosts: - "host1:1.2.3.4" - "host2:1.2.3.5" ...
由於專案需要,要基於java8映象構建maven映象用於打包。下篇會詳細記錄。