Docker 搭建開發環境
本文介紹如何將Docker整合到開發環境,自動構建應用,並使容器擁有獨立的內網IP為開發人員提供服務。
術語解釋
- Docker映象:一個不可修改的"模板",每個程式碼版本對應一個映象版本,本身不可執行。
- Docker容器:映象的"例項",必須且只能指定一個"映象"來建立容器,建立時可選擇要暴露的內部介面或要掛載的目錄等,本身可以啟用、停止或刪除,內部系統不應被修改,如需修改應建立一個新"映象",再執行此映象的容器。
元件介紹
- portainer:輕量級Docker管理介面,支援Swarm叢集。
自動構建流程
Docker 配置
開啟Http方式 Docker Engine API
編輯檔案/usr/lib/systemd/system/docker.service
找到
ExecStart=/usr/bin/dockerd -H fd://
修改為
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H fd://
重載入 systemd daemon
systemctl daemon-reload
加速器配置
為加快下載速度,配置daocloud的加速映象。
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://7515421f.m.daocloud.io
為容器分配獨立IP
預設情況下,Docker建立的容器執行在私有的內部網路中。
想要賦予每個容器獨立IP,可以使用Docker內建的macvlan驅動將容器橋接到宿主機的網絡卡上,這樣宿主機網段內的其他主機便可通過IP地址訪問到容器了。
首先在宿主機建立一個新網路,注意閘道器及子網掩碼與宿主機網路一致。
docker network create -d macvlan \
--subnet=10.16.10.0/21 \
--gateway=10.16.8.254 \
-o parent=eth0 sweet
之後建立的容器,如果需要獨立IP,只需要配置--network sweet
引數即可。
安裝基本環境
安裝 Portainer
docker run -d -p 9000:9000 \ -v /var/run/docker.sock:/var/run/docker.sock \ --restart always \ --name portainer portainer/portainer
安裝 Jenkins
docker run -p 8080:8080 \
-v /usr/bin/docker:/usr/bin/docker \
-v /var/jenkins_home:/var/jenkins_home \
--restart always \
--name jenkins jenkins/jenkins:lts-alpine
配置 Portainer
訪問 http://localhost:9000 。首次登入需設定管理員密碼,並配置需要管理的Docker Server地址。
配置 Jenkins
- 訪問 http://localhost:8080 。首次登入使用Docker控制檯列印的一次性密碼進行登入。
- "系統設定"--"全域性屬性"中配置環境變數。
自動構建
專案構建任務
下面演示一個專案的構建計劃如何配置,首先在專案根目錄建立Dockerfile檔案,宣告如何構建docker映象。
例如我建立的專案中:
FROM java:8-alpine
RUN mkdir /app
WORKDIR /app
ADD target/docker-demo.jar /app
EXPOSE 9001
ENTRYPOINT ["java","-jar","docker-demo.jar"]
而後,Jenkins中新建一個構建任務,在"Post Steps"部分新增"Execute shell",並做如下配置:
echo "================ Docker Build ================" >> /dev/null
docker -H $DOCKER_URL build --force-rm --tag $JOB_NAME:$BUILD_NUMBER $WORKSPACE
echo "================ Docker Remove Container ================" >> /dev/null
docker -H $DOCKER_URL rm --force $JOB_NAME
echo "================ Docker Run ================" >> /dev/null
docker -H $DOCKER_URL run -dt \
--network sweet \
--name $JOB_NAME $JOB_NAME:$BUILD_NUMBER
清理映象任務
雖然Docker採用了分層的方式儲存映象檔案,但開發環境的高頻率構建,會很快地填滿硬碟,因此我們需要定期地刪除無用映象檔案。
新建一個構建專案clean
配置"Build periodically"為H 6 * * *
,每天早上6點執行一次清理任務。
配置"Execute shell"如下,刪除48小時前沒有被使用的映象檔案。
echo $DOCKER_URL
docker -H $DOCKER_URL images
docker -H $DOCKER_URL image prune -a -f --filter "until=48h"
echo "================ After Prune ================" >> /dev/null
docker -H $DOCKER_URL images
使用方式
自此,
Jenkins會按配置好的觸發器執行構建,刪除原有容器(原有的映象不會刪除),並啟動一個新版本的容器。
Portainer中可以檢視已經啟動的容器,IP地址,Log日誌,也可手動停用或建立上一版本的容器。
同網段的其他主機,可以直接訪問容器的IP地址進行遠端服務呼叫。
環境搭建完成。