docker入门

307 阅读4分钟

docker 重要概念

Image:可以理解为虚拟机的快照,里面包含了你要部署的应用程序以及关联的所有库、软件。通过 Image 可以创建许多个不同的 Container
Container:类似运行起来的虚拟机,里面运行着应用程序。每个 Container 是独立运行的,相互之间不影响。
Dockerfile:自动化脚本,创建 Image,并运行 Container

国内 Docker仓库

DaoCloud

国外 Docker仓库

Docker Hub

## 配置 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 打开界面类似这种:

image.png

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();  
    }  
}
  1. 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 部署配置

image.png

  • 同配置普通的springboot类似,在配置管理->编辑配置->新增配置,对应图上 1、2、3 的地方,完成 docker基本配置的添加
  • 修改docker配置。重点配置
    • 构建->Dockerfile
      • 配置docker容器的路径,对应 docker desktop安装后的docker存放路径
    • 运行->容器名称
      • 给要启动的容器起个好听容易辨识的名字
    • 运行->绑定端口
      • 将docker容器的端口跟本地端口进行映射,这里配置的绑定端口是 18080:8080,也就是本地的18080端口跟docker容器的 8080进行绑定映射关系。在本地访问时,直接通过 18080端口进行docker里面springboot应用的访问
    • 执行前
      • 目标是在执行docker部署前需要提前完成的事情,对应 springboot 应用而言就是 maven 的打包工作

启动并验证

构建过程

  • 通过 构建日志 查看构建的过程
  • 构建过程中,会按照运行配置里面的配置进行提前打包,按照 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