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

1、如何简单理解Docker

小编看来,docker至关于一台虚拟机,咱们你们或多或少玩过vmware虚拟机,咱们通常都会在虚拟机上装一些软件,好比mysql,道理同样,咱们也能够在docker上面安装一些软件,redis或者mysql或者本身开发的应用程序。html

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

上面提到的内容,咱们能够总结出几个知识点。mysql

  • 一、docker有本身的中央镜像仓库,也有相似maven仓库地址可分为第三方仓库,甚至,咱们能够搭建本身的docker镜像仓库地址,harbor能够了解一下。
  • 二、docker就相似一台虚拟机,咱们成为容器,容器顾名思义就是装东西,装的东西咱们称为镜像

2、Docker安装

小编认为,docker自己就是一个服务,要在linux上面搭建docker服务,咱们首先要作的无非就是下载并启动docker。在centos、redhat上,咱们能够经过下面命令安装咱们的docker容器。linux

yum install dockergit

下载完成以后,咱们能够经过下面命令查看下docker安装的位置以及版本,输出以下:web

whereis docker
docker --version
复制代码

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

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

3、在Docker上部署咱们的SpringBoot服务

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

咱们首先在[start.spring.io/]网站上建立一个springboot web Demo程序,大体的目录结构以下:sql

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

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表示镜像在后台运行

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

4、Docker扩展

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

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

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