IDEA整合Docker,一键打包服务镜像与启动容器

news2024/11/26 2:56:17

尝试了IDEA整合Docker,坑有些多,但经过查阅资料都一一解决了,写了个案例,感觉这种方式确实要方便很多。下面来整理下步骤:

一、安装Docker

准备一台Linux,我这里用的是centos 7 mini 版,然后安装Docker

  1. 安装Device Mapper:

    yum install -y yum-utils device-mapper-persistent-data lvm2
    
  2. 配置Docker的yum源:

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  3. 更新yum缓存

    yum makecache fast
    
  4. 安装Docker-ce

    yum -y install docker-ce
    
  5. 等待上述加载完,然后启动Docker

    systemctl start docker
    
  6. 校验Docker是否安装成功

    docker -v
    

    如果能输出版本号等信息,说明Docker安装OK,如下:

    [root@localhost ~]# docker -v
    Docker version 20.10.22, build 3a2c30b
    

二、开启Docker的远程访问

  1. 修改服务文件:/lib/systemd/system/docker.service

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

    image-20230116001447210

    ps:注意间隔,别写错了(我这步就是因为-H跟前面的写一块了,结果报了一堆奇怪的问题,(⊙o⊙)…

  2. 重新加载配置文件

    systemctl daemon-reload
    
  3. 重启服务

    systemctl restart docker
    
  4. 内部检验:curl http://127.0.0.1:2375/info

    image-20230116002022460

  5. 外部访问(浏览器访问你Linux的IP+2375/info)

    image-20230116002229312

    能访问到如上信息,说明外部访问也是OK的

    ps:如果你访问不到,注意检查下2375端口是否开放,我这里安装了宝塔面板,可以方便在安全里添加开放端口的规则,当然你不装这个也行,用命令行也是可以操作的呢。

    image-20230116002534553

三、在IDEA整合Docker

  1. 先安装个插件Docker(在插件市场里面可以找到)

    image-20230116002756415

  2. 配置连接远程Docker信息

    信息填写完整,下方出现connection successful说明连接成功!

    image-20230116003020509

  3. 启动service

    image-20230116003253279

  4. 然后就能浏览远程Docker里面的信息了

    (里面我拉了一些其他的镜像,可忽略)

    image-20230116003343708

四、服务打镜像

1.创建一个简单的SpringBoot项目,结构如下:

image-20230116003633915

2.pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.lys</groupId>
    <artifactId>test-docker</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.3.7.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <build>
            <plugins>
                <!-- 指定maven.compiler.plugin 配置版本,解决编译问题 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.6.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <!--项目的启动类-->
                        <mainClass>com.lys.DemoApplication</mainClass>
                        <layout>ZIP</layout>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
    </build>
</project>

3.写一个简单的Controller,如下:

package com.lys.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class DemoController {
    @GetMapping
    public String getString() {
        return "test  123!!!";
    }
}

4.启动类

package com.lys;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

5.启动项目,确保项目是正常启动

6.在项目的根目录下,编写Dockerfile,内容如下:

#指定基础镜像,在其上进行定制
FROM williamyeh/java8:latest

#维护者信息
MAINTAINER liyansheng

#这里的 /tmp 目录就会在运行时自动挂载为匿名卷,任何向 /tmp 中写入的信息都不会记录进容器存储层
VOLUME /tmp

#复制上下文目录下的target/demo-1.0.0.jar 到容器里
COPY target/test-docker-1.0-SNAPSHOT.jar  docker-0.0.1.jar

#bash方式执行,使demo-1.0.0.jar可访问
#RUN新建立一层,在其上执行这些命令,执行结束后, commit 这一层的修改,构成新的镜像。
RUN bash -c "touch /docker-0.0.1.jar"

#声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
EXPOSE 8080

#指定容器启动程序及参数   <ENTRYPOINT> "<CMD>"
ENTRYPOINT ["java","-jar","docker-0.0.1.jar"]

7.将项目打jar包

image-20230116004108628

如果打包成功,在项目下的target下我们能看到jar包

image-20230116004216546

8.切换到Dockerfile文件,点击按钮打包镜像

image-20230116004354868

在之前可以新增一些简单的配置

image-20230116004802417

然后点击上图中的run按钮,进行镜像构建与容器启动

image-20230116004953308

切换到Log面板,我们可以看到容器启动的日志

image-20230116005039825

在Dashboard可以修改配置,比如我们新增端口映射:

image-20230116005209773

这样我们在外部通过8080端口访问到容器内端口8080的服务

image-20230116005328517

在控制面板,还提供了一些快捷按钮给我们操作:

image-20230116005531044

比如进入容器:

image-20230116005547080

五、总结

综上,在IDEA里面整合Docker确实为我们提供很大的便利,比起传统的打包上传-打镜像-启动容器,上面的方式要快速很多,更多细节大家可以进一步探索!!!

六、踩坑

  1. 启动容器失败

    报错:

    (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 80 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
     (exit status 1)).
    

    image-20230114231224128

  2. IDEA打镜像报错

    image-20230115220606008

    image-20230115220836929

    上述问题我也看了很多网上的解决方案,但是我没有得到解决,最后我是卸载然后重装了Docker然后才没有报上面的错误

本次分享到这,如有不对的地方欢迎指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内网穿透的概念及解决方案

1.什么是内网穿透 在外网的web请求可以转发到内网的本地服务 2.什么是内网&#xff1f;什么是外网&#xff1f; 内网(也叫局域网(Local Area Network&#xff0c;LAN))是在一个局部的地理范围内&#xff0c;一般可以是是几米内(比如家庭内网)&#xff0c;也可以是方圆几千米…

2023 年 10 大最佳 GIS 软件

有人说&#xff1a;一个人从1岁活到80岁很平凡&#xff0c;但如果从80岁倒着活&#xff0c;那么一半以上的人都可能不凡。 生活没有捷径&#xff0c;我们踩过的坑都成为了生活的经验&#xff0c;这些经验越早知道&#xff0c;你要走的弯路就会越少。 GIS 是一个分析地理相关性…

【算法】拓扑排序

目录1.概述2.代码实现3.应用本文参考&#xff1a; LABULADONG 的算法网站 1.概述 &#xff08;1&#xff09;拓扑排序 (Topological Sort) 是指将有向无环图 G (V, E) 中所有顶点排成一个线性序列&#xff0c;使得图中任意一对顶点 u 和 v&#xff0c;若边<u, v> ∈ E(…

esp32 使用u8g2图形库 IIC驱动OLED

简介&#xff1a;使用U8g2库进行OLED的显示十分简单&#xff0c;首先要包含两个库&#xff0c;U8g2lib和Wire&#xff0c;后者是IIC通信需要用。对于IIC接口的OLED&#xff0c;需要在程序中指定一下引脚的接口定义&#xff0c;如果是SPI接口&#xff0c;可以参考U8g2库自带例程…

【Leetcode】NC31 第一个只出现一次的字符(牛客网)、面试题 01.01. 判定字符是否唯一

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 NC31 第一个只出现一次的字符 第一个只出现一次的字符_牛客题霸_牛客网【牛…

数据结构与算法(三)——顺序查找和二分查找

什么是查找 在一些数据元素中&#xff0c;通过一定的方法找出与给定关键字相同的数据元素的过程。 什么是列表查找 也叫线性表查找&#xff0c;从列表中查找指定元素 列表查找是一种算法&#xff0c;对应的自然就有输入和输出&#xff1a; 输入&#xff1a;列表、待查找元素…

【实际开发08】- Controller 层处理入参 , 可避免进去 impl 层

目录 1. 增 / 删 / 改 - 记录日志 , 查询不记录日志 2. 第一批次 : 参数校验 ( id、id1 id2 、&#xff1f;) 3. 增 / 改 dto 判空 , 实体类层 ( entity ) 进行处理 4. 通用修改 的 impl 层可供 ( status、普通 ) 使用 5. 入参优先级 : Json > Map > Javabean 1. …

终于有人将Session和cookie讲明白了!一节课彻底搞懂

1 引出session cookie session与cookie属于一种会话控制技术。常用在身份识别&#xff0c;登录验证&#xff0c;数据传输等。举个例子&#xff0c;就像我们去超市买东西结账的时候&#xff0c;我们要拿出我们的会员卡才会获取优惠。这时候&#xff0c;我们怎么识别这个会员卡真…

软考那些事儿,看这一篇就够了!

软考7个常见问题解答一、报考条件凡遵守中华人民共和国宪法和各项法律&#xff0c;恪守职业道德&#xff0c;具有一定计算机技术应用能力的人员&#xff0c;均可根据本人情况&#xff0c;报名参加相应专业类别、级别的考试。因此&#xff0c;计算机软件资格考试报名条件不设学历…

ITIL 问题管理综合指南

什么是ITIL问题管理 问题是多个事件的原因或潜在原因。影响许多用户的重大事件或重复发生的事件可能会出现问题。此外&#xff0c;可以在基础设施诊断系统中识别问题之前 用户会受到影响。 事件会阻碍业务生产力&#xff0c;提供快速解决方案有助于确保业务运营的无缝连续性。…

第四章SpringFramework之Ioc

文章目录IoC思想认识什么叫依赖/耦合控制反转和依赖注入的理解IoC&#xff1a;Inversion of Control&#xff0c;控制反转。DI&#xff1a;Dependency Injection&#xff0c;翻译过来是依赖注入。为什么需要这样齿轮的例子来突出Ioc的重要IOC容器在Spring中的实现Spring 提供了…

剑指 Offer 36. 二叉搜索树与双向链表

剑指 Offer 36. 二叉搜索树与双向链表 难度中等619 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为例&#xff1a…

【翻车现场】初读《编程之美》就想秀一下,结果还翻车了

文章目录 一、前言 二、我的思路 三、Code 四、翻车现场 五、后续问题 一、前言 ———如何写一个短小的程序&#xff0c;让 Windows 的任务管理器显示CPU的占用率为50%? 这道有趣的面试题我是这两天从《编程之美》电子版中看到的&#xff0c;看意思就是邹老师在微软对一…

LabVIEW写入可快速加载的TDMS文件

LabVIEW写入可快速加载的TDMS文件TDMS文件格式的设计目的是在尽可能快地读写数据的同时仍保持足够的灵活性来适应采集过程中通道数量和采样率的变化。 但是数据读写速度快的文件未必可快速加载。 TDMS文件是一个完全的二进制文件&#xff0c;由多个部分数据段组成&#xff0c;在…

多线程~实现一个自己的线程池,以及基于单例模式的线程池

目录 1.线程池的概念 2.线程池的实现 3.基于单例模式的线程池 &#xff08;1&#xff09;.单例模式的概念 &#xff08;2&#xff09;.基于单例模式的线程池 1.线程池的概念 池化技术本质上都是为了提高效率。线程池也是同理&#xff0c;提前准备好一些线程&#xff0c;用…

Lesson 1. 线性回归模型的一般实现形式

文章目录一、线性回归模型建模准备1. 数据准备2. 模型准备二、线性回归模型训练1. 模型训练的本质&#xff1a;有方向的参数调整1.1 模型训练与模型参数调整1.2 模型评估指标与损失函数1.3 损失函数与参数求解2. 利用最优化方法求解损失函数2.1 损失函数的求解2.2 图形展示损失…

【DevOps实战|基于Jenkins与Gitlab构建企业级持续集成环境系统】(更新中未完成)

目录 一、DevOps简介 二、CI/CD简介 1、代码部署的最基本流程 2、软件开发生命周期 3、持续集成整体流程 三、Git简介 1、GitHub与Gitlab区别 四、基于Jenkins与Gitlab构建持续集成环境系统 1、环境说明 2、安装gitlab 1&#xff09;配置邮件报警 一、DevOps简介 De…

目标检测的新范式:Towards Open World Object Detection

论文题目&#xff1a;Towards Open World Object Detection 1 摘要 人类有一种识别其环境中未知物体实例的自然本能(natural instinct)。当这些未知的实例最终获得相应的知识时&#xff0c;对它们的内在好奇心有助于了解它们。这促使我们提出一种新的计算机视觉问题称为&…

Week 11

洛谷P1796 汤姆斯的天堂梦 题目描述 汤姆斯生活在一个等级为 000 的星球上。那里的环境极其恶劣&#xff0c;每天 121212 小时的工作和成堆的垃圾让人忍无可忍。他向往着等级为 NNN 的星球上天堂般的生活。 有一些航班将人从低等级的星球送上高一级的星球&#xff0c;有时需…

算法第十四期——动态规划(DP)初入门

目录 DP初步:状态转移与递推 最少硬币问题 DP基础 DP的两个特征 DP:记忆化 图解DP求解过程 最经典的DP问题&#xff1a;0/1背包 模板题&#xff1a;小明的背包 DP状态设计 DP状态转移方程&#xff08;重点&#xff09; 代码 空间优化:滚动数组 (1&#xff09;交替滚…