1. docker内环境准备
- 准备好一个dockerfile;进入到包含这个file的文件夹下。
dockerfile内容如下:
这是为了构建出一个包含轻量级JDK的jar包运行环境。FROM openjdk:8-jdk-alpine RUN apk update && apk upgrade && apk add netcat-openbsd
- 在当前目录下敲下面的命令:
docker build -t openjdk:netcat . docker images docker run --rm openjdk:netcat nc -h
- 第一句最后的
.
是不能省略的;如果第一句运行失败了,很有肯恩是因为镜像下载的地址配置的不是很好;可以使用这个下载地址,阿里云的,亲测好用:"https://6kx4zyno.mirror.aliyuncs.com"
- docker images用来查看镜像列表。如果出现了下面的这个条目,则说明这一步已经成功:
REPOSITORY TAG IMAGE ID CREATED SIZE openjdk netcat abb92c2d95e0 About an hour ago 127MB
- 第三句运行检测一下下载的镜像是否有问题。如果无误,则会输出下面的代码:
- 第一句最后的
OpenBSD netcat (Debian patchlevel 1.130)
usage: nc [-46CDdFhklNnrStUuvZz] [-I length] [-i interval] [-O length]
[-P proxy_username] [-p source_port] [-q seconds] [-s source]
[-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol]
[-x proxy_address[:port]] [destination] [port]
Command Summary:
-4 Use IPv4
-6 Use IPv6
-b Allow broadcast
-C Send CRLF as line-ending
-D Enable the debug socket option
-d Detach from stdin
-F Pass socket fd
-h This help text
-I length TCP receive buffer length
-i secs Delay interval for lines sent, ports scanned
-k Keep inbound sockets open for multiple connects
-l Listen mode, for inbound connects
-N Shutdown the network socket after EOF on stdin
-n Suppress name/port resolutions
-O length TCP send buffer length
-P proxyuser Username for proxy authentication
-p port Specify local port for remote connects
-q secs quit after EOF on stdin and delay of secs
-r Randomize remote ports
-S Enable the TCP MD5 signature option
-s addr Local source address
-T toskeyword Set IP Type of Service
-t Answer TELNET negotiation
-U Use UNIX domain socket
-u UDP mode
-V rtable Specify alternate routing table
-v Verbose
-w secs Timeout for connects and final net reads
-X proto Proxy protocol: "4", "5" (SOCKS) or "connect"
-x addr[:port] Specify proxy address and port
-Z DCCP mode
-z Zero-I/O mode [used for scanning]
Port numbers can be individual or ranges: lo-hi [inclusive]
2. 基于Springboot构建image
在进行这一步之前,需要做好如下准备:
- 在maven中引入要用到的插件:
- maven-resources-plugin 在dockerfile、shell脚本中会用到相关功能
- docker-maven-plugin 运行起来能够自动进行构建
参考如下:
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<!-- here the phase you need -->
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/dockerfile</outputDirectory>
<resources>
<resource>
<directory>src/main/docker</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.10</version>
<configuration>
<imageName>${docker.image.name}:${docker.image.tag}</imageName>
<dockerDirectory>${basedir}/target/dockerfile</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
- 在正确的位置编写好Dockerfile
- 虽然可以通过指定路径参数的方式来达到一样的效果,但是还是比较建议按照maven约定俗成的目录结构来搞。
- 在/src/main/docker文件夹之下创建Dockerfile(以下仅供参考)
FROM openjdk:netcat # 指定源镜像
RUN mkdir -p /usr/local/cargoservice # 在将要构建的镜像的用户空间中创建/usr/local/cargoservice目录
ADD @[email protected] /usr/local/cargoservice/ # 将事先打成.jar包的项目拷贝到这个文件夹之下
ADD run.sh run.sh # 将我们写好的.sh脚本(用来运行jar包)转移到镜像的文件夹中
RUN chmod +x run.sh # 赋予我们的.sh脚本运行的权限
CMD ./run.sh # 在镜像中运行.sh脚本
.sh脚本的参考内容如下:
它的核心目的就是运行我们达成.jar包的Springboot项目,使之能够提供相应的功能。
#!/bin/sh
echo "********************************************************"
echo "Starting Cargo Server"
echo "********************************************************"
java -jar /usr/local/cargoservice/@[email protected]
-
其中
/usr/local/cargoservice/@[email protected]
中,用了@project.build.finalName@来代替编译好之后.jar包的名字,避免了命名混乱的问题。这是之前引入的maven-resources-plugin
包所提供的功能。 -
接下来,回到Springboot的工作目录(根目录之下),运行:
mvn clean package docker:build
,即可根据我们的/src/main/docker/Dockerfile构建出我们想要的镜像。
3. 运行镜像
docker run --rm -p 8080:8080 example/cargo-service:section11
- 镜像运行起来了,宿主机和容器的8080端口进行了映射;我们就可以在宿主机上通过8080端口来直接调用运行在image内的Springboot接口了。