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的家庭版,那么只能安装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能够正常运行,然后通过浏览器可以访问即可,比如下面:


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@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. 在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。

2. 当建立好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可以停止端口占用。

发布Tomcat

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

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

 

其他相关资料

  以下资料针对Linux环境,时间比较久,可能不一定准确。

  更详细的原理介绍: Docker:VM、代码迁移和SOA解决方案

  下面开始动手安装,首先,我们需要安装Docker:

  在VirtualBox和Vagrant中安装Docker

  如果将我们的应用交付到Docker 容器中,需要生成Docker部署文件,这篇教程以Java为例说明如何生成Docker Image:使用gradle生成Spring Boot应用的Docker Image

   如果你是Java开发者: 将Springboot应用程序封装在Docker容器中 使用Docker打包Java应用

  Docker的细粒度松耦合能够让我们用一个Docker容器装载一个场景功能,也就是按照功能角色分类,每个Docker里面装一个服务或应用,一个服务器上可以运行多个Docker,系统级别的服务比如Mysql数据库、Memcache缓存 和Nginx等。

  通过 使用Docker创建两个容器的应用 来了解应用程序组件的分离部署。

  将多个Docker分离部署就能形成分布式系统,见教程:使用Docker建立一个动态负载平衡的分布式Web系统 

  通过以上Docker安装 生成 运行和部署,你大概已经了解Docker是一个类似集装箱的容器,如果你的云计算支持Docker容器,那么你的应用系统就可以通过Docker享受强大的PaaS平台计算能力了,解决了应用程序的性能提升或扩展性Scalable问题。

  Docker两个开源PAAS项目flynn和deis的比较

  更多基于Docker的产品见:10个基于DOCKER的顶尖开发工具

  如果你还想深入了解Docker用途,可见:Docker的八种用途

参考

使用Salt管理和部署Docker

Docker容器化组件架构

使用Mesos和Marathon管理Docker集群

使用Apache Mesos和Consul实现服务的注册发现

什么是DevOps?

#Docker专题

#Kubernetes专题