附带实战的Docker入门教程(简简单单)

1,037 阅读5分钟

一、如何简单理解Docker

小编看来,docker相当于一台虚拟机,我们大家或多或少玩过vmware虚拟机,我们一般都会在虚拟机上装一些软件,比如mysql,道理一样,我们也可以在docker上面安装一些软件,redis或者mysql或者自己开发的应用程序。

另外,我们都知道maven,maven有自己的中央仓库,道理一样,docker也有自己的仓库。那么maven中央仓库存储什么呢?答案是构建(Artifact),同样的道理,docker也存放着自己的东西,只不过这些东西我们不叫构建,我们叫镜像,docker仓库也称为镜像仓库。

上面提到的内容,我们可以总结出几个知识点。

  • 1、docker有自己的中央镜像仓库,也有类似maven仓库地址可分为第三方仓库,甚至,我们可以搭建自己的docker镜像仓库地址,harbor可以了解一下。
  • 2、docker就类似一台虚拟机,我们成为容器,容器顾名思义就是装东西,装的东西我们称为镜像

二、Docker安装

小编认为,docker本身就是一个服务,要在linux上面搭建docker服务,我们首先要做的无非就是下载并启动docker。在centos、redhat上,我们可以通过下面命令安装我们的docker容器。

yum install docker

下载完成之后,我们可以通过下面命令查看下docker安装的位置以及版本,输出如下:

whereis docker
docker --version

下载完成,我们进行安装,我们可以选择将docker安装成为一个开机自启动的服务,命令如下:

service docker start  # 启动服务
chkconfig docker on   # 设置为开机自启动

三、在Docker上部署我们的SpringBoot服务

我们假设你的linux机器上已经安装了jdk8和maven。

我们首先在[start.spring.io/]网站上创建一个springboot web Demo程序,大致的目录结构如下:

其中application.properties文件没有任何内容,我们在resources目录下新建一个Dockerfile文件,内容如下:

FROM openjdk:8-jdk-alpine
MAINTAINER "hjw"<lifvalue>
ADD demo-1.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

注意,Dockerfile是从指令FROM开始的,而且每个指令首字母要大写。 FROM表示该镜像的源镜像是哪里,我们使用openjdk8的镜像作为源镜像,更多源镜像,我们可以使用docker search xxx来搜索,xxx是具体镜像名称。 MAINTAINER告诉我们镜像维护者是谁 ADD指令表示将我们的demo-1.0.jar这个文件添加进来,并且重新命名成app.jar EXPOSE表示该镜像启动的时候,所使用的的端口是什么,注意,这里有一个坑,我们最开始说docker就像是虚拟机,所以此处的端口并不是你宿主机器的物理端口,而是只docker这个容器内部的地址。我们可以使用-P -p intenelport:outport进行映射。 ENTRYPOINT为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT

再贴一下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 http://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.0.3.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>1.0</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
		<docker.image.prefix>springboot</docker.image.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>
		</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.image.prefix}/${project.artifactId}</imageName>
					<!-- 这里填写我们Dockerfile文件的地址 -->
					<dockerDirectory>src/main/resources</dockerDirectory>
					<resources>
						<resource>
							<targetPath>/</targetPath>
							<directory>${project.build.directory}</directory>
							<include>${project.build.finalName}.jar</include>
						</resource>
					</resources>
				</configuration>
			</plugin>
			<!-- Docker maven plugin -->
		</plugins>
	</build>

</project>

MyController.java

@RestController
public class MyController {

	@RequestMapping("/sayhello")
	private void sayhello() {
		System.err.println("hello docker!");
	}

}

使用fstp工具,将我们的demo代码拷贝到我们的linux机器上,使用下面命令进行打包: mvn package 如果没有报错,我们使用docker来构建我们的应用成为一个标准的镜像,命令如下: mvn package docker:build

到这里就表示构建镜像成功了。如何查看我们的镜像仓库都有哪些镜像呢?使用如下命令即可~ docker images

好了,镜像有了,也就相当于我们的虚拟机有了mysql了,接下来我们就来运行我们刚刚构建的springboot镜像文件,命令如下:

docker run -P -d -p 8080:8080 springboot/demo

-P表示开启docker虚拟端口-物理端口的映射关系 -p表示具体指定映射到哪个端口 -d表示镜像在后台运行

启动完毕之后,我们开下另外一个端口,访问我们刚刚写的接口。

四、Docker扩展

本文的对docker只是做了简单的介绍,更多更高级的docker特性,期待我们后面进一步学习掌握。docker的应用很多,在Web 应用的自动化打包和发布、CI/CD中应用颇多。在自动化打包和发布中,我们一般可以结合git,jenkins来完成这项工作。 我们可能会问,微服务中某个服务我们可能会提供集群,当然docker也可以;微服务中,我们服务越来越多的时候会有服务治理,docker越来越多怎么办呢?答案是docker容器编排,我们可以继续往下深入了解K8S。

更多docker指令,请移步参考:docker指令大全

更多dockfile指令写法,请移步:dockerfile指令官方文档