学会使用docker

757 阅读7分钟

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