docker中使用idea部署运行项目(项目以镜像方式运行)

在上几篇文章中我们安装了docker,jdk和mysql,接下来我们来到重点,如何与项目挂钩部署,这是我们最关心的问题!

既然我们要使用idea来部署,那么我们则需要先安装docker插件!

安装好后重启idea

接下来我们配置docker,我们发现,需要配置docker的连接地址,配置我们的阿里云服务器ip地址(注意端口入方向要配置2375端口)

这时会报一个连接失败的问题(原因是因为docker没有配置远程访问)

在Docker的生态系统中,存在下列三种API:

  1. Reistry API:与存储Docker镜像的Registry相关的功能。
  2. Docker Hub API:与Docker Hub相关的功能
  3. Docker Remote API:与Docker守护进程相关的功能。

其中,Docker Remote API是使用最为频繁的API类型.我们通过idea部署项目其实就是通过Remote API来操作的。

Remote API主要用于远程访问Docker守护进程从而下达指令的。 
因此,我们在启动Docker守护进程时,需要添加-H参数并指定开启的访问端口。 
通常,我们可以通过编辑守护进程的配置文件来实现。 

docker端口

2375:未加密的docker socket,远程root无密码访问主机
2376:tls加密套接字,很可能这是您的CI服务器4243端口作为https 443端口的修改
2377:群集模式套接字,适用于群集管理器,不适用于docker客户端
5000:docker注册服务
4789和7946:覆盖网络

在这里,我们先使用2375不加密端口来学习下docker部署项目。

在/usr/lib/systemd/system/docker.service,配置远程访问

vim /usr/lib/systemd/system/docker.service

修改为:

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

刷新配置并重启docker

systemctl daemon-reload
systemctl restart docker

测试是否生效

curl http://127.0.0.1:2375/info

再次尝试在idea连接

连接成功!

接下来我们创建一个最简单的springboot项目,只集成web

创建dockerfile文件(注意dockerfile的位置)

# 基础镜像,使用阿里云服务器中的jdk容器
FROM primetoninc/jdk:1.8
#作者
MAINTAINER hualiang.liu-ext

#系统编码
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8

#声明一个挂载点,容器内此路径会对应宿主机的某个文件夹
VOLUME /tmp

#应用构建成功后的jar文件被复制到镜像内,名字也改成了demo-0.0.1.jar
ADD target/demo-0.0.1-SNAPSHOT.jar demo-0.0.1.jar

#启动容器时的进程
ENTRYPOINT ["java","-jar","/demo-0.0.1.jar"]

#暴露9527端口
EXPOSE 9527

在idea配置dockerfile启动

注意:这里只配置宿主机端口:容器端口,否则会报错com.github.dockerjava.api.exception.InternalServerErrorException:starting userland proxy: listen tcp x.x.x.x:9527: bind: cannot assign requested address

然后我们尝试运行(注意9527端口需要在阿里云服务器开放)

可以看到idea控制台上出现下图

启动成功!浏览器访问:

完成!

补充:上边我们开启docker api时没有加认证不安全,接下来我们把认证加上

我们使用openssl生成证书

首先了解下概念

什么是x509证书链

x509证书一般会用到三类文件,key,csr,crt。
Key是私用密钥,openssl格式,通常是rsa算法。
csr是证书请求文件,用于申请证书。在制作csr文件的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥。
crt是CA认证后的证书文件(windows下面的csr,其实是crt),签署人用自己的key给你签署的凭证。

概念

    首先要有一个CA根证书,然后用CA根证书来签发用户证书。
    用户进行证书申请:一般先生成一个私钥,然后用私钥生成证书请求(证书请求里应含有公钥信息),再利用证书服务器的CA根证书来签发证书。
    特别说明:
(1)自签名证书(一般用于顶级证书、根证书): 证书的名称和认证机构的名称相同.
(2)根证书:根证书是CA认证中心给自己颁发的证书,是信任链的起始点。任何安装CA根证书的服务器都意味着对这个CA认证中心是信任的。
    数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件。数字证书包含证书中所标识的实体的公钥(就是说你的证书里有你的公钥),由于证书将公钥与特定的个人匹配,并且该证书的真实性由颁发机构保证(就是说可以让大家相信你的证书是真的),因此,数字证书为如何找到用户的公钥并知道它是否有效这一问题提供了解决方案。

openssl中有如下后缀名的文件

.key格式:私有的密钥
.csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
.crt格式:证书文件,certificate的缩写
.crl格式:证书吊销列表,Certificate Revocation List的缩写
.pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式

在这里我们将建立自己的建立自己的证书授权中心(根证书)

CA根证书的生成步骤(https://docs.docker.com/engine/security/https/官网地址)

确保本机安装openssl

which openssl

为了方便管理,我在/etc/pki/CA下创建docker目录用来存放证书生成过程的所有文件

创建ca.srl序列号文件指定开始序列号(不然会报错ca.srl: No such file or directory
140267092453264:error:06067099:digital envelope routines:EVP_PKEY_copy_parameters:different parameters:p_lib.c:137:
140267092453264:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen('ca.srl','r')
140267092453264:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404:
)

echo 01 | sudo tee ca.srl

生成CA私钥(.key)(输入ca私钥文件密码)-->自签名得到根证书(.crt)(CA给自已颁发的证书)(注意输入第二个命令时会让输入国家,城市,地区,职位,公司,姓名,邮件地址等信息(设置的密码要记住  新 CA 中,我们需要用这个密码来创建并对证书签名)。

# 生成CA私钥(.key) 
openssl genrsa -aes256 -out ca-key.pem 4096
# 自签名得到根证书(.crt)
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

 

这样我们的根CA证书就有了!

创建docker服务器的证书

生成私钥(.key)(设置私钥密码)-->生成证书请求(.csr)(输入私钥密码)-->用CA根证书签名得到证书(.crt)-->转换为(.pem)-->清除docker服务器密钥的密码(在Docker守护进程启动的时候再输入一次密码,因此需要清除它)

# 生成私钥(.key)(设置私钥密码)
openssl genrsa -des3 -out server-key.pem 
# 生成证书请求(.csr)(输入私钥密码)
openssl req -new -key server-key.pem -out server.csr
# 由于TLS连接可以通过IP地址和DNS名称进行,因此在创建证书时需要指定IP地址
# 不配置会报错(docker chanel disconnected before any data was received)
echo subjectAltName = IP:阿里云公网ip,IP:0.0.0.0 >> extfile.cnf
# 将Docker守护程序密钥的扩展用法属性设置为仅用于服务器身份验证
echo extendedKeyUsage = serverAuth >> extfile.cnf
# 用CA根证书签名得到证书(.crt)
openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -out server-cert.pem -extfile extfile.cnf
# 清除docker服务器密钥的密码
openssl rsa -in server-key.pem -out server-key.pem

 

 

这样我们就创建好了docker服务器的证书,接下来让这个证书生效

1.修改/usr/lib/systemd/system/docker.service文件,修改ExecStart选项;然后使用了--tlsverify标志来启动TLS,然后使用--tlscacert、--tlsscert、--tlskey这3个参数指定了CA证书、docker服务证书和docker服务密钥的位置。

vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
修改为:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 
-H tcp://0.0.0.0:2376 
--tlsverify 
--tlscacert=/etc/pki/CA/docker/ca.crt 
--tlscert=/etc/pki/CA/docker/server.pem 
--tlskey=/etc/pki/CA/docker/server.key

2.之后重启Docker服务,然后再重启Docker守护进程,之后查看守护进程的状态

systemctl daemon-reload
systemctl restart docker
systemctl status docker.service

接来配置客户端的证书密钥,可以让idea使用https的方式连接docker

实际上Docker客户端与服务端应该不在同一台机器上操作,但是此处我们只有一台机器,因此都在一台机器上操作了

生成客户端私钥(.key)(设置客户端私钥密码)-->生成客户端证书请求(.csr)(输入客户端私钥密码)-->要使密钥适合客户端身份验证,请创建扩展配置文件(extfile.cnf)-->用CA根证书和CA密钥得到客户端证书(.pem)-->清除docker客户端器密钥的密码(以便在Docker客户端中使用该文件)

# 生成客户端私钥(.key)(设置客户端私钥密码)
openssl genrsa -des3 -out client-key.pem
# 生成客户端证书请求(.csr)(输入客户端私钥密码)
openssl req -new -key client-key.pem -out client.csr
# 要使密钥适合客户端身份验证,请创建扩展配置文件(extfile-client.cnf)
echo extendedKeyUsage = clientAuth >> extfile-client.cnf
# 用CA根证书和CA密钥得到客户端证书(.pem)
openssl x509 -req -days 365 -in client.csr -CA ca.pem -CAkey ca-key.pem -out client-cert.pem -extfile extfile-client.cnf
# 清除docker客户端器密钥的密码(以便在Docker客户端中使用该文件)
openssl rsa -in client-key.pem -out client-key.pem

我们使用idea连接前把生成的client-cert.pem,client-key.pem,ca.pem 下载到本地(yum -y install lrzsz  使用sz下载)

注意将阿里云的端口从2375改为2376

在本地创建文件夹,将下载的文件放到文件夹中

要改名字哟(client-cert.pem ----》cert.pem,client-key.pem----》key.pem,ca.pem),不然会报错:Cannot connect: java.lang.llegalArgumentException:Can't locate certificate files under

修改tcp://:2375为https://阿里云公网ip:2376,选择刚创建的文件夹

连接成功!

 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值