Docker 维基百科

Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。 Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。[1]

Docker容器 与虚拟机类似,但原理上,容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 容器更多的用于表示 软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker也为容器提供更强的业界的隔离兼容。[2]

Docker 利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免引导一个虚拟机造成的额外负担[3]。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括行程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirtLXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施,

依据行业分析公司“451研究”:“Dockers是有能力打包应用程序及其虚拟容器,可以在任何Linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公用云私有云、单机等。” [4]

Docker 安装

安装方式有很多种,我是第一次接触,所以我安装的windows版本的

我电脑是Win10 家庭版,所以不能直接安装docker官方的docker-ce-desktop-windows,网上看到有强制开启Hyper-V的,因为改注册表犹豫了下,查了查如果强制开启话的 VMware 可能就无法使用了,而且貌似没有看到关闭的方法。

所以我使用的安装 docker-toolbox 这个保守的办法。

安装方法我就我说了,直接百度就有很多种。

安装完需要配置和修改(有些教程没有注意)

部署 Spring Boot项目

创建一个spring boot 项目

我的pom.xml

我看的那个教程在这里面添加了一些东西,但是很多教程在pom.xml并没有做修改。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         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.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>hello_docker</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hello_docker</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <docker.imager.prefix>springboot</docker.imager.prefix>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <imageName>${docker.imager.prefix}/${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

然后创建个显示测试效果的

例如:

/**
 * @Author sakura
 * @Date 2020-07-08 17:13
 */
@RestController
public class helloDockerController {

    @GetMapping("/hello")
    public String helloDocker() {
        return "hello docker !!!";
    }

}

运行访问 127.0.0.1:8080/hello 显示

hello docker !!!

打包

打包完后的文件在target中

创建 Dockerfile

在main目录下创建docker文件夹,在此文件夹下创建Dockerfile并且把刚才打包好的文件复制进来

目录截图:

编辑Dockerfile

FROM java:8
VOLUME /tmp
ADD hello_docker-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

附:【Dockerfile指令详解】

FROM:指定基础镜像,必须为第一个命令
MAINTAINER: 维护者信息
RUN:构建镜像时执行的命令
ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
CMD:构建容器后调用,也就是在容器启动时才进行调用。
ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
LABEL:用于为镜像添加元数据
ENV:设置环境变量
EXPOSE:指定于外界交互的端口
VOLUME:用于指定持久化目录
WORKDIR:工作目录,类似于cd命令
USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
ARG:用于指定传递给构建运行时的变量
ONBUILD:用于设置镜像触发器
ENTRYPOINT:配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效。
格式:ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 (shell中执行)

使用Docker

使用Dockerfile创建镜像

mvn package docker:build

显示:

...
[INFO] Building image springboot/hello_docker
Step 1/4 : FROM java:8

 ---> d23bdf5b1b1b
Step 2/4 : VOLUME /tmp

 ---> Using cache
 ---> 8facd0d5489f
Step 3/4 : ADD hello_docker-0.0.1-SNAPSHOT.jar app.jar

 ---> Using cache
 ---> 8f39142f4505
Step 4/4 : ENTRYPOINT ["java","-jar","/app.jar"]

 ---> Using cache
 ---> 3ee7df4eff03
ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built 3ee7df4eff03
Successfully tagged springboot/hello_docker:latest
[INFO] Built springboot/hello_docker
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  12.577 s
[INFO] Finished at: 2020-07-09T10:06:31+08:00
[INFO] ------------------------------------------------------------------------

使用 docker images 命令查看构建好的镜像

H:\桌面文件\学習\练\hello_docker>docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
springboot/hello_docker   latest              3ee7df4eff03        16 hours ago        660MB
<none>                    <none>              57b58e5de4e5        17 hours ago        105MB
openjdk                   8-jdk-alpine        a3562aa0b991        14 months ago       105MB
java                      8                   d23bdf5b1b1b        3 years ago         643MB

这个springboot/hello_docker就是构建好的镜像,然后运行镜像

docker run -p 8088:8080 -t springboot/hello_docker

-p 8088:8080 :主机的端口和docker容器中的端口做映射

启动命令详情官网:https://docs.docker.com/engine/reference/commandline/run/

启动后用docker ps 查看正在运行的镜像

H:\桌面文件\学習\练\hello_docker>docker ps
CONTAINER ID        IMAGE                     COMMAND                CREATED             STATUS              PORTS                    NAMES
23617af8aed8        springboot/hello_docker   "java -jar /app.jar"   6 seconds ago       Up 7 seconds        0.0.0.0:8088->8080/tcp   zen_feynman

访问浏览器 192.168.99.100:8088/hello

hello docker !!!

192.168.99.100 这启动docker服务的地方看,每个人可能不一样

第一次接触暂时先写到这


成功の影には、数多くの失敗の道のりがある。