前言
最近在项目中使用到了一些docker技术,因为没有专业的运维人员,所以在部署版本应用的时候,都是自己在进行打包部署。经过一段时间的操作和使用,在这里和大家分享一下自己的心得,也算是做一下总结吧。准备工作
首先,我们的项目是基于Java语言开发的,也是使用大名鼎鼎的spring boot这套框架来构建的。那我们首先需要准备一个spring boot应用工程,还需要相对应的jdk版本,反正我们还是使用的jdk8。然后就是编写一个需要构建镜像的Dockerfile文件。其他的就是一些基本环境准备了,比如说docker环境啥的了。Java工程
作为演示,我就直接使用spring initializer快速生成一个Java工程。当然,大家在自己使用的过程中,完全可以按照自己原来的工程创建方式来构建。在工程中,随便定义一个接口,有响应就行。方便后面进行测试验证。至于后续部署打包的配置,原来是啥样就啥样,不用去更改,只需要在后续的构建镜像中修改对应的启动命令就行了。完全不影响我们的编码和配置。下面是一些工程示例:项目pom文件:
<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>
<groupId>top.layne</groupId>
<artifactId>layne-docker</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>layne-docker</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.8</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<finalName>layne-docker</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
示例接口:
package top.layne.docker.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 控制器
*
* @author Layne
* @date 2024/9/7
*/
@RequestMapping("docker")
@RestController
public class DockerController {
/**
* ping
*
* @return
*/
@RequestMapping("ping")
public Object ping() {
return "pong";
}
}
Dockerfile文件
在工程打好包后,我们就需要将部署包构建为docker镜像文件。那在构建镜像的时候,我们就需要一个Dockerfile文件来告诉docker怎么进行一个镜像的生成,比如说一些环境配置啊,部署包的路径啊,暴露的一些端口配置啊,启动命令啥的。那我们这里就需要告诉docker,我们部署的Java应用是需要一个jdk的运行环境,端口的话需要暴露8080,设置一个应用的工作目录/app,服务启动命令`java -jar layne-docker.jar`。项目中如果是使用的脚本启动的话,只需要将启动命令替换成对应的脚本启动命令就行了
如:ENTRYPOINT [“./springboot-start.sh”,“start”,“test”]
Dockerfile文件:
# 配置jdk基础镜像
FROM openjdk:8u342
# 设置环境变量
ENV LANG=zh_CN.UTF-8
ENV LANGUAGE=zh_CN.UTF-8
ENV LC_ALL=zh_CN.UTF-8
ENV TZ=Asia/Shanghai
# 暴露服务端口
EXPOSE 8080
# 设置工作目录
WORKDIR /app
# 拷贝本地文件到容器中
COPY ./ .
#启动命令
ENTRYPOINT ["java","-jar","layne-docker.jar"]
构建镜像
在工程打好部署包,Dockerfile文件也配置好后,我们就可以开始构建应用的镜像文件了。首先,我们把部署包和Dockerfile文件一起上传到具有Docker环境的服务器中。一般这个服务器也就是我们应用需要部署的机器了。然后通过docker build命令来执行构建镜像的命令。比如我这里:`docker build -f Dockerfile -t layne-docker-test:1.0 .`,这条指令代表的意思就是我需要构建一个docker镜像,镜像名称叫做layne-docker-test,版本号是1.0。上传文件:
# 使用rz -y上传jar包和Dockerfile
layne@layne-ubuntu-22-3:~/app$ rz -y
rz waiting to receive.
Starting zmodem transfer. Press Ctrl+C to cancel.
Transferring Dockerfile...
100% 352 bytes 352 bytes/sec 00:00:01 0 Errors
Transferring layne-docker.jar...
100% 17236 KB 17236 KB/sec 00:00:01 0 Errors
# 查看文件
layne@layne-ubuntu-22-3:~/app$ ll
total 17252
drwxrwxr-x 2 layne layne 4096 9月 8 00:40 ./
drwxr-x--- 17 layne layne 4096 9月 8 00:28 ../
-rw-r--r-- 1 layne layne 352 9月 7 23:41 Dockerfile
-rw-r--r-- 1 layne layne 17650310 9月 7 22:53 layne-docker.jar
docker build 镜像
# 执行构建镜像命令 docker build -f Dockerfile -t layne-docker-test:1.0 .
layne@layne-ubuntu-22-3:~/app$ docker build -f Dockerfile -t layne-docker-test:1.0 .
Sending build context to Docker daemon 17.65MB
Step 1/9 : FROM openjdk:8u342
---> b273004037cc
Step 2/9 : ENV LANG=zh_CN.UTF-8
---> Running in 755f1b0d64c9
Removing intermediate container 755f1b0d64c9
---> 16d81d0f30a2
Step 3/9 : ENV LANGUAGE=zh_CN.UTF-8
---> Running in 4728c8eed89a
Removing intermediate container 4728c8eed89a
---> ea937a011201
Step 4/9 : ENV LC_ALL=zh_CN.UTF-8
---> Running in ac8d41bb7a93
Removing intermediate container ac8d41bb7a93
---> 3d45873454a3
Step 5/9 : ENV TZ=Asia/Shanghai
---> Running in d8c995bb1587
Removing intermediate container d8c995bb1587
---> 068f3ce94784
Step 6/9 : EXPOSE 8080
---> Running in 2e48bd628e47
Removing intermediate container 2e48bd628e47
---> 9491375594d4
Step 7/9 : WORKDIR /app
---> Running in c1b63d3aa83e
Removing intermediate container c1b63d3aa83e
---> e619e9e805b9
Step 8/9 : COPY ./ ./
---> f955c8e6e299
Step 9/9 : ENTRYPOINT ["java","-jar","layne-docker.jar"]
---> Running in 0677934829d1
Removing intermediate container 0677934829d1
---> b76b892bab21
Successfully built b76b892bab21
Successfully tagged layne-docker-test:1.0
查看镜像:
layne@layne-ubuntu-22-3:~/app$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
layne-docker-test 1.0 b76b892bab21 11 seconds ago 544MB
openjdk 8u342 b273004037cc 2 years ago 526MB
启动容器:
layne@layne-ubuntu-22-3:~/app$ docker run --name layne-docker-test-1.0 -p 8080:8080 -d layne-docker-test:1.0
3e30aa38a58624fd698456cdbdac174692ae8e873b51f474ebc57e0ed72f1407
查看容器:
layne@layne-ubuntu-22-3:~/app$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e30aa38a586 layne-docker-test:1.0 "java -jar layne-doc…" 3 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp layne-docker-test-1.0
查看日志:
layne@layne-ubuntu-22-3:~/app$ docker logs 3e30aa38a586
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.8)
2024-09-08 00:42:45.115 INFO 1 --- [ main] top.layne.docker.Application : Starting Application v1.0-SNAPSHOT using Java 1.8.0_342 on 3e30aa38a586 with PID 1 (/app/layne-docker.jar started by root in /app)
2024-09-08 00:42:45.119 INFO 1 --- [ main] top.layne.docker.Application : No active profile set, falling back to 1 default profile: "default"
2024-09-08 00:42:46.446 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2024-09-08 00:42:46.470 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2024-09-08 00:42:46.470 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.71]
2024-09-08 00:42:46.568 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2024-09-08 00:42:46.568 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1348 ms
2024-09-08 00:42:47.124 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2024-09-08 00:42:47.137 INFO 1 --- [ main] top.layne.docker.Application : Started Application in 2.568 seconds (JVM running for 3.231)
验证接口:
# 通过curl访问接口地址
layne@layne-ubuntu-22-3:~/app$ curl localhost:8080/docker/ping
# 响应结果pong
ponglayne@layne-ubuntu-22-3:~/app$
layne@layne-ubuntu-22-3:~/app$
后语
总而言之,通过一段时间的docker指令操作,对于docker的一些基本指令也慢慢熟悉了。对于应用的镜像构建,容器的启动这些操作指令也都基本会操作使用了。当然,这中间有很多的操作,我们都可以使用一些脚本啊或者一些自动化部署工具来代替手工操作。但是在我们学习的过程中,这样一步步自己手动敲出来的会更加有印象。喜欢的朋友可以扫描下方二维码点个关注,谢谢您的阅读。