近年来微服务可谓是火遍大江南北,随着业务的拆分和高可用和集群,服务变得越来越多,不再像原来的单体应用架构那样,部署只需要执行一条nohup java -jar xx.jar &就可以完成部署,如果在微服务里还是用这种方式完成部署的话那就太low太耗时间了,Docker的出现很好的解决了这个问题,可以说Docker和微服务是天生一对,用上Docker问题已经解决一大半了,但人是贪心的,总感觉还不够完美,要是能像在IDEA中启动项目一样完成部署,且日志显示在控制台就好了,于是本篇就带大家从零开始到梦想成真.(默认大家已经学完了docker,并且熟悉linux常用命令,如果没有前面这两样基础,建议可以稍微去了解下,不然不太容易理解后面的概念)
先截张图给大家看看使用IDEA一键部署有多爽:
被爽到了吧,那就耐下心来跟我一起配置,从最简单的开始,一直到配置ca加密安全连接...
乞丐版:
我以IDEA2018.1和CentOS7.3为例(版本不同影响也不大)
在你的服务器上安装docker,这里我就不花篇幅介绍如何安装了,想学的可以百度或者去我简书学习(传送门:https://www.jianshu.com/p/31174a43e173)
安装后开放docker的远程连接访问:
执行:vi /usr/lib/systemd/system/docker.service
修改ExeStart为:/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
重新加载配置并重启Docker:
执行:systemctl daemon-reload 执行:systemctl restart docker
开放防火墙2375端口:
执行: /sbin/iptables -I INPUT -p tcp --dport 2375 -j ACCEPT
执行:iptables-save
OK,至此服务器端配置完成.
接下来配置IDEA:
File->settings->plugings->Browse repositories->搜索docker->选中docker integration->点击右下角install安装,完成后重启IDEA.
重启后继续打开File->settings->Build...->Docker->点击+号->选中TCP socket->输入你服务器的ip和docker远程连接的端口号2375. 输入后会自动建立连接,如果这时候你看到显示连接成功后->apply->ok. 如果显示连接失败,请关闭windows防火墙,并确认服务器端防火墙的2375端口是否已开放且处于监听状态(netstat -tnl 去找一下是否有2375且显示Listen状态)
连接完成后可以在IDEA左下角找到Docker:
没错,就是这只萌萌的小鱼,点击上图左上角的播放按钮,即可连接到服务器的docker:
然后下面带大家亲自创建镜像和容器并启动容器:
第一步:先把项目打成jar包,这个我不多说了,用maven直接打包,跟以前部署没啥两样,打包之后在target中可以找到打包好的项目:
第二步:在项目下新建DockerFile(推荐在项目顶层文件夹下新建,不要放在别处,否则可能创建镜像失败):
第三步:编写DockerFile
为了方便大家复制,再贴一遍:
-
From hub.c.163.com/library/java:8-jre
-
ADD target/*.jar ylt-config-01.jar
-
EXPOSE 8888
-
ENTRYPOINT ["java", "-jar", "ylt-config-01.jar"]
第四步:配置docker一键部署
点击Run->Run->Edit Configurations->点击+号->选择Docker->Dockerfile->然后按下图所示填写信息,填完点ok即可.
至此,自动一键部署已配置完成,下面我们来测试一下:
选中刚刚创建的docker,点击启动按钮,然后耐心等待一下,它就会帮你自动部署完成.
创建好的镜像还可以推送到远端镜像仓库,然后下次需要在其他服务器上部署时,只需要一条命令docker pull拉下来,再docer run就可以完成部署,非常爽,推送到远端仓库的话需要额外配置一下:
最后,如果你觉得这样就万事大吉了,那我只能告诉你图样图森破了,前面提到的配置是允许所有人都可以访问的,因为docker默认是root权限的,你把2375端口暴露在外面,意味着别人随时都可以提取到你服务器的root权限,是很容易被黑客黑的,因此,docker官方推荐使用加密的tcp连接,以Https的方式与客户端建立连接,由于网上搜来的以及官网上面的配置有很多地方比较难懂,稍有不慎,配下来就不能成功连接,所以这里再贴一下docker ca认证的配置方法.
大神版:
参考地址(官方):https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl
打开你的服务器,分别执行下面的命令:
1.先在/usr/local目录下创建个文件夹,这里取名叫ca,然后进入ca文件夹中
-
mkdir -p /usr/local/ca
-
cd /usr/local/ca
依次执行下面的命令,需要输入密码,自由指定,两次输入保持一致并记住即可.
openssl genrsa -aes256 -out ca-key.pem 4096
2.根据提示分别输入国家,省份,城市,组织,等一系列信息(可以随便输,无所谓的其实)
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
3.生成server-key.pem,输入下面命令敲回车即可.
openssl genrsa -out server-key.pem 4096
4.把下面的$Host换成你自己服务器外网的IP或者域名:比如:openssl req -subj "/CN=192.168.1.0" -sha256...
或:openssl req -subj "/CN=www.laohan.com" -sha256...(这么做前提是你有域名,该域名DNS解析后指向你的服务器)
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
5.配置白名单,也就是你接下来要允许那些ip可以连接到服务器的docker,因为已经是ssl连接,所以我推荐配置0.0.0.0,也就是所有Ip都可以连接(但只有拥有证书的才可以连接成功),这样配置好之后公司其他人也可以使用.如果你不想这样,那你可以配置Ip,用逗号分隔开.下面的$Host依旧是你服务器外网的IP或者域名,请自行替换.
echo subjectAltName = DNS:$HOST,IP:0.0.0.0 >> extfile.cnf
6.执行下面语句:
echo extendedKeyUsage = serverAuth >> extfile.cnf
7.执行下面语句,然后输入前面设置过的密码,用以生成ca-key.
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out server-cert.pem -extfile extfile.cnf
8.生成客户端所需的key.pem,依旧在该服务器下执行下面命令,到时候把生成好的几个公钥私钥拷出去即可.
openssl genrsa -out key.pem 4096
9.执行下面命令:
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
10.执行下面命令:
echo extendedKeyUsage = clientAuth >> extfile.cnf
11.生成cert.pem,需要输入前面设置的密码:
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfile.cnf
12.删除"废物"
rm -v client.csr server.csr
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配置:
vi /lib/systemd/system/docker.service
-
将ExecStart=/usr/bin/dockerd
-
替换为:
-
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
16.重新加载daemon并重启docker
-
systemctl daemon-reload
-
systemctl restart docker
17.开放2376端口
/sbin/iptables -I INPUT -p tcp --dport 2376 -j ACCEPT
iptables-save
18.重启docker
service docker restart
19.然后使用工具比如winscp,或者xshell,把你当前所在的/usr/local/ca文件夹里的拷贝到你本地电脑的某个文件夹里:
(我这里本地在桌面新建了一个叫ca的文件夹)
20.至此万事大吉,大吉大利,今晚吃鸡了...下面我们打开IDEA测试一下:
没有问题,很爽,成功建立连接,接下来部署项目就可以一键部署了,而且不用担心安全问题,刚刚ca文件夹里的三个秘钥请妥善保管,只有拥有这三个秘钥的人才可以连接到远端的docker,本期教程到此为止,欢迎关注本博,会持续分享一些新知识和一些好用的工具给大家.