Docker应用

一、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

Docker是一种开源的容器化平台,可以帮助开发者将应用程序及其依赖项打包成一个独立的容器,实现应用程序的快速部署和跨平台运行。下面是Docker应用部署的一般步骤: 1. 安装Docker:首先需要在目标机器上安装Docker引擎,可以根据不同的操作系统选择相应的安装方式。 2. 编写Dockerfile:Dockerfile是一个文本文件,用于定义Docker镜像的构建过程。在Dockerfile中,你可以指定基础镜像、安装依赖、复制文件、设置环境变量等。 3. 构建镜像:使用Docker命令行工具执行`docker build`命令,根据Dockerfile构建镜像。该命令会根据Dockerfile中的指令逐步执行,并生成一个可运行的镜像。 4. 运行容器:使用`docker run`命令来创建并运行一个容器。在运行容器时,可以指定端口映射、环境变量、数据卷等参数。 5. 配置网络:如果应用程序需要与其他容器或主机进行通信,可以使用Docker网络功能进行配置。可以选择使用默认的桥接网络,或者创建自定义网络。 6. 监控和管理:Docker提供了一系列命令和工具来监控和管理容器。例如,可以使用`docker ps`命令查看正在运行的容器,使用`docker logs`命令查看容器的日志。 7. 扩展和更新:如果需要扩展应用程序的规模或更新应用程序的版本,可以使用Docker Swarm或Kubernetes等容器编排工具来管理多个容器的部署和调度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java张金贺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值