GVKun编程网logo

Idea整合Docker一键推送到服务器(idea一键部署docker容器)

14

在本文中,我们将带你了解Idea整合Docker一键推送到服务器在这篇文章中,我们将为您详细介绍Idea整合Docker一键推送到服务器的方方面面,并解答idea一键部署docker容器常见的疑惑,同

在本文中,我们将带你了解Idea整合Docker一键推送到服务器在这篇文章中,我们将为您详细介绍Idea整合Docker一键推送到服务器的方方面面,并解答idea一键部署docker容器常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock、docker 将本地镜像打tag并推送到dockerhub、Docker----创建镜像并推送到Docker hub上、Docker一键打包微服务

本文目录一览:

Idea整合Docker一键推送到服务器(idea一键部署docker容器)

Idea整合Docker一键推送到服务器(idea一键部署docker容器)

关于Docker开放端口的安全问题

强烈建议用CA证书, 不然没几天服务器就变矿机

安装Docker插件

一般新版本idea会自带该插件, 2019以上版本可以略过

连接Docker

建立DockerFile文件

在项目根目录下建立DockerFile文件

DockerFile

日志, 或一些文件路径需要挂载VOLUME

FROM java:8u111
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
# Ubuntu 时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
VOLUME /config
VOLUME /logs
# 这里对应maven打包出来的文件名称(怎么动态获取项目jar名称, 知道同学告诉我下-3-)
ADD target/work-bug-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8084
ENTRYPOINT ["java","-jar","app.jar"]
# 启动命令
# docker build -t work-bug
# docker run -p 8080:8080 --name work-bug
# -v /usr/server/log/workbug:/logs
# -v /usr/server/config:/config work-bug

配置DockerFile项目

Maven打包

运行下clean, package命令, 然后运行部署就完了(可以在idea运行这个Docker前集成maven命令, 但我太菜了)

多余image清理

多次推送同一个镜像, 会备份成<none>镜像.

可以执行docker image prune 清理一下

Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock

Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock

在 Docker 容器里面使用 docker run/docker build

Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择。而在 DevOps 中,我们需要将各种后端/前端的测试/构建环境打包成 Docker 镜像,然后在需要的时候,Jenkins 会使用这些镜像启动容器以执行 Jenkins 任务。

为了方便维护,我们的 CI 系统如 Jenkins,也会使用 Docker 方式部署。 Jenkins 任务中有些任务需要将微服务构建成 Docker 镜像,然后推送到 Harbor 私有仓库中。 或者我们所有的 Jenkins Master 镜像和 Jenkins Slave 镜像本身都不包含任何额外的构建环境,执行任务时都需要启动包含对应环境的镜像来执行任务。

我们的 Jenkins Master、Jenkins Slaves 都是跑在容器里面的,该如何在这些容器里面调用 docker run 命令启动包含 CI 环境的镜像呢? 在这些 CI 镜像里面,我们从源码编译完成后,又如何通过 docker build 将编译结果打包成 Docker 镜像,然后推送到内网仓库呢?

答案下面揭晓。

一、原理说明:/var/run/docker.sock

Docker 采取的是 Client/Server 架构,我们常用的 docker xxx 命令工具,只是 docker 的 client,我们通过该命令行执行命令时,实际上是在通过 client 与 docker engine 通信。

我们通过 apt/yum 安装 docker-ce 时,会自动生成一个 systemd 的 service,所以安装完成后,需要通过 sudo systemctl enable docker.service 来启用该服务。 这个 Docker 服务启动的,就是 docker engine,查看 /usr/lib/systemd/system/docker.service,能看到有这样一条语句:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

默认情况下,Docker守护进程会生成一个 socket(/var/run/docker.sock)文件来进行本地进程通信,因此只能在本地使用 docker 客户端或者使用 Docker API 进行操作。 sock 文件是 UNIX 域套接字,它可以通过文件系统(而非网络地址)进行寻址和访问。

因此只要以数据卷的形式将 docker 客户端和上述 socket 套接字挂载到容器内部,就能实现 "Docker in Docker",在容器内使用 docker 命令了。具体的命令见后面的「示例」部分。

要记住的是,真正执行我们的 docker 命令的是 docker engine,而这个 engine 跑在宿主机上。所以这并不是真正的 "Docker in Docker".

二、示例

在容器内部使用宿主机的 docker,方法有二:

  1. 命令行方式:将 /usr/bin/docker 映射进容器内部,然后直接在容器内部使用这个命令行工具 docker
    • 需要的时候,也可以将 /etc/docker 文件夹映射到容器内,这样容器内的 docker 命令行工具也会使用与宿主机同样的配置。
  2. 编程方式:在容器内部以编程的方式使用 docker
    • 通过 python 使用 docker: 在 Dockerfile 中通过 pip install docker 将 docker client 安装到镜像中来使用

容器的启动方式也有两种,如下:

1. 直接通过 docker 命令启动

示例命令如下:

docker run --name <name> \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/bin/docker:/usr/bin/docker \
    --user root \
    <image-name>:<tag>

**必须以 root 用户启动!(或者其他有权限读写 /var/run/docker.sock 的用户)**然后,在容器内就能正常使用 docker 命令,或者访问宿主机的 docker api 了。

2. 使用 docker-compose 启动

docker-compose.yml 文件内容如下:

version: ''3.3''
services:
  jenkins-master:
    image: jenkinsci/blueocean:latest
    container_name: jenkins-master
    environment:
      - TZ=Asia/Shanghai  # 时区
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - ./jenkins_home:/var/jenkins_home  # 将容器中的数据映射到宿主机
      - /usr/bin/docker:/usr/bin/docker  # 为容器内部提供 docker 命令行工具(这个随意)
      - /var/run/docker.sock:/var/run/docker.sock  # 容器内部通过 unix socket 使用宿主机 docker engine
    user: root  # 必须确保容器以 root 用户启动!(这样它才有权限读写 docker.socket)
    restart: always

然后通过 docker-compose up -d 即可后台启动容器。

Docker 中的 uid 与 gid

通过上面的操作,我们在容器内执行 docker ps 时,还是很可能会遇到一个问题:权限问题

如果你容器的默认用户是 root,那么你不会遇到这个问题,因为 /var/run/docker.sock 的 onwer 就是 root.

但是一般来说,为了限制用户的权限,容器的默认用户一般都是 uid 和 gid 都是 1000 的普通用户。这样我们就没有权限访问 /var/run/docker.sock 了。

解决办法:

方法一(不一定有效):在构建镜像时,最后一层添加如下内容:

# docker 用户组的 id,通常都是 999
RUN groupadd -g 999 docker \
    && usermod -aG docker <your_user_name>

这样我们的默认用户,就能使用 docker 命令了。

P.S. 999 不一定是 docker 用户组,所以上述方法某些情况下可能失效。这时还是老老实实通过 docker run -u root 启动容器吧。(或者在 docker-compose.yml 中添加 user: root 属性)

参考

  • Docker in Docker - 王柏元

docker 将本地镜像打tag并推送到dockerhub

docker 将本地镜像打tag并推送到dockerhub

给本地打镜像打tag

docker tag <local_image_name>:<tag> <your_docker_hub_username>/<repository_name>:<tag>

<local_image_name>:<tag>是你的本地镜像名称和标签,<your_docker_hub_username>是你的Docker Hub用户名,<repository_name>:<tag>是你要推送的镜像在Docker Hub上的仓库名称和标签。

docker push <your_docker_hub_username>/<repository_name>:<tag>

示例如下:


docker tag lanxing/php74-swoole:4.8.11 893687090/php74-swoole:4.8.11
docker tag lanxing/php82-swoole:5.1.1 893687090/php82-swoole:5.1.1

docker push 893687090/php74-swoole:4.8.11
docker push 893687090/php82-swoole:5.1.1

Docker----创建镜像并推送到Docker hub上

Docker----创建镜像并推送到Docker hub上

下载镜像

docker pull [模板镜像名称]:[版本]

启动镜像

docker run -tdi --privileged [容器id] init

–privileged 容器内的root拥有真正的root权限

init 设置可以使用系统命令

进入镜像,修改镜像内配置

docker exec -it [容器id] bash

将镜像提交本地

docker commit [容器id] [用户名]/[仓库名]:镜像名称

查看提交的镜像

docker images

在这里插入图片描述

将镜像提交Docker hub上

docker tag [容器id] [REPOSITORY]:[TAG]

在这里插入图片描述

显示这样就表示成功了

打开Docker hub查看提交镜像

在这里插入图片描述

Docker一键打包微服务

Docker一键打包微服务

image.png

微服务Docker打包

现在的微服务时代,你的代码没个微服务、分布式人家都会觉得低端,当然!对于我们开发人员来说,掌握这些技术意味着涨薪。

​ 我们项目中用到了多个微服务,我们上一节课程打包用的是手动上传,但是很麻烦,有没有更好的方式呢,是有的,我们可以直接通过idea将我们的微服务打包成Docker镜像,并推送到Docker仓库中

​ 这里我们采用jib-maven-plugin 来进行来构建容器化的spring boot应用程序,Jib可以让不写Dockerfile就能实现Docker打包

什么是Jib

Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库,以 Maven 和 Gradle 插件形式提供。

​ Jib带来的是,它允许您通过简单地将插件添加到您选择的构建工具(Maven或Gradle)来创建容器,没有额外的文件,只需几行配置,它处理将应用程序打包到容器映像的所有步骤。

​ Jib是来自Google的开源Java容器,它允许Java开发人员使用他们所知道的Java工具构建容器,它不需要您编写Dockerfile或安装了docker,它直接集成到Maven和Gradle中。

和传统的插件区别

Docker 构建流程
在“传统”Java到Docker映像构建流程中,我们需要安装Dockerfile和docker守护进程,在Jib构建流程中,您只需要插件项目的构建文件。

file

Jib构建流程

​ 通过 Jib,Java 开发者可以使用他们熟悉的 Java 工具来构建容器。Jib 是一个快速而简单的容器镜像构建工具,它负责处理将应用程序打包到容器镜像中所需的所有步骤。它不需要你编写 Dockerfile 或安装 Docker,而且可以直接集成到 Maven 和 Gradle中 —— 只需要将插件添加到构建中,就可以立即将 Java 应用程序容器化。

file

准备工作

设置Horbor用户权限
我们要将idea的微服务推送到Harbor,并且用itcast的用户,所有我们要设置我们的itcast用户是开发者
file

pom文件配置jib

对于应用程序的基本本地存储镜像,请在pom.xml以下内容中配置jib-maven-plugin
公共属性配置
在properties中配置harbor的共有配置
<properties>
    <!--harbor 仓库地址-->
    <docker.registry.url>itcastharbor.com</docker.registry.url>
    <!--harbor 的项目名称-->
    <docker.registry.name>library</docker.registry.name>
    <!--harbor账号-->
    <docker.registry.username>itcast</docker.registry.username>
    <!--harbor密码-->
    <docker.registry.password>Qwert123</docker.registry.password>
</properties>
编译配置插件配置
<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <plugins>

        <plugin>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>jib-maven-plugin</artifactId>
            <version>2.8.0</version>
            <configuration>
                <allowInsecureRegistries>true</allowInsecureRegistries>
                <!--from节点用来设置镜像的基础镜像,相当于Docerkfile中的FROM关键字-->
                <from>
                    <!--使用openjdk官方镜像,tag是:8-jdk-alpine,表示镜像的操作系统是alpine,装好了jdk8-->
                    <image>openjdk:8-jdk-alpine</image>
                </from>
                <to>
                    <!--镜像名称和tag,使用了mvn内置变量${project.version},表示当前工程的version-->
                    <image>${docker.registry.url}/${docker.registry.name}/${project.artifactId}:${project.version}
                    </image>
                    <tags>
                        <!--版本号-->
                        <tag>${project.version}</tag>
                    </tags>
                    <!--harbor的认证信息-->
                    <auth>
                        <username>${docker.registry.username}</username>
                        <password>${docker.registry.password}</password>
                    </auth>
                </to>
                <!--容器相关的属性-->
                <container>

                    <jvmFlags>
                        <!--一些启动参数-->
                        <jvmFlag>-Djava.security.edg=file:/dev/./urandom</jvmFlag>
                    </jvmFlags>
                    <!--挂载volume的配置-->
                    <volumes>
                        <volume>/tmp</volume>
                        <volume>/logs</volume>
                    </volumes>
                    <ports>
                        <!--暴漏端口号-->
                        <port>8080</port>
                    </ports>
                    <!--微服务的启动类-->
                    <mainClass>com.heima.test.Application</mainClass>
                    <format>OCI</format>
                    <!--使用该参数将镜像的创建时间与系统时间对其-->
                    <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
                </container>
            </configuration>
            <executions>
                <!--执行打包配置-->
                <execution>
                    <id>jib-maven-plugin</id>
                    <phase>package</phase>
                    <goals>
                        <goal>build</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!-- Docker maven plugin -->
    </plugins>
</build>

执行构建

然后在项目根目录执行mvn clean compile jib:build就可以了

file

我们看到已经推送成功了

harbor仓库中查看

通过域名访问harbor,我们看我们的library里面的镜像仓库

file

点进去就可以看到我们刚刚推送的镜像

file

以及镜像的详细信息

file

其他的微服务上传

微服务打包
这里我们也将其他微服务上传到仓库,步骤同上

file

仓库中查看镜像
在我们的仓库中查看镜像,我们看到镜像都已经上传到仓库中了

file

harbor 测试

删除本地镜像
可以通过docker rmi 镜像ID删除本地镜像
docker rm -f learn-docker-storage
docker rmi  192.168.64.153/library/learn-docker-storage:0.0.3

file

运行harbor 中的镜像
我们把我们的所有微服务都上传到了仓库中,我们以一个完整的项目运行docker

file

运行learn-docker-storage服务
执行运行命令
docker run -d \
-v /tmp/data/logs:/logs \
--name learn-docker-storage \
--network=learn-docker-network \
manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-storage:1.0-SNAPSHOT
因为我们是基于内部网络访问 不需要暴漏接口了

file

访问微服务测试
curl http://192.168.64.152:8080/userinfo/10001 | python -m json.tool

file

运行learn-docker-web服务
执行运行命令
docker run -d \
--name learn-docker-web \
--network=learn-docker-network \
manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-web:1.0-SNAPSHOT
该微服务也是内部服务不需要暴漏端口,并且没有配置日志输出所有不挂载日志路径

file

运行learn-docker-gateway服务
执行运行命令
docker run -d \
-p 8888:8888 \
--name learn-docker-gateway \
--network=learn-docker-network \
manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-gateway:1.0-SNAPSHOT
因为网关对外需要暴漏端口,所有需要开放8888端口

file

查看nacos注册的微服务
我们发现我们的三个服务都已经注册进去了

image-20210331170049208

访问测试微服务
因为我们存储服务的8003端口没有暴漏出来,无法访问,我们需要通过网关进行访问
curl http://192.168.64.153:8888/employeapi/find/10001| python -m json.tool

file

本文由传智教育博学谷教研团队发布。

如果本文对您有帮助,欢迎关注点赞;如果您有任何建议也可留言评论私信,您的支持是我坚持创作的动力。

转载请注明出处!

今天的关于Idea整合Docker一键推送到服务器idea一键部署docker容器的分享已经结束,谢谢您的关注,如果想了解更多关于Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock、docker 将本地镜像打tag并推送到dockerhub、Docker----创建镜像并推送到Docker hub上、Docker一键打包微服务的相关知识,请在本站进行查询。

本文标签: