學會使用docker

一、看這篇博客教會你什麼?

  • 安裝docker
  • docker 經常使用命令
  • 一個mvn命令部署springboot測試環境並運行
  • 部署運行springcloud分佈式項目
  • 以上操做中遇到的問題
  • docker生態
  • 安裝私有倉庫,並推送

GIT

二、安裝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版本跟服務器系統有很大關係,其餘系統安裝可參考文章末尾參考連接。html

三、經常使用命令

啓動服務java

sudo systemctl start dockerpython

鏡像存放位置linux

cd var/lib/docker/containersnginx

查看運行的容器git

docker psgithub

中止容器web

docker stop ip/namespring

查看刪除已經中止但未卸載的鏡像docker

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

四、配置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>
複製代碼

須要根據你的條件修改的地方:
一、docker API接口
二、你但願的鏡像名
三、打包文件的XML地址
四、數據卷地址
五、項目的端口映射

  • 添加鏡像文件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

五、部署運行springcloud分佈式項目

如何部署分佈式前,介紹一下docker生態的另外一個產品:

  • docker-compose定義

負責快速在集羣中部署分佈式應用。由python開發。
ompose 經過一個配置文件來管理多個Docker容器,在配置文件中,全部的容器經過services來定義,而後使用docker-compose腳原本啓動,中止和重啓應用,和應用中的服務以及全部依賴服務的容器,很是適合組合使用多個容器進行開發的場景。

  • 如何使用
一、在 Dockfile 中定義你的應用環境,使其能夠在任何地方複製。
二、在 docker-compose.yml 中定義組成應用程序的服務,以便它們能夠在隔離的環境中一塊兒運行。
三、最後,運行dcoker-compose up,Compose 將啓動並運行整個應用程序。
複製代碼
  • 示例 編寫docker-compose.yml 文件
version: '3'
services:
 dev:
  image: 'dev:latest'
  
  
在docker-compose.yml文件目錄下 執行docker-compose up  就會運行容器
複製代碼

六、私有倉庫並推送

安裝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
 
 
 一、中止Harbor

$ docker-compose down -v


二、啓動Harbor

$ docker-compose up -d

須要先登陸後才能推送
docker login http://10.18.9.17
複製代碼

七、docker其餘相關產品

  • docker-compose
  • docker HUB 官方私有云
  • Shipyard 推薦界面化管理工具
  • K8S

在Docker技術的基礎上,爲容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提升了大規模容器集羣管理的便捷性。Kubernetes是一個完備的分佈式系統支撐平臺,具備完備的集羣管理能力,多擴多層次的安全防禦和准入機制、多租戶應用支撐能力、透明的服務註冊和發現機制、內建智能負載均衡器、強大的故障發現和自我修復能力、服務滾動升級和在線擴容能力、可擴展的資源自動調度機制以及多粒度的資源配額管理能力。同時Kubernetes提供完善的管理工具,涵蓋了包括開發、部署測試、運維監控在內的各個環節。

八、遇到的問題

  • 問題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刪除

九、以上都是站在巨人的肩膀上

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

相關文章
相關標籤/搜索