热门标签 | 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  --每隔一天执行一次

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


推荐阅读
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社区 版权所有