基础知识
什么是docker
官网:
Docker Docs: How to build, share, and run applications | Docker Documentation
Docker 是一个基于go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
开发环境,测试环境,生产环境不一致,会出现开发环境可用,但其他环境出现问题的情况,使用docker 可以解决这一问题
减少各应用之间的相互影响,比如A应用需要修改环境变量,会影响B应用,如果在两个容器中就没影响了
- 从下面的logo中我们可以看到,一条鲸鱼载着一堆集装箱。在集装箱没有出现之前,运送的货物全部都堆在一条船上运输,很容易造成货物损坏,比如我运送一批货物,里面有水果,化学物品,木头。当这批货物堆在一条船上一起运送的时候,有可能会发生化学物品泄露导致水果被污染,或者木头松动导致砸坏化学物品。这个时候为了避免货物损失,会安排多条船去运送这批物资,但是这样又会造成运送成本的增加,这个时候就发明了集装箱,把不同的货物通过集装箱隔离开。这样所有的货物放在一条船上,就不会出现互相污染的情况了。
- 那么docker是什么呢?docker就是那头鲸鱼货轮+集装箱的集合体,它可以将货物进行分类包装进集装箱,并提供一条存放集装箱的货轮。这样,通过想把集装箱送往哪个地方就送往哪个地方。

docker核心概念
docker三大核心概念:镜像 Image、容器 Container、仓库 Repository
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。基于镜像可以创建容器,同一个镜像可以创建多个容器;
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。镜像存放在仓库中,可以从仓库中拉取。

docker架构及原理

Docker 使用客户端-服务器 (**C/S**) 架构模式,使用远程API来管理和创建Docker容器。 架构上可以分为客户端和服务端; **Docker Daemon**是docker的守护进程; **containerd**是容器运行的进程,是实现容器的核心; 客户端通过内部的API和服务端的守护进程进行交互,守护进程再通过**containerd**分发到各个容器;
Docker和虚拟机
说到Docker就要提到虚拟机了,在Docker流行之前,虚拟机是开发人员部署开发环境的普遍方法。但是虚拟机的缺点是消耗太多不必要的资源和内存,速度也很慢。从一张图就可以看出为什么Docker会比虚拟机更快,更方便。
可以看到Docker和VM的区别,是没有Guestos,而是用Docker Engine代替。虚拟机的Guest OS即为虚拟机安装的操作系统,它是一个完整的操作系统内核,而Docker就显得简练很多,docker Engine可以简单看成对Linux和NameSpace,Cgroup,镜像管理文件的系统操作的分装。Docker没有和虚拟机一样利用一个完全独立的Guest OS 实现环境隔离,它利用的是目前Linux内核本身支持的容器实现资源和环境隔离。
docker命令
其他命令参考docker命令大全:Docker 命令大全 | 菜鸟教程
下载和安装docker
windows:
DockerToolbox在Win7上的安装和设置
为什么使用Docker Toolbox
Docker在Windows上使用有两种方式,一是利用VirtualBox建立linux虚拟机,在linux虚拟机中安装docker服务端和客户端,二是利用Windows的Hyper-v虚拟化技术,直接在Windows上安装docker服务端和客户端。WIndows7不支持Hyper-v,所以只能采用Docker Toolbox的方式使用Docker。下载地址:https://docs.docker.com/toolbox/overview/
安装过程很简单,保持默认选项,直接【next】即可。VirualBox和Git如果已经安装,也可以不选
如果已经安装了virtualbox,建议先卸载自己的virtualbox,在这里重新安装,否则启动docker时会报错

1、Docker Toolbox安装图文教程
注意:
1、在第四张教程图片中,可以不勾选Install VirtualBox with NDISS。
2、过程中,需要安装一个串行设备,切记点击安装!







安装完成后,桌面上会多出3各图标,如下。其中VirtualBox提供了linux虚拟机的运行环境,Docker Quickstart Terminal用于快速介入linux虚拟机,提供命令行交互,Kitematic是docker GUI很少用到。

启动
第一次运行Docker Quickstart Terminal时会进行Docker环境的初始化,会在VirtualBox中自动创建名字为【default】的linux虚拟机


利用Xshell登录
Docker Quickstart Terminal使用起来不方便,可以使用XShell进行SSH登录Docker环境(其实就是远程访问default linux虚拟机)。
通过在PowerShell或cmd终端中执行【docker-machine ls】命令,可以看到虚拟机的地址,本机是192.168.99.100。
default虚拟机的默认用户名和密码
用户名:docker
密码: tcuser

登录成功页面:

更改虚拟磁盘存储位置
虚拟机的默认存储位置是C:\Users\Administrator\.docker\machine\machines ,后期docke镜像文件会不断增加,为了给系统盘减负,最好将磁盘移动到其他位置。
- 首先通过PowerShell或cmd终端中执行【docker-machine stop default】命令停止default虚拟机

- 通过VirtualBox【管理】-》【虚拟介质管理】界面对虚拟磁盘进行复制

需要注意虚拟磁盘类型的选择

- 为虚拟机添加新复制的虚拟磁盘,删除之前的dick

更改镜像仓库地址
docker默认的镜像仓库地址是https://hub.docker.com/,但国内的下载速度太过缓慢,最好使用国内镜像,比如阿里云。
首先需要注册阿里云账号,然后在https://cr.console.aliyun.com/页面的左侧可以看到【镜像加速器】选项

在powershell或cmd中通过 【docker-machine ssh default】命令登录虚拟机(或使用设置好的XShell连接),执行如下命令:
| 1 |
|
然后重启default
| 1 |
|
修改之后,用docker info命令查看, Registry Mirrors所配置的镜像地址


idea集成docker
打开Settings设置界面
选择Build Exection Deployment=>Docker
点击+号,创建一个Docker连接,指定Docker Machine为default,默认的虚拟机。
点击右下角的Apply
底部出现Docker工具栏

在Images右键Pull Image拉取镜像

在Repository中输入指定的镜像名,比如httpd,mysql,nginx等名称。
latest是Tag中是最新的Tag版本。


拉取成功之后,右键Create container

设置端口映射
由于此处选择了mysql,所以要设置mysql的密码。


将springboot部署到docker中
遇到过的问题:
- 生成出来的jar包缺少依赖JAR的
- 启动时找不到主类
- 容器启动后主机拒绝
pom配置
pom.xml的文件,下面红色的,是docker相关的
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.10-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.sheng</groupId>
<artifactId>myDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>myDemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.5</spring-cloud.version>
<dockerfile-maven-plugin.version>1.4.10</dockerfile-maven-plugin.version>
<docker.image.prefix>springboot</docker.image.prefix>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${dockerfile-maven-plugin.version}</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!--docker和maven结合的配置-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${dockerfile-maven-plugin.version}</version>
<executions>
<execution>
<id>default</id>
<goals>
<!--如果package时不想用docker打包,就注释掉这个goal,
运行mvn package时,会自动执行build目标,构建Docker镜像。
当运行mvn deploy命令时,会自动执行push目标,将Docker镜像push到Docker仓库-->
<!--
<goal>build</goal>
<goal>push</goal>
-->
</goals>
</execution>
</executions>
<configuration>
<!--在maven运行docker时,dockerFile文件必须在这个文件夹内-->
<contextDirectory>${project.basedir}/docker</contextDirectory>
<!--repository指定docker镜像的repo名字-->
<repository>${docker.image.prefix}/demo</repository>
<!--tag指定docker镜像的tag-->
<tag>v1</tag>
<!--buildArgs可以指定一个或多个变量,传递给Dockerfile,在Dockerfile中通过ARG指令进行引用。暂时不用,注释掉-->
<!--
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
-->
</configuration>
</plugin>
<plugin>
<!--用于生成jar的时候,将依赖的包也导入进去,否则无法启动,另外MANIFEST.MF文件中会找不到启动类-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
<includeSystemScope>true</includeSystemScope>
<mainClass>${start-class}</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
</project>
操作步骤
生成jar
先maven上点击clean compile package 在target生成JAR包(myDemo-0.0.1-SNAPSHOT.jar) 把它用解压缩包打开,看看MANIFEST.MF中有没有主函数入口,有红圈的就行,不然无法启动,会报错no main manifest attribute, in /xxxxx.jar异常 将 F:\workspace\arch\spring-cloud-demo\target\myDemo-0.0.1-SNAPSHOT.jar 拷贝到 F:\workspace\arch\spring-cloud-demo\docker F:\workspace\arch\spring-cloud-demo\docker 文件夹中应该有Dockerfile 和 myDemo-0.0.1-SNAPSHOT.jar

然后用bash做docker命令
docker images 查看镜像

构建镜像
docker build -t springboot/demo .

最后的警告没有影响
查看镜像docker images

删除镜像:只需删除镜像对应的image id即可,例如删除java执行命令: docker rmi d23bdf5b1b1b
若存在两个镜像的image id相同,需要通过REPOSITORY+TAG删除,例如删除java执行命令: docker rmi java 8
若报删除的镜像存在依赖镜像错误,则需通过 docker rm 【依赖镜像id】,命令依次删除依赖
若镜像已经运行,需要先停止运行再删除
运行镜像
docker run -p 8005:8005 -d springboot/demo
-p表示端口映射,此时将服务器中的8005端口映射到容器中的8005端口

查看运行的镜像
docker ps

查看所有容器,包含未运行的:docker ps -a
停止运行镜像:docker stop ceb5f1a71a29
11.浏览器访问 http://192.168.99.100:8005/ 出现项目页面,即发布成功

docker stats <容器 ID>
该命令可以查看容器资源的使用情况,包括 CPU 占用率、内存使用量、网络使用量等。
查看虚拟机:docker-machine ls
进入虚拟机:docker-machine ssh 虚拟机名称
退出虚拟机:exit
启动虚拟机:docker-machine start 虚拟机名称
停止虚拟机:docker-machine stop 虚拟机名称
重启虚拟机:docker-machine restart 虚拟机名称
删除虚拟机:docker-machine rm 虚拟机名称
查看虚拟机环境信息:docker-machine env 虚拟机名称
注:若进入虚拟机,对虚拟机的启动、停止、重启、删除操作,需先退出虚拟机
dockerFile的指令详解

参考文章:
https://www.cnblogs.com/canger/p/9028723.html
Docker Toolbox:Docker Toolbox的简介、安装、使用方法之详细攻略_dockertoolbox_一个处女座的程序猿的博客-CSDN博客
Windows7安装使用Docker发布Spring boot项目详细_王绍桦的博客-CSDN博客


















