一、Docker部署SpringBoot项目
(一)实现步骤
1、准备好一个基于springboot项目
2、mvn package install -->springboot.jar
3、windows系统:java -jar springboot.jar(内置tomcat)4、Linux系统完成微服务项目部暑:
Linux系统中安装好JDK(环境变量)jar -jar springboot . jar
注意事项: Linuxk中 jar -jar springboot(仅能执行一个java -jar)如果执行多个java -jar linux会将旧的退出,只让新的运行。
nohup java -jar springboot.jar nohup java -jar springboot1.jar
(二)定制镜像部署
#Dockerfile
FROM java:8
VOLUME /tmp
ADD exam-0.0.1-SNAPSHOT.jar exam.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/ ./urandom","-jar","/exam.jar"]
1、准备项目
2、Dockerfile
FROM:表示基础镜像,即运行环境
VOLUME /tmp创建/tmp目录并持久化到Docker数据文件夹,因为Spring Boot使用的内嵌Tomcat容器默认使用/tmp作为工作目录。
ADD:拷贝文件并且重命名(ADD exam-0.0.1-SNAPSHOT.jar exam.jar将应用jar包复制到J/exam.jar)。
EXPOSE:并不是真正的发布端口,这个只是容器部署人员与建立image的人员之间的交流,即建立image的人员告诉容器布署人员容器应该映射哪个端口给外界。
ENTRYPOINT:容器启动时运行的命令,相当于我们在命令行中输入java -jar xxx.jar,为了缩短Tomcat的启动时间,添加java.security.egd的系统属性指向/dev/urandom作ENTRYPOINT
3、构建容器
docker build -t exam
4、运行容器
docker run -d --name ch3-boot-8080 ch3-boot
5、查看运行日志
二、IDEA与Docker
(一)、Docker开启远程访问
#修改该Docker服务文件
vi /lib/systemd/system/docker.service
#修改ExecStart这行
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
将文件内的 ExecStart注释。新增如上行。
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375-H unix:///var/run/docker.sock
#重新加载配置文件
systemctl daemon-reload
#重启服务
systemctl restart docker.service
#查看端口是否开启
netstat -nlpt
#如果找不到netstat命令,可进行安装。yum install net-tools
#直接curl看是否生效
curl http://127.0.0.1:2375/info
(二)、IDEA安装Docker插件并配置
1、安装
打开ldea,从File->Settings->plugins->-lnstall JetBrains plugin进入插件安装界面,在搜索框中输入docker,可以看到Docker integration,点击右边的Install按钮进行安装。安装后重启ldea。
2、配置
File->Settings->Build->Docker(删除多余配置,点击连接)->https://gxeo3yz7.mirror.aliyuncs.com->+java Engine API URL:服务器IP->OK
(三)、IDEA使用Docker工具
1、删除镜像
2、创建容器
3、持续集成插件-自动化部署
docker-maven-plugin插件就是为了帮助我们在Maven工程中,通过简单的配置,自动生成镜像并推送到仓库中。
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!-- 镜像名称 zahngjinhe/exam-->
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<!--指定标签-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!-- 基础镜像jdk1.8-->
<baseImage>java</baseImage>
<!-- 制作者提供本人信息-->
<maintainer>zhangjinhe@aliyun.com</maintainer>
<!--切换到/ROOT目录-->
<workdir>/ROOT</workdir>
<cmd>["java","-version"]</cmd>
<entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint>
<!-- 指定Dockerfile路径
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
-->
<!--指定远程docker api地址-->
<dockerHost>http://服务器IP:2375</dockerHost>
<!-- 这里是复制jar包到docker容器指定目录配置-->
<resources>
<resource>
<targetPath>/ROOT</targetPath>
<!--用于指定需要复制的根目录,${project.build.directory}表示target目录-->
<directory>${project.build.directory}</directory>
<!--用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
修改代码后需重新执行: mvn clean package docker :build
4、扩展配置
绑定Docker命令到Maven各个阶段。
可以把 Docker分为 build、tag. push,然后分别绑定 Maven的 package、deploy阶段,
只需要执行mvn deploy就可以完成整个build、tag、 push操作了,当执行mvn build就只完成build、tag操作。
<executions>
<!--当执行mvnpackage时,执行:mvncleanpackagedocker:build--> <execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<!--当执行mvnpackage时,会对镜像进行标签设定-->
<execution>
<id>tag-image</id>
<phase>package</phase>
<goals>
<goal>tag</goal>
</goals>
<configuration>
<image>${docker.image.prefix}/${project.artifactId}:latest</image>
<newName>docker.io/${docker.image.prefix}/${project.artifactId}:${project.version}
</newName>
</configuration>
</execution>
<execution>
<id>push-image</id>
<phase>deploy</phase>
<goals>
<goal>push</goal>
</goals>
<configuration>
<imageName>docker.io/${docker.image.prefix}/${project.artifactId}:${project.version} </imageName>
</configuration> </execution>
</executions>
三、IDEA整合Docker加密认证
官方文档:Protect the Docker daemon socket | Docker Documentation
1、创建ca文件夹,存放CA私钥和公钥
mkdir -p /usr /local/ca
cd /usr/loca1/ca/
2、生成CA私钥和公钥
openssl genrsa -aes256 -out ca-key.pem 4096
#输入两次自定义密码
3、依次输入密码、国家、省、市、组织名称、邮箱等
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
#密码、国家、省份、城市、组名称、单元名、昵称、邮箱
4、生成server-key.pem
openssl genrsa -out server-key.pem 4096
5、CA签署公钥
由于TLS连接可以通过IP地址和DNS名称进行,所以在创建证书时需要指定IP地址。例如,允许使用10.10.10.20和127.0.0.1进行连接:
$Host换成你自己服务器外网的IP或者域名。
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
#比如
openssl req -subj "/CN=192.168.20.135" -sha256 -new -key server-key.pem -out server.csr
#或
openssl req -subj " /CN=www.java.com"-sha256 -new -key server-key.pem -out server.csr
#本地是局域网:
openssl req -subj "/CN=192.168.20.135" -sha256 -new -key server-key. pem -out server.csr
6、配置白名单
- 允许指定ip可以连接到服务器的docker,可以配置ip,用逗号分隔开。
- 因为已经是ssl连接,所以推荐配置0.0.0.0,也就是所有ip都可以连接(但只有拥有证书的才可以连接成功),这样配置好之后公司其他人也可以使用。
如果填写的是ip地址命令如下
echo subjectAltName = IP:$HOST,IP:0.0.0.0 >> extfile.cnf
#如果填写的是域名―命令如下
echo subjectAltName = DNS:$HOST,IP:0.0.0.0 >> extfi1e.cnf
#上面的$Host依旧是服务器外网的IP或者域名,请自行替换。
echo subjectAltName = IP:192.168.20.135,IP:0.0.0.0 >>extfile.cnf
7、执行命令
#将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证:
echo extendedKeyusage = serverAuth >> extfi1e.cnf
8、生成证书签名
openssl X509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out server-cert.pem -extfile extfile.cnf
输入密钥 (前面设置过的)
9、生成客户端的key.pem
openssl genrsa -out key.pem 4096
openss1 req -subj '/CN=client' -new -key key.pem -out client.csr
10、要使密钥适合客户端身份验证
创建两个扩展文件:
echo extendedKeyUsage = clientAuth >> extfile.cnf
echo extendedKeyusage = clientAuth > extfi1e-client.cnf
11、生成签名证书
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -cAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfi1e-client.cnf
输入密码
12、删除不需要的文件,两个证书签名请求
生成cert.pem和server-cert之后,可以安全地删除两个证书签名请求和扩展配置文件。
rm -v client.csr server.csr extfile.cnf extfile-client.cnf
13、可修改权限
#要保护您的密钥免受意外损坏,请删除其写入权限。要使它们只能被您读取,更改文件模式
chmod -v 0400 ca-key.pem key.pem server-key.pem
#证书可以是对外可读的,删除写入权限以防止意外损坏
chmod -v 0444 ca.pem server-cert.pem cert.pem
14、归集服务器证书
cp server-*.pem /etc/docker/
cp ca.pem /etc/docker/
15、修改Docker配置
#使Docker守护程序仅接受来自提供CA信任的证书的客户端的连接
vim /lib/systemd/system/docker.service
#将
Execstart=/usr/bin/dockerd
#替换为:
Execstart=/usr/bin/dockerd --t7sverify --tlscacert=/usr/local/ca/ca.pem --tlscert=/usr/local/ca/server-cert.pem --t7skey=/usr/local/ca/server-key.pem -H
tcp://0.0.0.0:2375 -H unix: ///var/run /docker.sock
16、重新加载daemon并重启docker
s ystemctl daemon-reload
s ystemctl restart docker
17、开放2375端口
/sbin/iptables -I INPUT -p tcp --dport 2375 -j ACCEPT
18、重启Docker
IDEA操作Docker
- ca证书复制到客户端机器(ca、ca-key、cert、key)
- File->Settings->Build->Docker->+name Engine API URL:tcp变为https+服务器IP->选择ca目录->OK
四、Docker-Portainer图形化
#1、查看portainer镜像
docker search portainer
#2、portainer镜像下载
docker pull portainer/portainer
#3、启动dockerui容器
docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sockportainer/portainer
#4、浏览器访问
http://IP:9000/
五、Docker-Compose(Docker三剑客之一)
(一)简介
- 解决高并发->服务器集群,达到快速部署,并解决资源浪费问题。
- 使用Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器Docker的应用程序工具。
- 负责快速的部署分布式应用。
Compose中有两个重要的概念:
- 服务(service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目(project ):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml文件中定义。
(二)安装与卸载
参考资源文件:Docker-Composedemo01.pdf