1、看這篇部落格教會你什麼?
- 安裝docker
- docker 常用命令
- 一個mvn命令部署springboot測試環境並執行
- 部署執行springcloud分散式專案
- 以上操作中遇到的問題
- docker生態
- 安裝私有倉庫,並推送
GIT
- 整合Docker的後臺開發腳手架專案,感謝star github.com/litblank/ha…
2、安裝docker
- 伺服器是CentOS7.6,安裝18.06.1.ce-3.el7版本
# yum更新
yum update
# 檢視docker版本
yum list docker-ce --showduplicates | sort -r
# 安裝
yum install docker-ce-18.06.1.ce-3.el7
# 啟動
systemctl start docker
# 測試
docker version
複製程式碼
docker版本跟伺服器系統有很大關係,其他系統安裝可參考文章末尾參考連結。
3、常用命令
啟動服務
sudo systemctl start docker
映象存放位置
cd var/lib/docker/containers
檢視執行的容器
docker ps
停止容器
docker stop ip/name
檢視刪除已經停止但未解除安裝的映象
docker ps -l 之後rm刪除
檢視本地主機上的映象
docker images
啟動映象
互動式:docker run -t -i ubuntu:15.10 /bin/bash
後臺模式 docker run -d ubuntu:15.10 /bin/sh
連線容器
docker run -d -p 8081:5000 --name runoob training/webapp python app.py 可以起名
進入容器
ps查到的name:docker exec -it elegant_kare bash
新增標籤
docker tag 860c279d2fec runoob/centos:dev
刪除映象 docker rmi centos:6.7
構建映象
docker build -t runoob/centos:6.7 .
檔案掛載
docker run -v $PWD:/exch-logs -d --net=host -p 0.0.0.0:8090:8090 exch/exch-platform
檢視容器內日誌
docker logs -f -t --tail 10 e81af59cd903
解除安裝
1.查詢安裝過的包
yum list installed | grep docker
2.刪除安裝的軟體包
yum -y remove docker-engine.x86_64
3.刪除映象/容器等
rm -rf /var/lib/docker
4、配置springboot專案一個mvn命令部署並執行
- 配置專案之前,需要修改docker配置,使docker可通過API配置容器
# 修改docker配置檔案
vi /usr/lib/systemd/system/docker.service
在ExecStart=/usr/bin/dockerd 後面填上-H tcp://0.0.0.0:8081 -H unix:///var/run/docker.sock
例如:ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:8081 -H unix:///var/run/docker.sock
注意4個零,和你希望開通的埠。
# 重新掃描檔案
systemctl daemon-reload
# 啟動docker
systemctl start docker
# 測試,有返回則成功,否則檢測埠
curl http://localhost:8081/info
複製程式碼
- 隨便找一個springboot專案,修改pom檔案,新增一下程式碼外掛
<!--docker部署並執行,在cmd中執行一下命令-->
<!-- mvn clean package -f pom.xml -P dev,!local docker:stop docker:remove docker:build docker:start -->
<!--等待並訪問-->
<!-- 訪問 http://10.18.9.17:port/exch_platform/ -->
<!--可檢視日誌部署進度-->
<!--mvn clean package -f pom.xml -P dev,!local docker:logs -Ddocker.follow -->
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.27.2</version>
<configuration>
<!--docker API介面-->
<dockerHost>http://10.18.9.17:8081</dockerHost>
<images>
<image>
<alias>${project.artifactId}-${port}</alias>
<!--映象名-->
<name>exch/${project.artifactId}:latest</name>
<build>
<!--父映象-->
<from>java:8</from>
<!--打包-->
<assembly>
<descriptor>${basedir}/src/main/java/com/exch/platform/docker/docker-assembly.xml</descriptor>
</assembly>
<!--映象啟動命令-->
<cmd>
<shell>java -jar /maven/${project.artifactId}.jar</shell>
</cmd>
</build>
<run>
<!--資料卷,掛在檔案的地址,例如輸出專案日誌-->
<volumes>
<bind>
<volume>/apps/product:/exch-logs</volume>
</bind>
</volumes>
<namingStrategy>alias</namingStrategy> <!--container全名規則-->
<!--埠對映-->
<ports>
<port>0.0.0.0:8090:8090</port>
</ports>
<!--網路策略-->
<net>host</net>
</run>
</image>
</images>
</configuration>
</plugin>
複製程式碼
需要根據你的條件修改的地方:
1、docker API介面
2、你希望的映象名
3、打包檔案的XML地址
4、資料卷地址
5、專案的埠對映
- 新增映象檔案docker-assembly.xml
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<files>
<file>
<source>target/${project.artifactId}.jar</source>
<destName>${project.artifactId}.jar</destName>
</file>
</files>
</assembly>
複製程式碼
- 配置完成,執行mvn 命令
執行此命令,打包釋出到伺服器並執行,提示成功時,其實還在部署。
mvn clean package -f pom.xml -P dev,!local docker:stop docker:remove docker:build docker:start
可通過查詢日誌命令檢視
mvn clean package -f pom.xml -P dev,!local docker:logs -Ddocker.follow
5、部署執行springcloud分散式專案
如何部署分散式前,介紹一下docker生態的另一個產品:
- docker-compose定義
負責快速在叢集中部署分散式應用。由python開發。
ompose 通過一個配置檔案來管理多個Docker容器,在配置檔案中,所有的容器通過services來定義,然後使用docker-compose指令碼來啟動,停止和重啟應用,和應用中的服務以及所有依賴服務的容器,非常適合組合使用多個容器進行開發的場景。
- 如何使用
1、在 Dockfile 中定義你的應用環境,使其可以在任何地方複製。
2、在 docker-compose.yml 中定義組成應用程式的服務,以便它們可以在隔離的環境中一起執行。
3、最後,執行dcoker-compose up,Compose 將啟動並執行整個應用程式。
複製程式碼
- 示例 編寫docker-compose.yml 檔案
version: '3'
services:
dev:
image: 'dev:latest'
在docker-compose.yml檔案目錄下 執行docker-compose up 就會執行容器
複製程式碼
6、私有倉庫並推送
安裝compose-叢集管理
yum -y install python-pip
pip install --upgrade pip
pip install docker-compose
wget https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.6.1.tgz
tar xvf harbor-offline-installer-v1.6.1.tgz
修改harbor.cfg
啟動./install.sh
如果埠占用,我們可以去修改docker-compose.yml檔案中
# 推送到私有倉庫
專案打標籤 docker tag hello-world 172.16.50.37/repo-test/hello-world:hw20181019tag
推送docker push 172.16.50.37/repo-test/hello-world
重啟
systemctl restart docker.service
1、停止Harbor
$ docker-compose down -v
2、啟動Harbor
$ docker-compose up -d
需要先登入後才能推送
docker login http://10.18.9.17
複製程式碼
7、docker其他相關產品
- docker-compose
- docker HUB 官方私有云
- Shipyard 推薦介面化管理工具
- K8S
在Docker技術的基礎上,為容器化的應用提供部署執行、資源排程、服務發現和動態伸縮等一系列完整功能,提高了大規模容器叢集管理的便捷性。Kubernetes是一個完備的分散式系統支撐平臺,具有完備的叢集管理能力,多擴多層次的安全防護和准入機制、多租戶應用支撐能力、透明的服務註冊和發現機制、內建智慧負載均衡器、強大的故障發現和自我修復能力、服務滾動升級和線上擴容能力、可擴充套件的資源自動排程機制以及多粒度的資源配額管理能力。同時Kubernetes提供完善的管理工具,涵蓋了包括開發、部署測試、運維監控在內的各個環節。
8、遇到的問題
- 問題1:執行映象報錯docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "process_linux.go:293: copying bootstrap data to pipe caused "write init-p: broken pipe"": unknown.
cat /etc/redhat-release 檢視系統版本,高版本支援7.4 使用CentOS Linux release 7.6.1810 對應使用18.06.1-ce版本 檢視yum中docker版本;
yum list docker-ce --showduplicates | sort -r
安裝對應版本
yum install docker-ce-18.06.1.ce-3.el7
- 問題2:harbor報錯 Error response from daemon: Get https://172.16.50.37/v2/: dial tcp 172.16.50.37:443: connect: connection refused
解決,在發起登入的客戶端主機上的檔案(如沒有則建立)/etc/docker/daemon.json中新增如下引數:
{"insecure-registries": [ "172.16.50.37" ]}
- 問題3:repository does not exist or may require 'docker login'
需要指定已存在的映象
-
問題4:打包上傳到伺服器但是不能上傳到私有倉庫
-
問題5: 部署的專案訪問不到, 需要開通埠
-
問題6:啟動沒有JAVA環境,需要部署在有Java 環境的父容器上
-
問題7:fabric8部署的專案啟動不了,好像缺少檔案。
在使用docker部署前,需要先執行maven打包,保證專案完整。
- 問題8:啟動的專案訪問不到外部的網路
4種網路模式問題,--net=host,bridge,container,none 檢視所有網橋 sudo brctl show 檢視某個網橋資訊 sudo ifconfig docker0
- 命令方式 建立網路卡 docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 mynet docker run --restart=always --net=mynet --name="test1" --ip=192.168.1.101 -v /jastme/test1:/testl --privileged=true --cpu-shares 1024 -m 4096 -dit a9ff415eb22b /bin/bash
- 修改網橋的方式不推薦
io.fabric8docker-maven-plugin 配置專案中使用標籤配置啟動引數
- 問題9:使用IDE部署執行,關閉時都會關閉容器
使用cmd執行,直接關閉
或者docker:start命令啟動,不是使用docker:run,但是不列印日誌
docker:logs -Ddocker.follow 列印日誌 ctrl+c也不會關閉容器
例如:mvn clean package -f pom.xml -P dev,!local docker:logs -Ddocker.follow docker:stop docker:remove docker:build docker:start
但是有一個問題,新部署的專案docker-maven-plugin:0.27.2:logs 處會卡死。就是使用 mvn clean package -f pom.xml -P dev,!local docker:logs -Ddocker.follow docker:start
- 問題10 Failed to execute goal io.fabric8:docker-maven-plugin:0.27.2:start (default-cli) on project exch-platform: I/O Error: Unable to create container for [exch/exch-platform:8092] : Conflict. The container name "/exch-platform-8092" is a lready in use by container "7849372d00264c6eec358db63baee3d4208aae24ad778c38556604ecac339893". You have to remove (or rename) that container to be able to reuse that name. (Conflict: 409) -> [Help 1]
因為專案問題,啟動時報錯,導致mvn關閉不了服務,需要敲命令 docker rm 7849372d00264c6eec358db63baee3d4208aae24ad778c38556604ecac339893刪除
9、以上都是站在巨人的肩膀上
CentOS7上Docker安裝與解除安裝
docker草鳥教學
Docker私有倉庫搭建(Harbor)
自建Docker Harbor映象管理工具
使用Maven外掛構建SpringBoot專案,生成Docker映象push到DockerHub上
使用docker-maven-plugin外掛將專案編譯為docker映象到遠端linux伺服器
springboot 應用打包釋出到 docker
最強大的Docker外掛 fabric8io/docker-maven-plugin
Docker:網路模式詳解
spring cloud 與 docker-compose構建微服務
Docker集中化web介面管理平臺-Shipyard部署記錄
- 官方