Docker教程

  Docker 是一种轻量的容器,可以作为PAAS的轻量化容器,也可以作为DevOps的工具,实现快速敏捷的持续交付,Docker与微服务的组合能够实现类似SOA服务 或EJB/Corba那样的分布式服务系统。Docker是一种新的分布式中间件技术。Docker微容器+微服务将颠覆传统的软件架构。

  Docker直接基于Linux内核,支持各种语言,它比VM虚拟机更加轻量,能够在Linux或云计算IaaS等平台上直接运行,带着你的应用无缝地移植到各种运行环境。

  有人无奈地说:Docker流行起来是因为我们的依赖设计做得不够到位,最后只能在运行阶段依靠Docker这样的微容器帮我们松耦合。

  使用docker的好处。

  • 隔离
  • 可移植性
  • 安全

  隔离

  如果你的应用需要在操作系统上安装某些二进制文件,使用Docker你就不需要这么做,取而代之是将这些文件安装到docker镜像上。这样,你的应用部署运行就不会影响到主机系统。

  可移植性

  你的应用及其依赖项都是以镜像形式存储。这个镜像可以在任何docker上发布、再分发和运行,基本无需采取任何额外操作(如再次安装依赖项)。

  安全

  随镜像一起提供的软件仅供当前这个容器使用。不会被操作系统或其他应用使用到。如果有任何不受信任的内容,它将仅在当前容器流程内运行。而容器是隔离的,因此这些可能不安全的内容不会与系统的其他部分交互,进而造成影响扩大。

 

Docker在Windows安装

  让我们从在windows安装Docker开始学习使用它构建我们的应用。

首先,从Docker官方地址下载Docker的windows版本,默认的是针对Win10 64位的专业版,如果你是win10的家庭版,点按在Win10家庭版中安装Docker Desktop正式版;或安装Docker Toolbox, 下载地址复制在这里,如果无法启动下载,还是从官方地址进入后慢慢寻找。

下载安装后,如果你点击Docker QuickStart Terminal,可能会跳出错误: 需要你手工定位Bash.exe,选择浏览,找到你的Git.exe所在目录,一般是c:\program file\Git\bin下,bash.exe也在其中。

进入Docker QuickStart Terminal后,需要等待一段时间,会从github下载一些组件,等出现提示符以后,键入:

$ docker --version
Docker version 18.03.0-ce, build 0520e24302

键入:

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

表示Docker已经安装好了。

Docker run hello-world 表示 它运行一个名为hello-world的图像。

首先,它在本地系统上查找此图像。由于它不在那里,它从Docker Hub下载。然后它运行容器,它显示一条消息告诉我们一切正常,然后它说明了运行图像所需的过程。

Docker寻找hello-world图像的本地副本。由于它不存在,它去了Docker Hub并下载了最新的图像。图像完全下载后,它会在容器中运行hello-world

 

安装生成Spring Boot镜像

首先准备一个Spring Boot项目,Spring Boot项目是随便什么都可以,只要通过java -jar target/xxx.jar能够正常运行,然后通过浏览器可以访问即可,比如下面:


@SpringBootApplication
@RestController
public class DemoApplication {

    @RequestMapping("/")
    public String home() {
        return "Hello Docker World";
    }
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
这是通过访问http://localhost:8080/能够返回“Hello Docker World"的简单应用,可以在 Spring Initializr 进行下载后加入home()方法即可,也可使用Idea或VsCode等Spring Boot导航方式创建。

1.创建Dockerfile

在Spring Boot目录下创建一个Dockerfile文件,下面是Dockerfile文件内容:

FROM openjdk:8-jdk-alpine

COPY target/*.jar app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

Dockerfiles 是Docker构建镜像文件的命令列表:

第一行告诉Docker从哪里开始建造; 来自openjdk:8-jdk-alpine。这是在Alpine Linux上提供OpenJDK JRE的现有映像的名称Alpine Linux为运行Java应用程序提供了轻量级,安全且快速的容器。

下一行将当前目录下的target目录下的jar包复制到映像文件系统的根目录。这里的target目录是Maven输出打包jar包的默认目录,如果你的Spring Boot的Jar包不在target下,就要修改一下,dockerfile可以包含多个COPY指令,它可以用于复制整个文件树。

最后一行是将执行以启动容器的命令。CMD接受构成命令行的字符串数组,类似于Runtime.exec。

DockerFile总结

  • FROM-在其上将构建我们的自定义镜像的基础镜像
  • WORKDIR —定义工作目录。CMD,ENTRYPOINT命令将仅从此目录运行
  • COPY —将JAR文件复制到WORKDIR
  • EXPOSE —将端口8080暴露在Docker容器外部
  • ENTRYPOINT —执行docker run命令时要执行的命令

 

2.根据Dockerfile构建镜像文件

当建立好Dockerfile文件以后,CMD进入命令行(最好以管理员权限),切换到Dockerfile所在的项目目录,键入以下命令,注意不是在Docker quickstart的控制台里面输入,而是另外开启了一个黑色的DOS/CMD命令行:

docker build -t spring-boot-app:latest .

注意,最后一个标点符号是“.”,表示Dockerfile文件在当前目录下,如果不键入,会报:"docker build" requires exactly 1 argument.需要一个参数的错误。 spring-boot-app:latest 是分类标签,随便你写,可以键入公司组织名下的一个应用名词。

键入执行后,如下输出:

执行三个命令以后,显示构建成功.

键入docker images:

你会发现spring-boot-app出现其中,openjdk是我们安装的jdkn,而hello-world是之前运行Docker run hello-world 安装的。

 

3. 运行构建好的镜像

运行这个镜像:

docker run -p 8080:8080 spring-boot-app:latest

然后通过docker ps检查会发现映射到端口8080。

通过浏览器http://localhost:8080

如果无法访问locaohost:8080端口,使用下面命令查询本地IP:

docker-machine ip default
192.168.99.100

那么就通过http://192.168.99.100:8080

docker stop XXX可以停止端口占用。

 

4.发布镜像到Tomcat

这里提供一个发布Tomcat到docker的Dockerfile:

FROM tomcat:8.0.20-jre8
COPY 你的WAR包.war /usr/local/tomcat/webapps/
CMD ["catalina.sh","run"]

 

参考

在Win10家庭版中安装Docker Desktop正式版

使用Docker打包容器化SpringBoot的RESTful API 

基于Spring Boot 2.3以上版本方便创建分层Docker镜像

甲骨文官方提供将Oracle数据库安装在Docker中的标准化方式和样本项目

在笔记本Win10中基于WSL+Docker Desktop安装Kubernetes和Istio、Knative

Docker容器化组件架构

什么是DevOps?

Kubernetes简单介绍

云原生是一个营销词语!

#Docker专题 #Kubernetes专题 #Serverless