热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[Java]Docker学习总结

docker制作打包镜像说明:本文档基于CentSo7系统,ubuntu系统只是部分命令不同,制作过程相同。[顺便说一句:D

docker 制作打包镜像
说明:本文档基于CentSo7系统,ubuntu系统只是部分命令不同,制作过程相同。
[顺便说一句:Docker公司最新条款标明,被美国列入“实体清单”的中国IT公司禁止施工docker。(对此表示无能为力的强烈愤怒!)]
Docker说明:
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。
Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。
总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用Docker可以不修改应用程序代码,不需要开发人员一套环境一套部署。

 加端端老师免费领取更多编程资料

一,制作镜像首先要安装docker
        安装docker 有两种方式 
1.安装离线docker(百度很多,不做详细说明。其实是因为太懒)
2.安装在线docker (以下镜像制作过程都是使用在线拉取的docker制作)


  • 拉取命令:      yum install docker
  • 启动命令:      sudo systemctl start docker
  • 查看docker版本:docker version
  • 查看镜像命令:  docker images
  • 删除镜像命令:  docker rmi +镜像名称(或者镜像id)



二,制作过程
docker自带我们所需要的很多镜像,如:mysql,redis,java,fdfs,mq等,在我们制作所需要的镜像时可以使用 docker search +名称来查看  如:docker search mysql;
拉取镜像的命令为:docker pull +名称 ,如 docker pull mysql 后面也可以带版本号比如:docker pull mysql :7.5
    由于我们在应用程序的使用过程中需要修改配置,所以我们采用挂载的方式把外部文件挂载到容器内部;挂载方式后面有说明;
    镜像:使用 docker pull 拉取的为镜像; 镜像是用于创建 Docker 容器的模板
    容器&#xff1a;基于镜像启动的应用程序为容器&#xff08;部分镜像<跟制作过程有关系>可以基于一个镜像启动好多个容器后面有说明&#xff09; 容器是独立运行的一个或一组应用&#xff0c;是镜像运行时的实体。

三&#xff0c;制作方式
目前我学习到的有两种制作方式&#xff1a;
1.  使用Dockerfile 
       下面用制作java项目的jar镜像来说明Dockerfile的使用
1.1. 编写Dockerfile文档


  • FROM docker.io/openjdk                   #基础镜像(一个FROM标签就是一个基础镜像)
  • ADD jdk-8u221-linux-x64.tar.gz /usr/java/jdk   #添加jdk&#xff0c;&#xff08;放入的jdk包&#xff09;
  • ENV JAVA_HOME /usr/java/jdk/jdk1.8.0_221  #配置环境变量
  • ENV PATH ${PATH}:${JAVA_HOME}/bin    #配置环境变量
  • COPY hmhc-server-1.2.7.jar /home/hmhc-server-1.2.7.jar  #考入jar包
  • COPY application.yml /home/application.yml       #考入jar的配置文件&#xff08;外部挂载的方式&#xff09;注意考入的位置&#xff0c;启动的时候需要挂载配置文件
  • ENTRYPOINT ["java","-jar","/home/hmhc-server-1.2.7.jar","--spring.config.location&#61;/home/application.yml"]              #启动命令&#xff08;标红的命令为挂载启动&#xff09;

1.2. 放入jar包以及jar的配置文件&#xff0c;要和Dockerfile在同级目录下
1.3. 放入离线的jdk包&#xff0c;并解压&#xff0c;要和Dockerfile在同级目录下
1.4. 在本目录下执行命令打包&#xff1a;docker build -t 空格 定义的镜像名称 空格 .&#xff08;点&#xff09;
1.5. 查看控制台一般会显示总共有多少步执行到哪一步等所有都执行完表示成功&#xff0c;可以使用docker images 查看是否生成了镜像
1.6. 启动容器前将jar的配置文件放到某个目录下这里的配置文件为application.yml&#xff0c;放到root下
1.7. 启动容器&#xff1a;docker run --privileged&#61;true -e TZ&#61;"Asia/Shanghai" -v /root/application.yml:/home/application.yml --name hmhcserver -p 8083:8083 -d hm2 /bin/sh -c &#39;java -jar /home/hmhc-server-1.2.7.jar&#39;    
       命令解释&#xff1a;
        --privileged&#61;true         #设备root用户的权限
        -e TZ&#61;"Asia/Shanghai"    #设置时区&#xff0c;否则docker运行的容器时间会有问题
        -v /root/application.yml:/home/application.yml  #-v 挂载&#xff0c;/root/application.yml 宿主机放配置文件的位置:/home/application.yml映射到容器中
        --name hmhcserver  #给容器起别名
        -p 8083:8083   #映射端口  前面的为宿主机的端口 后面为jar内部要启的端口
        -d    #后台运行
        hm2  #打包的镜像名称

2.在线拉取镜像直接制作
         docker自带了很多镜像,在我们作镜像的时候都是在有外网的情况下的&#xff0c;所以这种在线拉取的方式很方便&#xff0c;灵活。下面就利用制作java项目过成说明下
2.1 .在1中我们说了使用Dockerfile制作java项目的jar方式&#xff0c;在例子中我们使用了基础镜像&#xff0c;离线的jdk包&#xff0c;编写了Dockerfile文件&#xff0c;在我们使用在线拉取方式的时候不需要这些&#xff0c;docker中提供了java镜像&#xff0c;它包含了我们需要的jdk等。我们只需要在启动容器的时候作调整。
2.2 制作过程
           拉取镜像&#xff1a;docker pull java  
           这个拉取完后可以使用查看命令查看
2.3 启动过程&#xff0c;以1中的jar为例说明&#xff0c;使用挂载的方式启动容器
           直接用命令说明&#xff1a;
           docker run --privileged&#61;true -p 8083:8083 -e TZ&#61;"Asia/Shanghai" -d --name web_server -v /root/web/:/home/ -it java java -jar /home/hmhc-server-1.2.7.jar --spring.config.location&#61;/home/application.yml
           只介绍重要部分&#xff0c;公共部分不做说明
           -v /root/web/:/home/  #这个命令是把主宿机web下的所有挂载到容器的home中&#xff0c;web目录是自己创建的&#xff0c;名字可以随便起&#xff0c;只要启动命令中和这个一样就可以&#xff0c;我们可以把打好的jar包以及配置文件放到里边。
           --spring.config.location&#61;/home/application.yml  挂载配置文件启动
2.4 如果启动过程中没报错可以使用docker ps -a 可以查看容器是否启动&#xff0c;查看日志的命令为&#xff1a;docker logs &#43;容器名称
2.5 这个制作过程相对使用Dockerfile的制作过程简单&#xff0c;而且后期要升级服务我们只需要替换掉web目录下的jar包&#xff0c;然后重新启动容器就可以。

四&#xff0c;上面我们说了镜像的制作过程&#xff0c;下面我们说下如何把制作的镜像在其他系统中使用
4.1镜像的导出导入&#xff0c;容器的导出导入
      镜像的导出命令&#xff1a;docker save &#43;镜像的名称 > 别名.tar
                 导入命令&#xff1a;docker load <别名.tar
      容器的导出命令&#xff1a;docker export 容器名称 > ./别名.tar
                 导入命令&#xff1a;docker import ./别名.tar 导入后你想起的名称
    两者的区别&#xff1a;


  • 1.docker save保存的是镜像&#xff08;image&#xff09;&#xff0c;docker export保存的是容器&#xff08;container&#xff09;&#xff1b;
  • 2.docker load用来载入镜像包&#xff0c;docker import用来载入容器包&#xff0c;但两者都会恢复为镜像&#xff1b;
  • 3.docker load不能对载入的镜像重命名&#xff0c;而docker import可以为镜像指定新名称。

4.2 我们把上面做好的镜像导出做个示例&#xff1a;
     docker save java > java.tar 
     Java.tar就是我们做好的镜像&#xff0c;我们可以把这个包传到其他有docker&#xff08;离线或者在线的都可以&#xff09;的系统&#xff0c;执行docker load
     然后就可以启动容器了命令&#xff1a;
     docker run --privileged&#61;true -p 8083:8083 -e TZ&#61;"Asia/Shanghai" -d --name web_server -v /root/web/:/home/ -it java java -jar /home/hmhc-server-1.2.7.jar --spring.config.location&#61;/home/application.yml
4.3 我们要升级系统的时候只需要替换到web目录下的jar包  修改启动命令中的hmhc-server-1.2.7.jar 改为jar包的名称
4.4这种打包的方式我们可以启动好多个容器&#xff0c;也就是可以运行好多个java项目只要容器的别名不一样

备注&#xff1a;
1.启动后服务出现乱码问题&#xff0c;跟数据库的脚本乱码无关
       出现这种问题的时候在启动脚本的java -jar 中间加入-Dfile.encoding&#61;utf-8 来处理乱码
2.Docker日志的存放位置&#xff1a;/var/lib/docker/containers/
       删除docker日志的命令&#xff1a;cat /dev/null > *-json.log
3.Docker启动暴漏给宿主机的只是端口&#xff0c;如果docker启动正常&#xff0c;但是服务不能正常访问的话就得查看服务的包是否正常。

五 &#xff1a;其他应用程序的docker打包 

   Docker本身就提供了很多的应用程序的镜像&#xff0c;和之前我们说的打包java相同&#xff0c;我们可以使用docker search &#43; 应用程序的名称来查看需要拉取的镜像&#xff0c;使用docker pull &#43; 应用程序的名称拉取我们需要的镜像&#xff0c;docker的启动命令相同。比如&#xff1a;Redis&#xff0c;zooKeeper&#xff1b;
   在启动的时候我们需要把配置文件映射到容器即可。
   备注&#xff1a;zooKeeper 镜像的导出和导入要用save和load命令(个人测试&#xff0c;具体原因还么研究出来)

   Nginx示例: 拉取nginx后先启动nginx
   命令为&#xff1a;docker run --name  &#43; 拉取的镜像名称或id  &#43;  -p 8081:80 -d nginx
   在宿主机创建三个文件夹&#xff08;文件位置随意&#xff09; mkdir -p /usr/local/nginx/{conf,conf.d,html,logs}
   然后拷贝启动的nginx下的nginx.conf 和default.conf到以下文件&#xff08;拷贝命令&#xff1a;docker cp&#xff09;
  docker cp 34359:/etc/nginx/nginx.conf /usr/local/nginx/conf/ (34359为启动的nginx的id号)
  docker cp 34359:/etc/nginx/conf.d/default.conf /usr/local/nginx/conf.d/&#xff08;将拷贝出的conf.d 中default.conf的80改为8080&#xff09;
  将前端包放到html文件夹中,将之前启动的nginx容器先暂停再删除&#xff0c;然后执行启动命令&#xff0c;启动的时候我们需要把conf,conf.d,html使用挂载的方式映射到容器中&#xff0c;上面说过挂载的方式&#xff0c;这里不在做详细说明。
  单纯的挂载配置文件启动  &#xff0c;在本地配置好nginx.conf 放入nginx下  下面的命令是设置了两个nginx 的server 映射了两个端口
  docker run -d -p 8087:8081  -p 8086:8080 --name nginx -v         /usr/local/java/mynginx/nginx.conf:/etc/nginx/nginx.conf:ro -v         /usr/local/java/mynginx/conf.d:/etc/nginx/conf.d  nginx
  
   Mysql示例:
    拉取mysql 后直接启动&#xff0c;命令为&#xff08;同时设置密码&#xff09;&#xff1a; docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD&#61;123456 -d mysql
    登陆&#xff1a;  docker exec -it mysql mysql -u root -p123456
    修改root 可以通过任何客户端连接&#xff08;这个可以连接mysql后设置或者添加到mysql配置文件&#xff09;&#xff1a; ALTER USER &#39;root&#39;&#64;&#39;%&#39; IDENTIFIED WITH mysql_native_password BY &#39;123456&#39;;

   操作docker 中的所有容器的命令&#xff1a;
docker中 启动所有的容器命令
docker start $(docker ps -a | awk &#39;{ print $1}&#39; | tail -n &#43;2)
docker中    关闭所有的容器命令
docker stop $(docker ps -a | awk &#39;{ print $1}&#39; | tail -n &#43;2)
docker中 删除所有的容器命令
docker rm $(docker ps -a | awk &#39;{ print $1}&#39; | tail -n &#43;2)
docker中    删除所有的镜像
docker rmi $(docker images | awk &#39;{print $3}&#39; |tail -n &#43;2)

Linux下替换jar包文件的操作

&#xff08;1&#xff09;使用jar tvf jar名称 | grep 目标文件名 查询出目标文件在war包中的目录
例如&#xff1a;        jar tvf zcsfastDFSTest-0.0.1-SNAPSHOT.jar | grep RunZCS.class
&#xff08;2&#xff09;使用jar xvf jar名称 目标文件名(copy上面查出的全路径) 将目标文件及所在war包中的目录解压到当前路径
例如&#xff1a;        jar -xvf zcsfastDFSTest-0.0.1-SNAPSHOT.jar com/zhuoshi/zcsfastDFS/RunZCS.class
&#xff08;3&#xff09;修改目标文件的内容&#xff0c;或者将要新的目标文件替换掉提取出来的目标文件
例如&#xff1a;        cp RunZCS.class com/zhuoshi/zcsfastDFS/
&#xff08;4&#xff09;使用jar uvf jar名称 目标文件名&#xff08;和步骤&#xff08;2&#xff09;中的目标文件名相同&#xff09; 将新目标文件替换到 jar包中
例如&#xff1a;        jar -uvf zcsfastDFSTest-0.0.1-SNAPSHOT.jar com/zhuoshi/zcsfastDFS/RunZCS.class

定时删除docker日志&#xff1a;
crontab -e  设置定时任务&#xff0c;在/var/spool/cron/下面
0 0 */1 * * /bin/sh /home/ruanshuan/docker/docker_bj/web/delete.sh  --每隔一天执行一次

  加端端老师免费领取更多编程资料


推荐阅读
  • NFS(Network File System)即网络文件系统,是一种分布式文件系统协议,主要用于Unix和类Unix系统之间的文件共享。本文详细介绍NFS的配置文件/etc/exports和相关服务配置,帮助读者理解如何在Linux环境中配置NFS客户端。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • 本文详细介绍了如何在预装Ubuntu系统的笔记本电脑上安装Windows 7。针对没有光驱的情况,提供了通过USB安装的具体方法,并解决了分区、驱动器无法识别等问题。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • Linux环境下C语言实现定时向文件写入当前时间
    本文介绍如何在Linux系统中使用C语言编程,实现在每秒钟向指定文件中写入当前时间戳。通过此示例,读者可以了解基本的文件操作、时间处理以及循环控制。 ... [详细]
  • Symfony是一个功能强大的PHP框架,以其依赖注入(DI)特性著称。许多流行的PHP框架如Drupal和Laravel的核心组件都基于Symfony构建。本文将详细介绍Symfony的安装方法及其基本使用。 ... [详细]
  • 对于许多初学者而言,遇到总线错误(bus error)或段错误(segmentation fault/core dump)是极其令人困扰的。本文详细探讨了这两种错误的成因、表现形式及解决方法,并提供了实用的调试技巧。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本文详细介绍了如何解压并安装MySQL集群压缩包,创建用户和组,初始化数据库,配置环境变量,并启动相关服务。此外,还提供了详细的命令行操作步骤和常见问题的解决方案。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
  • 本文深入探讨了 Delphi 中类对象成员的核心概念,包括 System 单元的基础知识、TObject 类的定义及其方法、TClass 的作用以及对象的消息处理机制。文章不仅解释了这些概念的基本原理,还提供了丰富的补充和专业解答,帮助读者全面理解 Delphi 的面向对象编程。 ... [详细]
  • cJinja:C++编写的轻量级HTML模板引擎
    本文介绍了cJinja,这是一个用C++编写的轻量级HTML模板解析库。它利用ejson来处理模板中的数据替换(即上下文),其语法与Django Jinja非常相似,功能强大且易于学习。 ... [详细]
author-avatar
曾理Aiheqihao_227
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有