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

  1. 訪問 http://localhost:8080 。首次登錄使用Docker控制台打印的一次性密碼進行登錄。
  2. "系統設置"--"全局屬性"中配置環境變量。

自動構建

項目構建任務

下面演示一個項目的構建計划如何配置,首先在項目根目錄創建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地址進行遠程服務調用。
環境搭建完成。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM