Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然后發布到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。(引用官方概念,本文注重docker+springboot2.0快速構建鏡像,對docker更細節的知識不在做贅述)
Docker
本文使用的是CentOs7
docker 安裝:
yum install docker
systemctl start docker 開啟docker
docker :修改拉取鏡像地址,docker使用默認的公用倉庫,在國內下載會比較慢
建議使用ustc拉取
編輯宿主機器文件 : vi /etc/docker/daemon.json
沒有該文件,請先創建一個。
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
最后:重啟dokcer容器 systemctl restart docker
docker :常用命令
docker images 列出鏡像
docker rmi 鏡像 刪除鏡像
docker rm 容器id 移除容器
docker run -d --name 容器名稱 -p 端口 鏡像
docker start/stop 容器id 開啟/停止容器
docker rm 'docker ps -a -q' 刪除所有的容器
docker ps 查看正在運行的容器
docker ps -a 查看歷史運行過的容器
docker ps -l 查看最近運行過的容器
安裝私有倉庫
執行以下命令,會啟動一個registry容器,該容器用於提供私有倉庫的服務
沒有掛載目錄請先創建
docker run --name docker-registry -d -p 5000:5000 -v /usr/local/work/registry:/tmp/registry registry
使用curl -X GET http://192.168.15.129:5000/v2/_catalog 查看私有倉庫的鏡像信息
如果之前沒有創建過,則為空
{"repositories":[]}
使docker 支持http推送鏡像
在/etc/docker/daemon.json中配置以下屬性,如果多個以逗號分隔。
{"insecure-registries":["192.168.15.129:5000","192.168.15.129"]}
在 /etc/containers/registries.conf中配置
[registries.search] registries = ['docker.io','registry.centos.org','registry.access.redhat.com','192.168.15.129:5000','192.168.15.129']
[registries.insecure] registries =["192.168.15.129:5000","192.168.15.129"]
地址是配置自己搭建的docker倉庫私服地址和域名
重新啟動Docker
systemctl restart docker .
從hub.docker.com中下載一個Tomcat鏡像。
使用docker images 查看鏡像信息,包括 IMAGE ID。
給該鏡像添加一個帶有私有倉庫的ip的tag
docker tag tomcat鏡像id 192.168.15.129:5000/tomcat
查看docker images 鏡像,多出一個打了tag的tomcat鏡像
推送鏡像
docker push 192.168.15.129:5000/tomcat
刪除從hub.docker.com中pull的鏡像
啟動私有倉庫鏡像
docker run --name tomcatpri -d -p 8080:8080 192.168.15.129:5000/tomcat
關閉防火牆,訪問Tomcat,成功!
使用docker部署SpringBoot
搭建一個簡單的SpringBoot 項目與Docker技術進行整合,使用maven來構建docker鏡像並推送至本地docker registry,最后對想不部署時只需要根據對應得鏡像啟動容器即可。
環境搭建
JDK1.8
SpringBoot2.0.6.RELEASE
Maven 3.6.0
Docker
創建一個SpringBoot項目
引入依賴配置
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<docker.registry>192.168.15.129:5000</docker.registry>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!-- docker私服的地址 -->
<dockerHost>http://192.168.15.129:2375</dockerHost>
<!--鏡像名稱以及版本號-->
<imageName>${docker.registry}/${project.artifactId}:${project.version}</imageName>
<!--依賴的基礎鏡像-->
<baseImage>java</baseImage>
<!--Dockerfile的位置 -->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<!-- 這里是復制 jar 包到 docker 容器指定目錄配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- Docker maven plugin -->
</plugins>
</build>
編寫啟動類
編寫控制類,用於接收http請求
需要在src/main下面新建一個docker目錄,並新建一個Dockerfile文件
FROM java:8
MAINTAINER lvy lvy@163.com
VOLUME /tmp
ADD docker_registry-0.0.1-RELEASE.jar docker_registry.jar
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone
EXPOSE 9000
ENTRYPOINT ["java", "-jar", "docker_registry.jar"]
對Dockerfile里面的內容做一個簡單的介紹:
1.FROM:指明當前鏡像繼承的基礎鏡像,編譯當前鏡像時候會自動下載基鏡像
2.MAINTAINER:當前鏡像的作者和郵箱,使用空格隔開
3.VOLUME:掛載目錄
4.ADD:從當前工作目錄復制文件到鏡像目錄中並重新命名
5.RUN:在當前鏡像上執行Linux命令,,第二個run指令是為了解決容器和宿主機時間不一致的問題
6.EXPOSE:監聽的端口號
7.ENTRYPOINT:讓容器像一個可執行程序一樣運行
項目構建
使用docker build對項目打包構建
mvn clean install -DskipTests docker:build
這時會報出一個錯誤
問題1:如果在pom文件里面添加了<dockerHost>
節點,並配置了地址是我們搭建的私服地址的話,會報出404 NOT PAGE,如果沒有配置該節點會報出鏈接被拒絕的異常(Connection refused)
解決方案:添加一個``<dockerHost>``節點,值為docker所在機器ip:2375,至於為什么要配置2375,后面會介紹。
問題2:這時在進行 ``mvn clean install -DskipTests docker:build``命令會報出同樣的錯誤,鏈接被拒絕。
導致原因:
在默認情況下Docker守護進程``Unit socket(/var/run/docker.sock)``來進行本地進程通信,而不會監聽任何端口,因此只能在本地使用docker客戶端或者使用docker api進行操作。如果想在其他主機上操作docker主機,就需要讓docker守護進程打開一個http socket,這樣才能實現遠程通信,我們是在windows上打包構建的,所以需要讓centos7的docker服務開啟遠程訪問。
解決方案:
開啟docker遠程訪問,進入docker私服所在的服務器,編輯配置文件
``vim /usr/lib/systemd/system/docker.service``
在``docker.service``的``[Service]``下增加如下內容
```shell
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
```
注意,該端口不是docker私服所在的服務端口,是新開的遠程訪問端口。進行遠程通信的。
同樣基於2的基礎上,我們還要簡歷兩個軟連接,不然執行會報出找不到該命令
ln -s /usr/libexec/docker/docker-proxy-current /usr/bin/docker-proxy
cd /usr/libexec/docker/
ln -s docker-runc-current docker-runc
啟動
重新讀取配置文件並啟動docker
systemctl daemon-reload
systemctl restart docker
再次構建
mvn clean install -DskipTests docker:build
發現居然成功了。對!就是這么簡單。
查看鏡像,運行
使用docker images查看鏡像,就會發現剛剛的服務已被打包成鏡像了。
使用docker run命令就可以啟動容器服務啦!
啟動時需要docker名稱+版本號為鏡像名稱。不然可能找不到(本人機器上如此)
訪問服務成功
補充一點: maven 內置變量說明
${basedir} 項目根目錄
${project.build.directory} 構建目錄,缺省為target
${project.build.outputDirectory} 構建過程輸出目錄,缺省為target/classes
${project.build.finalName} 產出物名稱,缺省為${project.artifactId}-${project.version} 當前版本
${project.packaging} 打包類型,缺省為jar