精华内容
参与话题
问答
  • 本博文讲讲容器的监控系统怎么搭建与使用,上手前先了解三个容器镜像,我主要以这三个构建监控平台系统。 目录什么是InfluxDB、cAdvisor、Grafana?使用docker安装构建监控系统平台三级目录 什么是InfluxDB、...

    大家好,我是SuieKa。一个在学计算机网络方面的小白,也是在校大二学生,学以致用,实操记载,博文若有毛病,请一定留言哟

    本博文讲讲容器的监控系统怎么搭建与使用,上手前先了解三个容器镜像,我主要以这三个构建监控平台系统。


    在这里插入图片描述

    一、什么是InfluxDB?

    1、InfluxDB
    官网:https://www.influxdata.com/
    在这里插入图片描述
    InfluxDB是一个分布式的时间序列数据库,它由Go写成,用来存储cAdvisor收集的系统资源数据(IOE)
    InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。

    对常见关系型数据库(MySQL)的基础概念对比

    概念 MySQL InfluxDB
    数据库(同) database database
    表(不同) table measurement
    列(不同) column tag(带索引的,非必须)、field(不带索引)、timestemp(唯一主键)

    tag set:不同的每组tag key和tag value的集合;
    field set:每组field key和field value的集合;
    retention policy:数据存储策略(默认策略为autogen)InfluxDB没有删除数据操作,规定数据的保留时间达到清除数据的目的;
    series:共同retention policy,measurement和tag set的集合。

    二、什么是cAdvisor?

    2、cAdvisor
    官网:https://axibase.com/
    在这里插入图片描述
    cAdvisor(Container Advisor)为容器用户提供了对其运行容器的资源使用和性能特征的理解。 它是一个运行守护程序,用于收集,聚合,处理和导出有关正在运行的容器的信息。 具体而言,对于每个容器,它保留资源隔离参数,历史资源使用和完整历史资源使用的直方图。 此数据按容器和机器范围导出。
    cAdvisor是Google开源的工具,用于监控Docker主机和容器系统资源,通过图形页面实时显示数据,但不存储;它通过宿主机/proc、/sys、/var/lib/docker等目录下文件获取宿主机和容器运行信息。
    cadvisor不仅可以搜集一台机器上所有运行的容器信息,还提供基础查询界面和http接口,方便其他组件如Prometheus进行数据抓取,或者cadvisor + influxdb + grafna搭配使用。
    cAdvisor可以对节点机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况
    Cadvisor使用Go语言开发,利用Linux的cgroups获取容器的资源使用信息,在K8S中集成在Kubelet里作为默认启动项,官方标配。

    三、什么是Grafana?

    3、Grafana
    官网:https://grafana.com/
    在这里插入图片描述
    同样,Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。目前使用grafana的公司有很多,如paypal、ebay、intel等。
    Grafana支持许多不同的数据源。每个数据源都有一个特定的查询编辑器,该编辑器定制的特性和功能是公开的特定数据来源。 官方支持以下数据源:Graphite,Elasticsearch,InfluxDB,Prometheus,Cloudwatch,MySQL和OpenTSDB等。
    每个数据源的查询语言和能力都是不同的。你可以把来自多个数据源的数据组合到一个仪表板,但每一个面板被绑定到一个特定的数据源,它就属于一个特定的组织。

    在这里插入图片描述
    Grafana的7大特点:

    1、可视化:快速和灵活的客户端图形具有多种选项。面板插件为许多不同的方式可视化指标和日志。
    2、报警:可视化地为最重要的指标定义警报规则。Grafana将持续评估它们,并发送通知。
    3、通知:警报更改状态时,它会发出通知。接收电子邮件通知。
    4、动态仪表盘:使用模板变量创建动态和可重用的仪表板,这些模板变量作为下拉菜单出现在仪表板顶部。
    5、混合数据源:在同一个图中混合不同的数据源!可以根据每个查询指定数据源。这甚至适用于自定义数据源。
    6、注释:注释来自不同数据源图表。将鼠标悬停在事件上可以显示完整的事件元数据和标记。
    7、过滤器:过滤器允许您动态创建新的键/值过滤器,这些过滤器将自动应用于使用该数据源的所有查询。

    它们之间关系:
    cAdvisor容器数据采集->InfluxDB容器数据存储->Grafana可视化展示

    好了。我们就来构建这样的监控平台

    四、使用docker安装构建监控系统及使用

    1、操作系统版本和docker版本

    [21:21:40 root@wang-tuxing ~]#cat /etc/redhat-release 
    CentOS Linux release 8.1.1911 (Core) 
    [21:21:54 root@wang-tuxing ~]#docker -v
    Docker version 19.03.8, build afacb8b
    

    2、搭建influxdb (使用docker一条命令解决战斗)
    使用docker直接拉取安装镜像
    先检查两个端口是否被占用,因为需要使用,也可指其他端口

    [08:35:42 root@wang-tuxing ~]#netstat -nltup | grep 8083
    [08:35:55 root@wang-tuxing ~]#netstat -nltup | grep 8086
    [08:45:55 root@wang-tuxing ~]#netstat -nltup | grep 8081
    
    [21:36:33 root@wang-tuxing ~]#docker run -d -p 8083:8083 -p 8086:8086 --name influxdb tutum/influxdb
    Unable to find image 'tutum/influxdb:latest' locally
    latest: Pulling from tutum/influxdb
    a3ed95caeb02: Pull complete 
    23efb549476f: Pull complete 
    aa2f8df21433: Pull complete 
    ef072d3c9b41: Pull complete 
    c9f371853f28: Pull complete 
    a248b0871c3c: Pull complete 
    749db6d368d0: Pull complete 
    db2492acfcc3: Pull complete 
    b7e7d2e12d53: Pull complete 
    4272a53eef10: Pull complete 
    9b2fefdb5321: Pull complete 
    Digest: sha256:5b7c5e318303ad059f3d1a73d084c12cb39ae4f35f7391b79b0ff2c0ba45304b
    Status: Downloaded newer image for tutum/influxdb:latest
    d4652e3f491d10eef3636c7e8bb8f06b6448b0be090d6531d3158be6c0e4587e
    

    查看进程是否跑起来

    [22:00:15 root@wang-tuxing ~]#docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                            NAMES
    d4652e3f491d        tutum/influxdb      "/run.sh"           14 seconds ago      Up 13 seconds       0.0.0.0:8083->8083/tcp, 0.0.0.0:8086->8086/tcp   influxdb
    

    客户端访问influxDB:http://192.168.1.102:8083/
    若不能正常访问请关闭防火墙,或者放行8083端口
    在这里插入图片描述
    可以创建一个名叫cadvisor的数据库
    在这里插入图片描述
    在这里插入图片描述
    直接回车就创建了

    可以创建一个名叫cadvisor的用户及密码
    .在这里插入图片描述
    写好后直接回车就创建好了

    Show Databases				显示数据库
    Create Database				创建数据库
    Drop Database				删除数据库
    Show Measurements			显示测量
    Show Tag Keys				显示标签键
    Show Tag Values				显示标签值
    Show Retention Policies		显示保留政策
    Create Retention Policy		创建保留政策
    Drop Retention Policy		删除保留政策
    Show Continuous Queries		显示连续查询
    Create Continuous Query		创建连续查询
    Drop Continuous Query		删除连续查询
    Show Users					显示用户
    Create User					创建用户
    Create Admin User			创建管理员用户
    Drop User					删除用户
    Show Stats					显示统计
    Show Diagnostics			显示诊断
    

    3、搭建cadvisor

    [08:38:08 root@wang-tuxing ~]#docker run -d \
    --volume=/var/lib/docker/:/var/lib/docker:ro \
    --link influxdb:influxdb \
    -p 8081:8080 \
    --volume=/:/rootfs:ro \
     --volume=/var/run:/var/run:rw \
    --volume=/sys:/sys:ro \
     --volume=/var/lib/docker/:/var/lib/docker:ro \
     --link influxdb:influxdb \
     -p 8081:8080 \
     --name=cadvisor \
     google/cadvisor:latest \
     -storage_driver=influxdb \
     -storage_driver_db=cadvisor \
     -storage_driver_host=influxdb:8086
    Unable to find image 'google/cadvisor:latest' locally
    latest: Pulling from google/cadvisor
    ff3a5c916c92: Pull complete
    44a45bb65cdf: Pull complete
    0bbe1a2fe2a6: Pull complete
    Digest: sha256:815386ebbe9a3490f38785ab11bda34ec8dacf4634af77b8912832d4f85dca04
    Status: Downloaded newer image for google/cadvisor:latest
    c6b52ac4b39a4d547278d3949e5ace77d55d2415fce70ad9f3bbd8a4fcd47b6f
    
    
    [08:49:03 root@wang-tuxing ~]#docker ps
    CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                            NAMES
    c6b52ac4b39a        google/cadvisor:latest   "/usr/bin/cadvisor -…"   9 minutes ago       Up 9 minutes        0.0.0.0:8081->8080/tcp                           cadvisor
    

    –link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,并且接收容器可以获取源容器的一些数据,如源容器的环境变量。
    –volume 数据持久化 数据卷 或挂载

    直接客户端访问:http://192.168.1.102:8081/
    在这里插入图片描述
    总使用量
    在这里插入图片描述
    每个核心的使用量
    在这里插入图片描述
    使用分类
    在这里插入图片描述
    不多说,可以看到当打开时,以下有的是动态图,很清晰
    这里还可以监控网卡
    在这里插入图片描述
    查看宿主机的容器(点击Docker Containers
    在这里插入图片描述
    这是刚刚pull的镜像
    查询单个容器就直接点击容器查询
    在这里插入图片描述
    下面就会有监控内容

    3、安装grafana

    [09:06:49 root@wang-tuxing ~]#docker run -d \
     -p 3000:3000 \
     -e INFLUXDB_HOST=influxdb \
     -e INFLUXDB_PORT=8086 \
     -e INFLUXDB_NAME=cadvisor \
     -e INFLUXDB_USER=cadvisor \			####INFLUXDB创建的用户
     -e INFLUXDB_PASS=password \			####INFLUXDB创建用户的密码
     --link influxdb:influxsrv \
     --name grafana \
     grafana/grafana
    a36d42eaecd1c7a2ae9b120a751200f6b7813448b028ef278e04ea8e66f265e2
    
    [09:07:24 root@wang-tuxing ~]#docker ps
    CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                            NAMES
    a36d42eaecd1        grafana/grafana          "/run.sh"                20 seconds ago      Up 18 seconds       0.0.0.0:3000->3000/tcp                           grafana
    

    -e的作用是指定容器内的环境变量
    客户端访问:http://192.168.1.102:3000/
    初始用户admin,密码admin
    在这里插入图片描述
    会有提醒修改密码
    在这里插入图片描述
    添加数据源
    在这里插入图片描述
    像前面提到过,数据源支持有很多,我在这里使用InfluxDB
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    最后点击保存和测试
    在这里插入图片描述
    添加图表
    在这里插入图片描述
    选择 visualization 直观的、形象显示
    在这里插入图片描述
    里面有很多图表选择,比如选择第一个
    在这里插入图片描述
    设置 title为容器内存
    在这里插入图片描述
    influxDB数据库中查询到的内容 cpu 内存 流量
    在这里插入图片描述
    选择 default----memory_usage
    在这里插入图片描述
    监控出图
    可以根据筛选容器,来监控具体的项目

    新增查询内容
    在这里插入图片描述
    在这里插入图片描述
    出图:
    在这里插入图片描述
    监控另存保存
    在这里插入图片描述
    在这里插入图片描述
    可以收集主机上的数据

    这里可以摸索的设置项还有很多,比如一些坐标自定义、显示策略自定义,甚至我们还可以自定义报警策略等等

    展开全文
  • 文章目录一、前言 一、前言   在上一篇文章中已经介绍了docker常用软件安装, 下面正式进入到本地镜像推送到阿里云 和 下载镜像到本地的讲解。 ...


    一、前言

      在上一篇文章中已经介绍了Docker私有仓库的搭建与配置, 下面正式进入到IDEA集成Docker构建容器镜像,部署项目的讲解。



    二、开启docker的tcp远程访问

    由于使用IDEA来构建容器镜像,部署项目对于 Linux服务器上的docker宿主机来说是一种远程操作,而远程操作docker默认是关闭的,就需要我们开启远程访问

    //1、编辑docker.service
    vim /usr/lib/systemd/system/docker.service
    
    //2、修改ExecStart属性,把-H fd:// 替换成 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
    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 --containerd=/run/containerd/containerd.sock
    
    //3、刷新配置,重启服务
    systemctl daemon-reload
    systemctl restart docker
    


    打开浏览器,在地址栏中输入http://Linux的ip地址:2375/version,出现如下图片中的相关信息,则表示成功开启docker的tcp远程访问




    三、通过docker的maven插件构建镜像

    方式一:不使用Dockerfile来构建镜像

    1、在pom.xml中添加如下配置,更多相关配置信息请查看:配置详解

    <build>
        <!-- 打包后的文件名称 -->
        <finalName>app</finalName>
    
        <plugins>
            <!-- Maven 插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!-- 项目基于maven pom多模块的开发的,需要设置goal-repackage属性为true,否则打包后依赖文件没有一起打包,导致镜像内没有可以运行的程序文件 -->
                <executions>
                   <execution>
                       <goals>
                           <goal>repackage</goal>
                       </goals>
                   </execution>
                </executions>
                <configuration>
                  <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>
    
            <!--使用docker-maven-plugin插件,官网:https://github.com/spotify/docker‐maven‐plugin-->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</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>
                    <!--指定生成的镜像名-->
                    <imageName>${project.artifactId}</imageName>
                    <!--指定标签,可添加多个imageTag,为同一个镜像指定多个标签-->
                    <imageTags>
                        <imageTag>latest</imageTag>
                    </imageTags>
    
                    <!-- 用于指定基础镜像,类似于Dockerfile中的FROM指令 -->
                    <baseImage>java:8u111</baseImage>
    
                    <!--
                       类似于Dockerfile的ENTRYPOINT指令,
                       由于tomcat的session id的生成主要通过java.security.SecureRandom生成随机数来实现,导致启动过程很慢
                       通过-Djava.security.egd=file:/dev/./urandom参数可以加快随机数产生过程
                    -->
                    <entryPoint>["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
    
                    <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <!--指定需要复制项目jar包的所在路径,${project.build.directory}表示target目录 -->
                            <directory>${project.build.directory}</directory>
                            <!-- 用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar包文件 -->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
    
                    <!--指定远程 docker api地址-->
                    <dockerHost>http://192.168.198.124:2375</dockerHost>
                    <!-- 如需重复构建相同标签名称的镜像,可将forceTags设为true,这样就会覆盖构建相同标签的镜像。 -->
                    <forceTags>true</forceTags>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    以上配置会自动生成如下的Dockerfile文件

    # Base images 基础镜像
    FROM java:8u111
    
    #ADD  app.jar文件将拷贝到容器根目录下,拷贝过去会自动解压
    ADD app.jar /
    
    #ENTRYPOINT 应用启动命令 参数设定
    #由于tomcat的session id的生成主要通过java.security.SecureRandom生成随机数来实现,导致启动过程很慢
    #通过-Djava.security.egd=file:/dev/./urandom参数可以加快随机数产生过程
    ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
    

    2、在windows的命令提示符下 或者IDEA集成的Terminal窗口,进入到工程所在的目录,输入以下命令,进行打包、构建和上传镜像

    /**
     * mvn clean package:表示打包项目
     * docker:build:表示构建docker镜像
     **/
    mvn clean package docker:build
    
    
    /**
     * 如果在pom.xml中添加了如下配置,则在执行mvn package,就会自动执行mvn docker:build
     * 即可以省略docker:build,命令为 mvn clean package
     **/
    <executions>
        <execution>
    	<id>build-image</id>
    	<phase>package</phase>
    	<goals>
    	    <goal>build</goal>
    	</goals>
        </execution>
    </executions>
    
    
    /**
     * 如果需要把镜像上传到私有仓库或者阿里云仓库中,则需要进行以下两步操作
     **/
    
    //1、修改<imageName>标签,上传到私有仓库,则配置如下
    <imageName>Linux的ip地址:5000/${project.artifactId}</imageName>
    
    //上传到阿里云仓库,则配置如下
    <imageName>registry.cn-地域名称.aliyuncs.com/你的命名空间名称/${project.artifactId}</imageName>
    
    //2、在命令行后面添加 -DpushImage:表示推送镜像到仓库中
    mvn clean package docker:build -DpushImage
    或者
    mvn clean package -DpushImage (需要在pom.xml中配置<executions>的相关信息)
    




    3、运行镜像,产生容器实例。注意: 第二个7001端口 (即:容器端口),是你项目的application.yml / application.properties 配置文件中server.port指定的端口


    4、访问项目


    方式二:通过Dockerfile实现细腻化的镜像构建

    由于在很多场景下,我们希望使用Dockerfile进行更精确、有可读性地构建容器镜像,接下来就让我们来了解一下,如何通过Dockerfile进行镜像的构建

    1、首先,在项目的 src/main 路径下,创建一个docker目录,并在docker目录下新建一个Dockerfile文件,其内容如下所示:

    # Base images 基础镜像
    FROM java:8u111
    
    #MAINTAINER 维护者信息
    MAINTAINER wubin<1035644768@qq.com>
    
    #VOLUME:挂载目录
    VOLUME /temp
    
    #ADD  将app.jar文件将拷贝到容器中,默认拷贝到根路径下
    #也可以直接写成ADD app.jar /app.jar 或者 ADD app.jar /
    ADD app.jar app.jar
    
    RUN bash -c "touch /app.jar"
    
    #EXPOSE 容器暴露端口
    EXPOSE 7001
    
    #ENTRYPOINT 应用启动命令 参数设定
    #由于tomcat的session id的生成主要通过java.security.SecureRandom生成随机数来实现,导致启动过程很慢
    #通过-Djava.security.egd=file:/dev/./urandom参数可以加快随机数产生过程
    ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
    

    2、修改pom.xml,不再指定<baseImage><entrypoint>标签,而是使用<dockerDirectory>指定Dockerfile所在的路径

    <build>
      <!-- 打包后的文件名称 -->
      <finalName>app</finalName>
    
      <plugins>
          <!-- Maven 插件 -->
          <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
              <!-- 项目基于maven pom多模块的开发的,需要设置goal-repackage属性为true,否则打包后文件依赖文件没有一起打包,然后镜像内没有可以运行的程序文件,显示错误no main manifest attribute, in /app.jar -->
              <executions>
                  <execution>
                      <goals>
                          <goal>repackage</goal>
                      </goals>
                  </execution>
              </executions>
              <configuration>
                  <includeSystemScope>true</includeSystemScope>
              </configuration>
          </plugin>
    
          <!--使用docker-maven-plugin插件,官网:https://github.com/spotify/docker‐maven‐plugin-->
          <plugin>
              <groupId>com.spotify</groupId>
              <artifactId>docker-maven-plugin</artifactId>
              <version>1.0.0</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>
                  <!--指定生成的镜像名-->
                  <imageName>${project.artifactId}</imageName>
                  <!--指定标签,可添加多个imageTag,为同一个镜像指定多个标签-->
                  <imageTags>
                      <imageTag>latest</imageTag>
                  </imageTags>
    
                  <!-- 指定 Dockerfile 路径-->
                  <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
    
                  <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
                  <resources>
                      <resource>
                          <targetPath>/</targetPath>
                          <!--指定需要复制项目jar包的所在路径,${project.build.directory}表示target目录 -->
                          <directory>${project.build.directory}</directory>
                          <!-- 用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar包文件 -->
                          <include>${project.build.finalName}.jar</include>
                      </resource>
                  </resources>
    
                  <!--指定远程 docker api地址-->
                  <dockerHost>http://192.168.198.124:2375</dockerHost>
                  <!-- 如需重复构建相同标签名称的镜像,可将forceTags设为true,这样就会覆盖构建相同标签的镜像。 -->
                  <forceTags>true</forceTags>
              </configuration>
          </plugin>
      </plugins>
    </build>
    

    3、执行相关命令,与方式一:不使用Dockerfile来构建镜像的步骤2一样,这里不再重复



    四、通过IDEA的Docker插件构建镜像

    1、安装Docker插件

    1.1、在顶部工具栏中找到File → Settings


    1.2、找到Plugins,点击 “Browse repositories”按钮
    在这里插入图片描述

    1.3、在搜索框输入Docker,选择Docker插件,点击 “Install”按钮进行安装,然后点击 “Close”按钮


    3.2、可以看到Docker插件已经被我们安装上了,然后点击"Apply"按钮,再点击"OK"按钮,最后重启IDEA即可生效
    在这里插入图片描述

    2、配置Docker服务

    2.1、在顶部工具栏中找到File → Settings,进入到Settings设置页面中,找到Build,Execution,Deployment → Docker,点击"+",添加一个docker连接


    2.2、在Engine API URL中输入你的docker服务地址,格式为:tcp://Linux(即: docker宿主机) 的ip地址:2375,配置好后,idea会自动检测,然后在左下方输出"connection successful",然后点击"Apply"按钮,再点击"OK"按钮


    2.3、选择IDEA的Docker窗口,点击"绿色运行按钮",连接Linux服务器上的docker,连接成功之后,会显示Containers和Images,即:docker中已有的容器和镜像



    3、通过Docker插件构建镜像

    1、首先,在项目的 src/main 路径下,创建一个docker目录,并在docker目录下新建一个Dockerfile文件,其内容如下所示:

    # Base images 基础镜像
    FROM java:8u111
    
    #MAINTAINER 维护者信息
    MAINTAINER wubin<1035644768@qq.com>
    
    #VOLUME:挂载目录
    VOLUME /temp
    
    #ADD  将microservicecloud-eureka-7001-1.0-SNAPSHOT.jar文件将拷贝到容器中,默认拷贝到根路径下
    #注意:microservicecloud-eureka-7001-1.0-SNAPSHOT.jar的名称前的microservicecloud-eureka-7001对应<artifactId>标签中的内容,1.0-SNAPSHOT对应<version>标签中的内容
    ADD microservicecloud-eureka-7001-1.0-SNAPSHOT.jar app.jar
    
    RUN bash -c "touch /app.jar"
    
    #EXPOSE 容器暴露端口
    EXPOSE 7001
    
    #ENTRYPOINT 应用启动命令 参数设定
    #由于tomcat的session id的生成主要通过java.security.SecureRandom生成随机数来实现,导致启动过程很慢
    #通过-Djava.security.egd=file:/dev/./urandom参数可以加快随机数产生过程
    ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
    

    2、创建Dockerfile启动项

    2.1、选择Edit Configurations…


    2.2、点击"+",找到Docker,选择Dockerfile


    2.3、配置Dockerfile启动项的相关信息
    在这里插入图片描述

    注意: 容器端口,是你项目的application.yml / application.properties 配置文件中server.port指定的端口




    3、在pom.xml文件中添加SpringBoot的maven插件,如果不添加,运行容器时,会报错,错误信息为:no main manifest attribute, in /xxx.jar

    <build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
               <!-- 项目基于maven pom多模块的开发的,需要设置goal-repackage属性为true,否则打包后文件依赖文件没有一起打包,然后镜像内没有可以运行的程序文件 -->
               <executions>
                   <execution>
                       <goals>
                           <goal>repackage</goal>
                       </goals>
                   </execution>
               </executions>
               <configuration>
                   <includeSystemScope>true</includeSystemScope>
               </configuration>
           </plugin>
       </plugins>
    </build>
    

    4、执行mvn clean install命令,打包项目并安装到本地的maven仓库中


    5、在本地maven仓库中找到刚才安装好的microservicecloud-eureka-7001-1.0-SNAPSHOT.jar,拷贝到项目的 src/main/docker 目录下,并运行Docker启动项,Docker插件会自动帮我们构建项目镜像,并启动容器实例

    因为我们在Dockerfile文件中配置了ADD microservicecloud-eureka-7001-1.0-SNAPSHOT.jar app.jar,而Dockerfile文件是放在项目的 src/main/docker 目录下,所以它会在当前目录(即:docker目录)下寻找microservicecloud-eureka-7001-1.0-SNAPSHOT.jar


    6、访问项目


    改进:前面说了,我们需要把项目的jar包拷贝到docker目录下,然后再运行,有什么办法能够不拷贝项目的jar包到docker目录下,直接运行呢?解决方案如下:

    1、删除之前的docker目录,在项目的根目录下,新建一个Dockerfile文件,内容如下:

    注意:需要将之前的ADD microservicecloud-eureka-7001-1.0-SNAPSHOT.jar app.jar 修改为 ADD /target/microservicecloud-eureka-7001-1.0-SNAPSHOT.jar app.jar,让它去读取target目录下的项目jar包

    # Base images 基础镜像
    FROM java:8u111
    
    #MAINTAINER 维护者信息
    MAINTAINER wubin<1035644768@qq.com>
    
    #VOLUME:挂载目录
    VOLUME /temp
    
    #ADD  将microservicecloud-eureka-7001-1.0-SNAPSHOT.jar文件将拷贝到容器中,默认拷贝到根路径下
    ADD /target/microservicecloud-eureka-7001-1.0-SNAPSHOT.jar app.jar
    
    RUN bash -c "touch /app.jar"
    
    #EXPOSE 容器暴露端口
    EXPOSE 7001
    
    #ENTRYPOINT 应用启动命令 参数设定
    #由于tomcat的session id的生成主要通过java.security.SecureRandom生成随机数来实现,导致启动过程很慢
    #通过-Djava.security.egd=file:/dev/./urandom参数可以加快随机数产生过程
    ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
    



    2、修改Docker启动项,重新指定Dockerfile文件的所在路径


    3、删除之前运行的项目容器实例 和 项目镜像



    4、执行mvn clean package命令,把项目的jar包安装到当前项目的target目录下,最后运行Docker启动项




    小提示:我们也可以通过IDEA的Docker插件,进行如下操作:

    1、运行镜像,创建容器实例




    2、拉取镜像





    Docker入门到实践系列文章列表:

    Docker入门到实践 (一) docker简介与安装
    Docker入门到实践 (二) docker常用命令讲解
    Docker入门到实践 (三) Dockerfile解析与镜像制作
    Docker入门到实践 (四) docker容器数据卷与数据卷容器
    Docker入门到实践 (五) docker数据的备份、恢复与迁移
    Docker入门到实践 (六) docker常用软件安装
    Docker入门到实践 (七) 本地镜像推送到阿里云 和 下载镜像到本地
    Docker入门到实践 (八) Docker私有仓库的搭建与配置
    Docker入门到实践 (九) IDEA集成Docker构建容器镜像,部署项目




                       如果有遇到不懂或者有问题时,可以扫描下方二维码,欢迎进群交流与分享,希望能够跟大家交流学习!

    展开全文
  • 错误记录 全部简洁说明,按照我的错误解决,仅供有需要的人参考。 1.redis 错误1:Fatal error, can't open config file '/usr/local/etc/redis/redis.conf' 解决:我的是因为redis.conf没有读写权限。...

    错误记录

    全部简洁说明,按照我的错误解决,仅供有需要的人参考。

    1.redis

    错误1:Fatal error, can't open config file '/usr/local/etc/redis/redis.conf'

    解决:我的是因为redis.conf没有读写权限。先对本地redis.conf做权限改变然后再重构镜像。

    # 修改权限
    chmod 644 redis.conf
    # 写入dockerfile指令
    cat > Dockerfile
    FROM redis
    COPY redis.conf /usr/local/etc/redis/redis.conf
    CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
    # 构建docker镜像
    docker build -t test-redis .
    # 生成并启动docker容器
    docker run -itd --name redis-cont-name -p 6379:6379 test-redis:latest
    

    然后这样容器就可以运行成功了,可以通过docker ps去看到redis-cont-name这个容器在运行当中。

    错误2:Error: Connection reset by peer

    在上面创建了容器后,通过redis-cli去连接容器时却发生了这个错误。
    解决:我的是因为没有关闭保护模式以及绑定的ip不应该指定127.0.0.1,对于跨容器或者本地连接,应使用0.0.0.0,以下给出我的错误解决方式修改redis.conf两处:

    bind 0.0.0.0	# <- 这里原先是127.0.0.1
    protected-mode no	# <- 这里原先是yes
    

    然后删除旧的容器和镜像,重新构建,再启动,就好了。
    补充:这里还有一种方式,使用隧道加密(stunnel),我没使用。参考链接:
    stackoverflow
    其它网站


    2.Mysql

    错误1:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

    解决:通过错误可以看出是无法进行sock通信,我经常进入mysql是通过mysql -u root -p这种方式。在stackoverflow查找后,对我有效的解决方式是,加上-h 127.0.0.1这个参数,完整的如下:

    # 启动容器
    docker run -it -p 3306:3306 --rm -e MYSQL_ROOT_PASSWORD=xxxxxx -d mysql:5.7 
    # 访问数据库
    mysql -h 127.0.0.1 -u root -p
    

    参考链接

    3.其他

    错误:docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"-p\": executable file not found in $PATH": unknown.

    解决:这个错误的出现,对我来说是因为我把-p 80:80这个参数写在了容器名称的后面,所以写在容器前面就好了。。。

    docker run -itd --name nginx-test nginx:latest -p 80:80	# 错误写法
    docker run -itd -p 80:80 --name nginx-test nginx:latest	# 正确写法
    

    参考链接:github#561

    展开全文
  • 167 docker docker构建nginx容器系列问题

    千次阅读 2016-05-13 00:07:34
    docker构建nginx容器系列问题background : 最近为小伙伴们筹划docker系列的技术分享,研究了一会docker相关技术, 在此记录一下构建nginx容器时候的坑1.nginx服务器根目录问题 docker 官方镜像提供的nginx基于...

    docker构建nginx容器系列问题


    background : 最近为小伙伴们筹划docker系列的技术分享,研究了一会docker相关技术, 在此记录一下构建nginx容器时候的坑

    1.nginx服务器根目录问题

    docker 官方镜像提供的nginx基于debian/jessie平台,其文件结构和ubuntu中的nginx中并不相同

    eg:

    run一个niginx容器

    //80端口被占用,so...
    $ sudo docker run -it -p 800:800 nginx
    $ sudo docker ps 
    
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                   NAMES
    1801a32aab54        nginx               "nginx -g 'daemon off"   2 minutes ago       Up 2 minutes        80/tcp, 443/tcp, 0.0.0.0:800->800/tcp   berserk_kare

    进入容器内部

    $ sudo docker exec -it 1801a32aab54 /bin/bash
    root@1801a32aab54:/# 

    查看nginx目录

    # cd /etc/nginx/
    conf.d/         koi-utf         mime.types      nginx.conf      uwsgi_params    
    fastcgi_params  koi-win         modules/        scgi_params     win-utf  

    可以看到不仅没有熟悉的 /sites-available,也没有 /sites-enabled

    继续查看nginx配置

    # cat /conf.d/default.conf
    server {
        listen       80;
        server_name  localhost;
    
        #charset koi8-r;
        #access_log  /var/log/nginx/log/host.access.log  main;
    
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
    
        #error_page  404              /404.html;
    
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
        #...省略php-fpm配置,好长..
    }

    根目录配置: root /usr/share/nginx/html;

    测试

    # cd /usr/share/nginx/html
    # touch index.html
    # echo "test nginx in docker" >index.html

    在浏览器中输入localhost或者在terminal中

    curl localhost

    2.php-fpm配置相关:请求php文件报502

    首先发现php配置的目录结构和ubuntu还是不一样,dockerfile里面配置改为如下

    ADD php.ini    /usr/local/etc/php/php.ini
    ADD php-fpm.conf    /usr/local/etc/php-fpm.conf

    进入nginx容器

    $ docker ps 
    # docker exec -it xxx /bin/bash

    进入niginx的log

    # cd /var/www/log
    # tail -f error.log 

    显示为空,log路径找错了

    # cd /opt/log/nginx
    # tail -f error.log
    
    2016/05/13 03:19:59 [crit] 6#6: *28 connect() to unix:/run/php/php7.0-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 172.17.0.1, server: _, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "localhost"

    可见问题是 连接不到 /run/php/php7.0-fpm.sock ,nginx和php并不在同一个主机中,Domain socket通信当然无法实现


    3. 配置php和nginx容器连接 并共享挂载文件资源

    举个栗子 将hsot文件资源挂载到在nginx的container

    //将host中的workspace挂载到container的服务器根目录 此处的nginx配置被我修改过 所以image名字是mynginx
    # docker run -it -p 80:80 -v 
    /home/jason/workspace:/var/www/html mynginx

    在host的workspace目录中新增index.html 并访问

    $ cd ~/workspace && touch index.html
    $ echo "index in host">index.html
    
    //先关闭host的nginx服务再执行这一步
    $ curl localhost
    index in host 

    挂载成功

    //run 一个php-fpm容器 并挂载host内的目录
    # docker run -p 9000:9000 -v ~/opt:/var/www --name phpfpm -it fancive/php
    //run 一个nginx容器并与php容器连接
    # docker run --name nginx_server -d -p 80:80 --link phpfpm:phpfpm --volumes-from phpfpm  fancive/nginx

    测试一下

    $ curl localhost
    index in host

    成功了

    展开全文
  • Docker+容器容器

    2017-11-03 11:19:34
    本书从实践者的角度,在讲解Docker高级实践技巧的同时,深入到源代码层次...本书适用于有一定Docker基础的开发者、架构师、IT专业学生以及探索基于Docker构建云计算平台的技术人员,也非常适合作为高校教材或培训资料。
  • 1.构建镜像:docker build -t imageName:tag . 注意最后有个点 表示当前目录的Dockerfile文件 docker build -t flowable92:6.4.1 . 2.启动容器docker run -d --name flowable_web_92 -v /root/flowable_war/...
  • Docker 构建Mysql容器并对外提供服务

    千次阅读 2018-03-27 23:37:49
    构建容器 docker run --name some-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql –name 指定容器名称 -p 参数将容器内的3306端口与本地3306接口映射 -e 添加了一个环境变量MYSQL_ROO...

空空如也

1 2 3 4 5 ... 20
收藏数 6,880
精华内容 2,752
关键字:

docker构建容器