【Docker学习之旅】手把手教你Java应用进行Docker化

2023-05-16

手把手教你Java应用进行Docker化

简介:简介:Docker是一个使用Go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的机器上。

一、了解Docker是什么

1.什么是Docker?

历史:

  • 2010 dotCloud PAAS :竞争太大
  • 2013 docker开源 :发展不理想,决定开源
  • 2014.6 Docker1.0
  • 2014.7 C轮 $4000万
  • 2015.7 D轮 $9500万
  • 至今 Docker 1.13

装应用的容器,可以把任何程序放进docker里;

2.Docker思想

在这里插入图片描述

logo鲸鱼装货物,很整齐,能装很多;鲸鱼运输集装箱到超级码头,再分发。

  • 集装箱 :如把程序所有相关配置都打包,解决在一个环境能运行,另外一个环境运行出错
  • 标准化
    • 运输方式 : 哪里需要则需要由小鲸鱼运输,如:把应用使用qq发送,u盘拷贝到目的地
    • 存储方式 : 把程序copy到笔记本上,需要记住这个目录。不需要关心存储什么地方,使用命令执行即可
    • API接口 : 接口标准化,如tomcat,nginx都有自己的启动方式,使用docker就一种启动方式
  • 隔离 :如虚拟机,而docker更轻量化,使用linux rxc技术,达到快速创建销毁,可能1秒就创建好了

3.Docker解决了什么问题?

  • 我本地运行没问题!

    比如一个java web程序要启动起来需要依赖什么?

    • 操作系统
    • jdk版本
    • tomcat版本
    • 配置文件,或则与系统相关的。 只要任意一个出现问题,都有可能运行不起来或则运行结果不对

    那么docker就是解决这个问题的,把各个配置打包成集装箱,又小鲸鱼送到服务器上,然后运行;

  • 系统好卡,哪个哥们又写死循环了?

    公用服务器的时候会出现这种情况,某一个应用占用太多资源,导致另外一个应用崩溃; docker则的隔离机制则会在启动时就限制好了,你这个应用可用最大资源是固定的。不会影响到其他的应用

  • 双11来了,服务器撑不住啦!

    热点事件的时候,访问流量巨大,平时部署这么多机器就纯粹的浪费人力物力; 那么在热点事件来临之际,就需要运维开启大量的机器来支撑。 docker就是解决这个问题的,只需要动动鼠标,配置配置即可快速扩容

二、走进Docker

1.核心词汇

  • 镜像 :集装箱
  • 仓库 :超级码头
  • 容器 :程序运行的地方

去仓库把镜像拉到本地,用命令把程序运行起来,变成服务器;

Docker - Build, Ship, and Run Any App, Anywhere

  • build构建镜像
  • ship运输镜像
  • run运行镜像

2.Docker镜像

image :一系列的文件;文件就会有存储到哪里?格式是什么?

联合文件系统(UnionFS) 是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。

简单说:将不同的目录挂载到同一个虚拟目录下;相当于分库分表这种,入口就是一个大表

在这里插入图片描述

上图是docker镜像的存储格式,一层一层的,就像集装箱。

  • bootfs 操作系统引导
  • base image : 具体的linux系统
  • image :软件,应用代码
  • container : 先忽略

除了 container 都是只读的,这种文件格式就叫镜像、

3.Docker容器

可以先把容器想象成一个虚拟机;整个就是一个文件系统。只有容器这一层是可写的;

可以保证,同一个镜像可以被多个容器运行

有了镜像,把镜像传输到目的地。那么这个仓库就是用来存储镜像的,需要的地方从仓库拉取镜像

那么谁提供仓库呢?

  • hub.docker.com // docker官网提供,国内访问国外网速都差于是出现了第三方仓库
  • c.163.com // 网易云
  • 自己搭建仓库 // 内部使用

4.安装Docker

windows安装

windows10之外: docker-toolbox : 会虚拟一个docker运行环境

windows10 :原生支持

下载地址官网查看即可;https://www.docker.com/products/docker-desktop

macos

新版已经原生支持mac了;上面地址中查看;

macos中安装docker是所有平台中最方便的,直接拖进 application中即完成安装

linxu

  • redhat centos:(http://www.imooc.com/article/16448)
  • ubuntu

下载地址:

apt-get install -y docker.io

curl -s https://get.docker.com | sh

service docker start

在这里插入图片描述

三、Docker初体验

1.第一个实例Hello-world

从仓库拉取一个镜像,命令语法:

docker pull [OPTIONS] name:[TAG]

name: 镜像名称
TAG:镜像版本

查看本机有哪些镜像

docker images [OPTIONS] [REPOSITORY][:TAG]

REPOSITORY: 镜像名称;
后面的可选参数用得比较少,除非很多很多镜像的时候

拉取一个 hello-world 镜像;

docker pull hello-world

在这里插入图片描述

镜像运行到容器上

把下载的hello-world运行起来

运行命令:

docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARGS...]

COMMAND: 镜像运行起来的时候要执行什么命令

看到如下信息则标识运行成功了,下面有解释了为了打印这个消息,docker做了4步

在这里插入图片描述

运行过程

在这里插入图片描述

2.第二个实例 docker运行nginx静态网站

实践前奏:

  • 持久化运行的容器
  • 前台挂起 & 后台运行
  • 进入容器内部
docker pull nginx

先查看本机镜像

在这里插入图片描述

运行

docker run nginx

敲完之后,终端阻塞了,这个应该是前台运行的,可以在另开一个终端使用 查看当前正在运行的容器

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED              STATUS              PORTS               NAMES
c3ccaf24ee0e        hub.c.163.com/library/nginx   "nginx -g 'daemon ..."   About a minute ago   Up About a minute   80/tcp              vibrant_almeida

后台运行直接加 -d参数即可,可以使用 docker run --help命令查看,其他命令也是一样,也可以使用help

docker run -d nginx

进入容器,

# -it 分配一个伪终端。 29 是容器id部分字符串, bash 是要运行的命令
[root@localhost ~]# docker exec -it 29 bash
root@29dc6a24c527:/# which nginx
/usr/sbin/nginx

# 使用exit可以退出容器;

在这里插入图片描述

docker内部网络

  • 网络类型 :网络也是一种隔离类型
    • bridge : 桥接模式(默认)
    • host :与宿主机使用同一个
    • none
  • 端口映射 :容器内的网络是隔离的,所以需要一种手段来访问到容器内的网络端口

在这里插入图片描述

使用端口映射来运行nginx

# -p 端口映射:8080 是宿主机上的端口,80 是容器内的端口
# 运行之后,就可以通过访问宿主机8080端口进行访问容器内的nginx了
# -P 大写P,是把所有端口使用随机端口映射,可以通过docker ps 看到端口映射的详情
docker run -d -p 8080:80 hub.c.163.com/library/nginx

# 查看 8080端口是否ok
netstat -na|grep 8080

在这里插入图片描述

3.第三个实例 第一个java web应用

制作自己的镜像

  • Dockerfile : 如何制作镜像,写代码

  • docker build : 构建

  • Jpress:

    http://jpress.io/ 下载这个博客应用,然后用这个项目来练手 https://gitee.com/fuhai/jpress/tree/alpha/wars 下载这个

Dockerfile

# 继承一个镜像,这里找一个tomcat,意思是以tomcat为一个基础点
# docker pull hub.c.163.com/library/tomcat:latest
# 先让那个去下载,这里接着写,到时候就不用再下载了
from hub.c.163.com/library/tomcat:latest

# 容器信息
MAINTAINER liuguoguo xxx@163.com

# 把这个war文件copy到某一个地方
# 这里把之前下载的war复制到 tomcat中的一个目录中去
# 可以查看镜像仓库 刚才下载的地方有说明怎么使用的。里面有一个目录就是用来放war包的
COPY jpress-web-newest.war /usr/local/tomcat/webapps

这里我新建了一个目录,把Dockerfile和要打包的war都放在这个目录里面了,执行命令也是在这个目录里面

运行命令:docker build .

[root@localhost dockerdemo]# docker build .
Sending build context to Docker daemon  20.8 MB
Step 1/3 : FROM hub.c.163.com/library/tomcat:latest
 ---> 72d2be374029
Step 2/3 : MAINTAINER liuguoguo xxx@163.com
 ---> Using cache
 ---> af2a0019bc2d
Step 3/3 : COPY jpress-web-newest.war /usr/local/tomcat/webapps
 ---> 75a573e4e281
Removing intermediate container 9c88b6be1ef3
Successfully built 75a573e4e281

可以看到执行了3个步骤;最后一步是把镜像移动到了 docker中;

查看镜像,发现出现一个 none的镜像;

REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
<none>                         <none>              75a573e4e281        54 seconds ago      313 MB

这个是打包的时候没有指定名称和版本;重新编译下

docker build . -t jpress:latest

# 可以使用--help命令查看docker build 的帮助信息

再次查看

[root@localhost dockerdemo]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
jpress                         latest              75a573e4e281        3 minutes ago       313 MB

运行自己的容器

镜像打好了,来运行这个镜像

# 镜像内部端口需要查看tomcat默认开放的端口是什么,因为我们之前没有做任何的修改
docker run -d -p 8080:8080 jpress

# 查看是否已经运行
docker ps

# 查看8080端口是否已经使用
netstat -na|grep 8080

访问地址:http://localhost:8080/ 可以看到tomcat的页面了。

由于默认的tomcatwar 是增加了项目名;所以访问:http://localhost:8080/jpress-web-newest (war包名就是这个,所以项目名就是war包名)

已经打开了,使用该博客打开就有一个引导,需要填写数据库;

这里在docker中运行一个mysql

# -e 是设置环境参数,这个是在镜像描述使用说明里面看到的
# 这样可以设置一个root的用户名和密码
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=jpress hub.c.163.com/library/mysql:latest
st:8080/ 可以看到tomcat的页面了。

由于默认的tomcatwar 是增加了项目名;所以访问:http://localhost:8080/jpress-web-newest (war包名就是这个,所以项目名就是war包名)

已经打开了,使用该博客打开就有一个引导,需要填写数据库;

这里在docker中运行一个mysql

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Docker学习之旅】手把手教你Java应用进行Docker化 的相关文章

  • 相机标定:关键点法 vs 直接法

    相机标定中最常见的方法是关键点法 xff0c 比如 OpenCV 和 MatLab 中使用棋盘格 圆阵列等二维图案进行标定 xff0c 这上面的棋盘格角点和圆心就是所谓的关键点 虽然关键点法有很多优点 xff0c 但在某些情况下容易遇到标定
  • 8本推荐游戏开发书籍

    很多刚刚接触游戏开发的朋友经常问我 xff1a 如何开始学习游戏开发 xff1f 我从事游戏开发行业很多年了 xff0c 坦率地讲 xff0c 开发游戏充满挑战性 xff0c 需要开发人员具备大量的技能与积极的创新精神 希望这篇小文能帮助朋
  • Maxwell启动停止脚本

    Maxwell启动停止脚本 进入 maxwell bin nbsp 直接运行下面的内容 生成脚本 bin bash description maxwell File maxwell Description Starts and stops
  • Epoll 的time_out参数引发的cpu占用问题

    转自 xff1a https www cnblogs com Jimmy104 p 5258205 html 针对自己写的一个服务器网络引擎Engine 文章后面附上源码 使用epoll 刚刚开始时候发现占用CPU 特别高 xff0c 但是
  • 【周志华机器学习】集成学习

    第八章 集成学习 个体与集成BoostingBagging 与随机森林Bagging随机森林 结合策略平均法投票法学习法 多样性 个体与集成 集成学习通过构建并结合多个学习器来完成学习任务 xff0c 也被称为多分类器系统 集成学习的一般结
  • 用户句柄表的遍历

    私有句柄表 HANDLE TABLE ENTRY的Object直接指向 OBJECT HEADER不用减 span class token macro property span class token directive hash spa
  • 树莓派安装后--安装必要软件(个人版)

    树莓派安装后 安装必要软件 xff08 个人版 xff09 查看是哪个版本 lsb release a 查看raspbian是哪个版本 getconf LONG BIT 查看系统位数 uname a kernel 版本 opt vc bin
  • 固定翼姿态控制流程

    固定翼控制流程 主文件夹 子文件 fw att control位于src moudle文件夹下 fw att control main c 主文件 fw att control params c 主文件参数 CMakeList attitu
  • 固定翼位置控制_Tecs

    Tecs在位置控制中主要控制纵向的高度 xff0c 因为升降舵可以控制飞机的高度 xff0c 油门可以控制飞机的速度 xff0c 但是单单通过升降舵改变高度会使速度下降或者上升 xff0c 单单通过油门改变速度会使高度改变 xff0c 所以
  • 固定翼位置控制_L1

    L1算法控制航向 飞机从现在位置到设定位置 xff0c 需要进行转弯 转弯需要一个横向的加速度来改变速度的方向 这里横向加速度的计算公式 a 61 V2R 又因为R 61 2 sin L1 可得 a 61 2 V2L1 sin L1是现在位
  • 存储过程懂不懂

    存储过程的官方定义是这么说的 xff1a 存储过程 xff08 Stored Procedure xff09 是一组为了完成特定功能的 SQL 语句集 xff0c 经编译后存储在数据库中 用户通过指定存储过程的名字并给出参数 xff08 如
  • PX4多旋翼位置控制

    多悬翼的位置控制由内外环控制 xff0c 外环P控制作用于位置差 xff0c 产生期望速度 xff0c 内环PID作用于速度差 xff0c 产生期望油门 xff0c 然后将油门解算成期望姿态 外环位置控制的三种控制源 1 Manual 手动
  • PX4混控器定义

    PX4混控 把输入指令 分配给电机以及舵机的执行器 信号传递 Actuators id 61 ORB ID actuator controls 0 0号控制组 Orb publish actuators id actuators 0 pub
  • Linux--Ubuntu18.04交叉编译链;多窗口终端;彻底删除不用的虚拟机镜像

    文章目录 建立共享文件夹交叉编译查看是否安装了交叉编译工具安装交叉编译工具链退出root模式 多窗口终端 Terminator彻底删除不用的虚拟机镜像 建立共享文件夹 实现windows系统与虚拟机中的ubuntu之间的文件共享 PC机新建
  • 准确率,召回率,mAP(mean average precision)解释

    准确率Precision 召回率Recall 其实这个翻译相当蛋疼 recall最合理的翻译应该是 查全率 而Precision的最合理的翻译应该是查准率 这样就很容易理解了 xff0c 假设一个班级有10个学生 xff0c 5男5女 你用
  • Android 开发使用 Java 8 中Lambda 表达式功能

    简介 Android开发支持所有 Java 7 语言功能 xff0c 以及一部分 Java 8 语言功能 xff08 具体因平台版本而异 xff09 注意 xff1a 在开发应用时 xff0c 可以选择使用 Java 8 语言功能 您可以将
  • 浅谈 for循环

    浅谈for循环 xff0c for循环习题讲解 文章多看几遍吧 相信你一定会收获不少哇 什么是循环 xff1f 我认为循环就是把一个步骤一直重复执行的操作 如果没有终止条件 xff0c 那么这一步骤就会一直执行下去 xff0c 直到地老天昏
  • 给Jetson Nano更换eMMC闪存(扩容)

    7月4日更新 xff1a 添加了有关问题的解释与探讨 xff08 文末 xff0c 下一篇文章 xff09 7月5日更新 xff1a 添加了效果图 xff08 文末 xff09 7月8日更新 xff1a 添加了视频 b站 xff1a BV1
  • Linux下安装Anaconda3,这个教程一定要看!

    前言 大家好 xff0c 我是爱写Bug的麦洛 由于工作需要 xff0c 要为客户搭建Python开发环境 作为从来没有接触过Python的小白 xff0c 为了完成任务 xff0c 也是破费周折 xff0c 请教了身边做Python的朋友
  • Stm32F303进入bootloader重新烧录程序

    STM32F3飞控或开发板无法进入bootloader重新进行烧录固件程序的解决方案 F3系列的MCU无法进入bootloader 前提准备开始F4和F3的不同 F3系列的MCU无法进入bootloader 前几日找了一块F3的飞控板 刷入

随机推荐