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部署记录
- 官方