打包docker镜像

前提条件

1、docker服务器已开启远程访问,参考《远程docker服务器携带证书连接》。

2、服务器上已经搭建好k8s集群,本文是k8s单点集群用于测试。

在之前的文章中我们已经通过idea的docker插件测试了远程docker服务器已经能够正常访问,虽然利用这个docker插件也可以完成docker镜像的打包及推送,但本文我们将换一种方式,使用maven的docker-maven-plugin插件完成docker镜像的打包,以及推送到远程docker服务器。

Dockerfile文件

  1. 指定jdk环境版本,基于java8创建镜像
    1. FROM java:8
  2. 挂载临时目录
    1. VOLUME /tmp
  3. 添加指定jar包到容器(此处为项目打包所产生的jar包全名)
    1. ADD    ./product/target/*.jar  ./app.jar
       
  4. 容器向外暴露的端口号(项目运行占用的端口)
    1. EXPOSE 8080
  5. 容器启动后执行的命令
    1. ENTRYPOINT [ "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "./app.jar" ]

pom.xml配置

pom文件的相关配置如下,注意填入远程服务器的ip,并指明上述Dockerfile路径以及访问远程docker需要的pem证书文件的路径。

<build>

    <plugins>

        <plugin>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-maven-plugin</artifactId>

        </plugin>

        <!--使用docker-maven-plugin插件,用于将该服务打包成镜像发往docker服务端-->

        <plugin>

            <groupId>com.spotify</groupId>

            <artifactId>docker-maven-plugin</artifactId>

            <version>1.2.2</version>

            <!--将插件绑定在某个phase执行 -->

            <executions>

                <execution>

                    <id>build-image</id>

                    <!--将插件绑定在package这个phase上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build -->

                    <phase>package</phase>

                    <goals>

                        <goal>build</goal>

                    </goals>

                </execution>

            </executions>

            <configuration>

                <forceTags>true</forceTags>

                <!--指定生成的镜像名 该处修改为自己想要生成的镜像名称-->

                <imageName>practice-job</imageName>

                <!--指定标签-->

                <imageTags>

                    <imageTag>latest</imageTag>

                </imageTags>

                <!-- 指定Dockerfile 路径 -->

                <dockerDirectory>${project.basedir}</dockerDirectory>

                <!--指定远程docker地址 -->

                <dockerHost>https://公网ip:2376</dockerHost>

                <!--指定pem证书文件路径地址 -->

                <dockerCertPath>${project.basedir}/src/main/resources/pem</dockerCertPath>

                <!-- 这里是复制jar包到docker容器指定目录配置 -->

                <resources>

                    <resource>

                        <targetPath>/</targetPath>

                        <!--jar 包所在的路径此处配置的即对应 target 目录 -->

                        <directory>${project.build.directory}</directory>

                        <!-- 需要包含的jar包,这里对应的是Dockerfile中添加的文件名 -->

                        <include>${project.build.finalName}.jar</include>

                    </resource>

                </resources>

            </configuration>

        </plugin>

    </plugins>

</build>

推送远程服务器

上述准备就绪以后执行install命令,等待一段时间后下方控制台出现BUILD SUCCESS则说明镜像推送成功。

接着去远程服务器验证一下,输入docker images命令查看容器镜像。

部署到k8s

如果在以前我们的部署环境只有docker容器,那么这里只需要docker run我们的应用镜像,将项目部署在docker容器就可以访问了。但现在我们的部署环境是k8s+docker,所以不能直接运行我们的应用镜像进行部署,下面进入k8s的部署。

        首先需要创建两个yaml文件:practice-job-deployment.yaml、practice-job-service.yaml,

vi practice-job-deployment.yaml

apiVersion: v1

kind: Namespace

metadata:

  name: practice

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: practice-job-deployment

  namespace: practice

spec:

  replicas: 1

  selector:

    matchLabels:

      app: practice-job-pod

  template:

    metadata:

      labels:

        app: practice-job-pod

    spec:

      hostNetwork: true

      containers:

        - name: practice-job-container

          image: practice-job:latest  #镜像名称+版本

          imagePullPolicy: Never   #表示镜像来源,IfNotPresent本地没有就从hub仓库拉取,Never表示只从本地

          ports:

            - containerPort: 8081

          env:

            # 指定日志文件路径

            - name: logging.path

              value: /var/logs

vi practice-job-service.yaml

apiVersion: v1

kind: Service

metadata:

  name: practice-job-service

  namespace: practice

  labels:

    app: practice-job-service

spec:

  type: NodePort

  selector:

    app: practice-job-pod

  ports:

    - name: http

      protocol: TCP

      port: 8081 #service(对内)的端口

      targetPort: 8081 #pod的端口

      nodePort: 18081 #service(对外)的端口

然后分别执行命令

kubectl apply -f practice-job-deployment.yaml

kubectl apply -f practice-job-service.yaml

执行命令:kubectl get pod --all-namespaces 查看pod,查看我们项目的pod是否已经成功运行。

执行命令:格式为:kubectl logs <pod的name> -n <pod的namespace>。 查看应用运行日志。

执行命令:docker ps 查看项目是否已运行在容器中

执行命令:kubectl get service --all-namespaces 查看应用对应的服务是否已启动成功

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐