docker 重要概念
Image:可以理解为虚拟机的快照,里面包含了你要部署的应用程序以及关联的所有库、软件。通过 Image 可以创建许多个不同的 Container
Container:类似运行起来的虚拟机,里面运行着应用程序。每个 Container 是独立运行的,相互之间不影响。
Dockerfile:自动化脚本,创建 Image,并运行 Container
国内 Docker仓库
国外 Docker仓库
## 配置 Docker 镜像加速
Docker中国区官方镜像地址:registry.docker-cn.com
网易地址:hub-mirror.c.163.com
中国科技大学地址:docker.mirrors.ustc.edu.cn
docker desktop 安装
下载地址:www.docker.com/products/do…
Windows 和 mac 上安装 docker desktop 都是类似的操作,就是一步步的按钮点点点
安装完后的 docker desktop 打开界面类似这种:
idea环境下的docker入门
新建springboot demo
pom 文件配置
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</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>
<finalName>dockerdemo</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.11</version>
</plugin>
</plugins>
</build>
demo程序
@SpringBootApplication
@RestController
public class DockerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(DockerDemoApplication.class, args);
}
@RequestMapping("/test")
public String test(){
return "Hello world! " + LocalDateTime.now();
}
}
- Dockerfile文件编写
在 pom.xml 同级目录下新建 Dockerfile 文件。Dockerfile 文件的内容如下
### 基础镜像,使用alpine操作系统,openjkd使用8u201
FROM openjdk:8u201-jdk-alpine3.9
#系统编码
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
#声明一个挂载点,容器内此路径会对应宿主机的某个文件夹
VOLUME /tmp
#应用构建成功后的jar文件被复制到镜像内,名字也改成了app.jar
ADD target/dockerdemo.jar app.jar
#启动容器时的进程
ENTRYPOINT ["java","-jar","/app.jar"]
#暴露8080端口
EXPOSE 8080
docker 部署配置
- 同配置普通的springboot类似,在配置管理->编辑配置->新增配置,对应图上 1、2、3 的地方,完成 docker基本配置的添加
- 修改docker配置。重点配置
- 构建->Dockerfile
- 配置docker容器的路径,对应 docker desktop安装后的docker存放路径
- 运行->容器名称
- 给要启动的容器起个好听容易辨识的名字
- 运行->绑定端口
- 将docker容器的端口跟本地端口进行映射,这里配置的绑定端口是 18080:8080,也就是本地的18080端口跟docker容器的 8080进行绑定映射关系。在本地访问时,直接通过 18080端口进行docker里面springboot应用的访问
- 执行前
- 目标是在执行docker部署前需要提前完成的事情,对应
springboot应用而言就是maven的打包工作
- 目标是在执行docker部署前需要提前完成的事情,对应
- 构建->Dockerfile
启动并验证
构建过程
- 通过 构建日志 查看构建的过程
- 构建过程中,会按照运行配置里面的配置进行提前打包,按照 dockerfile 的定义进行相关包的下载。
- 构建成功后,自动创建容器(Container),并启动容器
Deploying 'myDocker Dockerfile: docker/Dockerfile'…
Building image…
Preparing build context archive…
[==================================================>]43/43 files
Done
Sending build context to Docker daemon…
[==================================================>] 16.84MB
Done
Step 1/6 : FROM openjdk:8u201-jdk-alpine3.9
---> 3675b9f543c5
Step 2/6 : ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
---> Using cache
---> 659d3dd572ee
Step 3/6 : VOLUME /tmp
---> Using cache
---> 304c375b9187
Step 4/6 : ADD target/dockerdemo.jar app.jar
---> 26a9a52e043d
Step 5/6 : ENTRYPOINT ["java","-jar","/app.jar"]
---> Running in 6b3ad59597bb
Removing intermediate container 6b3ad59597bb
---> 0a5baef19fe5
Step 6/6 : EXPOSE 8080
---> Running in 1a43582f4b17
Removing intermediate container 1a43582f4b17
---> 7da1e9c0e7c7
Successfully built 7da1e9c0e7c7
Existing container found: f18275401f4732a0aa291ae7b84cdd8554b807275e83a3a64dc85f121b5f4afb, removing…
Creating container…
Container Id: 7869fd1057d8116713675e7b9329328671980ded34390c47063ae38adca22714
Container name: 'myDocker'
Starting container 'myDocker'
'myDocker Dockerfile: docker/Dockerfile' has been deployed successfully.
启动成功时
- 可以通过 idea 里面的 日志,查看 springboot 应用的启动过程。docker容器中的springboot启动,跟 本地、ecs 等环境里启动没有任何区别
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.13.RELEASE)
2023-06-29 03:33:59.060 INFO 1 --- [ main] o.example.docker.DockerDemoApplication : Starting DockerDemoApplication v1.0.0-SNAPSHOT on 7869fd1057d8 with PID 1 (/app.jar started by root in /)
2023-06-29 03:33:59.063 INFO 1 --- [ main] o.example.docker.DockerDemoApplication : No active profile set, falling back to default profiles: default
2023-06-29 03:34:00.106 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2023-06-29 03:34:00.149 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-06-29 03:34:00.149 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.31]
2023-06-29 03:34:00.232 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-06-29 03:34:00.232 INFO 1 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1118 ms
2023-06-29 03:34:00.439 INFO 1 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2023-06-29 03:34:00.642 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-06-29 03:34:00.647 INFO 1 --- [ main] o.example.docker.DockerDemoApplication : Started DockerDemoApplication in 1.933 seconds (JVM running for 2.455)
浏览器验证
访问:http://127.0.0.1:18080/test
显示:Hello world! 2023-06-29T06:09:24.540