在上几篇文章中我们安装了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,选择刚创建的文件夹

连接成功!

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

  1. SpringBoot项目在eclipse中能运行,部署到服务器 nohup java -jar 方式运行就无法显示报错

    SpringBoot项目在eclipse中能运行,部署到服务器 nohup java -jar 方式运行就无法显示报错: *************************** APPLICATION ...

  2. 在Docker中安装和部署MongoDB集群

    在Docker中安装和部署MongoDB集群 - tianshidan1998 - 博客园

  3. Docker中的Nginx部署ruoyi-vue遇到的问题

    一.问题描述: docker下的nginx部署前端项目报500.404错误. 二.先说解决办法: 1. docker下的nginx只能读到挂载路径下面的文件,需要将编译好的前端项目文件夹复制到ngin ...

  4. 使用docker中的apline部署自己的golang的后端代码(添加制作静态服务器的注意点)...

    1.在window上写golang后端代码 2.打开终端设置临时的Linux的环境变量: SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 如下图所示 ...

  5. docker部署博客项目

    docker 部署博客项目 发现很久没有写文章了,等我的博客完成,我应该也会继续写的 连接远程服务器 ssh root@xxxxxx yum更新一下 yum update 用来解压zip压缩包 yum ...

  6. 【Flutter】创建 Flutter 项目 ( Android Studio 创建并运行 Flutter 应用 | 命令行创建并运行 Flutter 应用 | 运行 Flutter 应用三种方式 )

    文章目录 一.Android Studio 中创建 Flutter 项目 二.命令行创建 Flutter 项目 三.通过命令行方式运行 Flutter 项目 四.通过 Android Studio 可 ...

  7. Docker中安装DB2的详细教程和DBVisualize的安装教程

    时间 内容 备注 2018年12月15日日 基本使用 Docker中安装DB2 由于新的项目中使用到了DB2的数据处理:这里记录一下基本的基础环境搭建.个人使用的Docker的搭建方案:本来是很简单的 ...

  8. Docker中搭建redis分片集群,搭建redis哨兵结构,实现springboot中对redis分片集群、哨兵结构的访问,Redis缓存雪崩、缓存击穿处理(非关系型数据库技术课程 第十二周)

    文章目录 一.要求: 二.知识总结 缓存雪崩 解决方案 docker中redis分片集群搭建 配置好配置文件 redis-6380.conf redis-6381.conf redis-6382.co ...

  9. 【Docker】在Docker中安装redis、rabbitmq

    Docker中的Redis安装 1. 拉取最新镜像:docker pull redis:latest 2. 运行 redis 容器,不设置密码:docker run -itd --name redis ...

最新文章

  1. 浅谈osi模型 三次握手 四次挥手 ddos攻击原理
  2. Jupyter notebook 运行环境创建和切换 (Win10+Anaconda)
  3. 宅家学习秘密武器!让时间从视频流和朋友圈中回到程序员的视野中吧!
  4. js 监听页面url锚点变化 window.onpopstate
  5. Appium移动自动化测试(一)--安装Appium(转)
  6. 震惊!单身也要开始交税了!你还没有用Python帮你找一个女朋友吗
  7. ASP.NET关于WebPages的一点总结
  8. Spring Boot之发送HTTP请求(RestTemplate详解)
  9. 自下而上分析法基本问题
  10. vs2008试用版的评估期已经结束解决办法
  11. 淘宝ActiveMQ安装搭建
  12. 面向对象封装的web服务器
  13. 【老生谈算法】matlab实现免疫算法源码——免疫算法
  14. 计算机专业如何高质量的走完大学四年?毕业成为Offer收割机
  15. 关于虚拟机中的HWADDR和MACADDR地址
  16. DELL XPS 8930-R 从优盘安装centos7服务器
  17. VScode写Go代码引用的包报错飘红
  18. C primer Plus 9.3.4 递归和倒序计算 DE3
  19. 滴滴单通道语音分离与目标说话人提取和抑制技术进展
  20. 代码 羊角螺旋_机电设计中的数学之美——羊角螺旋让你平稳过弯

热门文章

  1. Linux中select函数的使用 select() Linux linux函数 select
  2. python连接linux后一步一步的操作_Python使用技巧
  3. Python制作彩色二维码
  4. Android.mk转换到Android.bp方法
  5. Chrome查看Android的systrace抓取的log
  6. mac安装ffmpeg
  7. Srs之HttpApi内部调用流程
  8. ios 配置java环境变量_Ios 入门 ----基本的控件
  9. crontab 每天凌晨12点定时器_双十一预售:李佳琦薇娅凌晨12:00点,观看次数双双破亿...
  10. linux学习笔记:处理linux目录的常用命令