學會使用docker

litblank發表於2019-03-18

1、看這篇部落格教會你什麼?

  • 安裝docker
  • docker 常用命令
  • 一個mvn命令部署springboot測試環境並執行
  • 部署執行springcloud分散式專案
  • 以上操作中遇到的問題
  • docker生態
  • 安裝私有倉庫,並推送

GIT

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部署記錄

  • 官方

官方例子
fabric8-maven-plugin
docker-maven-plugin

相關文章