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在使用抽象虚拟是经由libvirt的LXC与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服务的地方看,每个人可能不一样
第一次接触暂时先写到这