824-第一个docker化的java应用

https://www.imooc.com/learn/824

简介:Docker是一个使用Go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的机器上。Docker的发展速度和火爆程度着实令人惊叹,一发不可收拾,形成了席卷整个IT界的新浪潮。学完本课程你将了解到什么是docker,docker的思想以及诸如镜像,仓库,容器等核心概念。你将学会怎样运行一个容器,如何搭建私有仓库,怎么写dockerfile以及怎样把自己的应用放到容器中运行。docker将会是你的IT路上一笔不小的财富。

第1章 课程介绍

对docker有个简单的印象,了解课程的安排。

1-1 课程介绍

docker解决企业大部分痛点:

  1. 快速的持续集成
  2. 服务的弹性伸缩
  3. 部署简单,解放了运维
  4. 为企业节省了机器资源

课程内容:

  • 什么是Docker?

    对Docker的认识,Docker的历史,初步介绍

  • 理解Docker

    Docker的核心理论、思想,解决了什么实际问题

  • 走进Docker

    Docker的具体技术

  • HelloWorld

  • Nginx服务

    Docker命令、Docker网络

  • Docker化的Java Web

1-2 什么是docker

Docker历史

  • 2010 dotCloud PAAS
  • 2013 docker开源
  • 2014.6 Docker 1.0
  • 2014.7 C轮 $4000万
  • 2015.4 D轮 $9500万
  • 至今Docker 1.13

Docker官网

什么是Docker

Docker是一个用来装应用的容器,就像被子可以装水,笔筒可以放笔,书包可以放书一样,可以把Hello World放在Docker里,可以把网站放在Docker里,可以把程序放在Docker里。

  • docker是世界领先的软件容器化平台(Docker is the world’s leading software containerization
    platform)
  • docker公司开发,开源,托管在github上
  • 跨平台,支持Windows、Macos、Linux

第2章 了解docker

用形象的类比说明docker的集装箱、标准化、隔离的思想。在用几个工作学习中碰到的问题说明docker解决了哪些问题。

2-1 docker思想

  • 集装箱:容器

    保证我们的程序放在任何地方都不会缺少东西

  • 标准化

    • 运输方式

      Docker运输程序有一个超级码头。A B两台电脑,A执行Docker命令把鲸鱼派过来把A的程序送到超级码头,在由B执行Docker命令由鲸鱼把程序从超级码头送过来

    • 存储方式

      不需要再关系拷贝过来的应用存在哪里 只需要在Docker 执行命令

    • API接口

      Docker提供了一系列的RESTFUL API接口,包含了对Docker也就是对应用的控制,其中包括停止 查看 删除等等

      只需要在Docker执行同样的命令 就可以控制所有的应用

  • 隔离:轻量级容器虚拟机技术

    利用Linux内核LXC技术,能够非常快速地创建docker容器

    最底层的技术实际上是一种Linux的一种内核的限制机制(LXC,Linux Container)。LXC是一种轻量级的容器虚拟化技术,最大效率的隔离了进程和资源,通过CGroup 、Namespace等限制隔离进程组所使用的物理资源,如CPU 、I/O 、Memory等等。

    容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求

2-2 docker解决了什么问题

  1. 我本地运行没问题啊。

    一个Java Web程序要启动起来需要依赖什么?

    1. 操作系统

      调用了操作系统不一致的系统命令

    2. JDK

      JDK版本,如:JDK1.7编译的class文件在JDK1.6上运行

    3. Tomcat

      Tomcat版本,旧版本配置可能在新版本中不再支持

    4. 代码

      比如代码引用了磁盘上(C盘)的一个文件,系统环境编码

    5. 配置文件

      可能少了某些配置文件

    docker解决了运行环境不一致带来的问题。

  2. 系统好卡,哪个哥们又写死循环了。

    docker的隔离性,使自己运行的程序不受其他程序的影响。

  3. 双11来了,服务器撑不住啦。

    docker的标准化让快速扩展,弹性伸缩变得简单。

第3章 走进docker

结合上面的类比引出docker的核心技术:镜像、仓库和容器的概念,并分别深入讲解技术、原理。

3-1 docker核心技术

核心概念

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

docker运行程序的过程

  • 去仓库把镜像运到本地,用命令把镜像运行起来变成容器。

分别讲解核心概念

  • Build:构建镜像
  • Ship:运输镜像,从仓库和主机上运输
  • Run:运行的镜像,就是容器

3-2 docker镜像

  1. docker镜像就是image。从本质上来说镜像就是一系列的文件(包括应用程序的文件,也包括应用环境的文件)。镜像以联合文件系统分层的形式保存到本地;

  2. docker镜像:(docker中的文件系统都是只读的)

Docker文件保存存储格式?

联合文件系统(Union FS),联合文件系统是一种分层的文件系统,它可以将不同的目录挂到同一个虚拟的文件系统下面。

联合文件系统可以通过这种方式实现文件的分层,比如test1可以看做是第一层,test2可以看做是第二层,每一层有每一层自己的文件,Docker镜像就是利用了这种分层的概念来实现了镜像存储。

docker镜像的存储方式

Docker镜像
  • 最底层:操作系统的引导
  • 上面一层:具体的Linux操作系统
  • 上面一层:具体的软件,比如说JDK、Tomcat
  • 上面一层:我们自己的应用代码
  • 最上面一层:容器层

3-3 docker容器

  1. docker的容器可理解为一个进程(可以将容器想象为一个虚拟机)
  2. docker容器中除了Container层可写外,其他层都是只读的
  3. 镜像的各层都是可读的,如果想对可读层进行修改操作,那么本层内容会传到可写层,然后再进行修改操作;
  4. 当我们的应用进行文件查找是会从最顶层可写层查找(因为可读层内容都传到可写层),如果可写层没有相应数据才会去可读层查找
  5. 容器中Container层可以修改(即可写),但是在镜像中Container层是不可以修改的,这样也就保证了同一个镜像可以生成多个容器独立运行,而他们之间没有任何的干扰。

3-4 docker仓库

构建镜像的目的

是为了在其机器上运行镜像程序。

仓库的作用

为了在其他地方运行,我们就需要将构建的镜像传递到目的地才可以,仓库可以起到传输传递作用。

传输过程

先将构建的镜像传到docker仓库中,再由目的地去docker仓库将我们的镜像拉过去,这样就完成了传输过程。

docker仓库

  • hub.docker.com(国际)
  • c.163.com(国内)

第4章 docker安装

分别在三中平台上讲解docker的安装。同学可以选择自己的平台观看。

4-1 window安装docker

https://hub.docker.com/?overlay=onboarding

查看Docker版本:

docker version

4-2 macos安装docker

https://hub.docker.com/?overlay=onboarding

4-3 linux安装docker

  • Redhat&CentOS:
    系统要求:64-bit OS and version 3.10

  • Ubuntu

    系统要求:64-bit OS and version 3.10

docker是在Linux的Ubuntu系统开发的,所以在Ubuntu系统是docker的最理想运行系统。

Redhat&CentOS:

# 检查内核版本
uname -r
# 切换到root用户
sudo
# 保证系统为最新版本
yum update
# 卸载旧版本
yum remove docker docker-common docker-selinux docker-engine
# 安装Docker
yum install -y docker
# 查看是否安装成功
yum list installed | grep docker
# 启动docker服务
systemclt start docker
# 查看是否启动成功
systemclt status docker

Ubuntu:

# 检查内核版本
uname -r
# 切换到root用户
su
# 保证系统为最新版本
apt-get update
# 安装Docker
apt-get install -y docker.io
# 安装Docker最新版本
curl -s https://get.docker.com|sh
# 是否安装成功(Client、Server)
docker version
# 启动Docker俯卧撑
service docker start

第5章 docker初体验

第一个实例:用helloworld镜像带入,熟悉docker最基本的两个命令,拉取镜像和运行容器,并讲解背后运行逻辑。

5-1 第一个docker镜像

  1. 从docker远程的仓库拉取镜像到本地

    docker pull [OPTIONS] NAME [:TAG]

    注:

    • NAME项是必填,代表需要拉取的镜像名称
    • [:TAG]是可选的,代表镜像的版本
    • [OPTIONS]代表拉取的镜像参数

    例如:拉取hello-world镜像命令:

    docker pull hello-world
  2. 查看我们本机都有哪些镜像,也可以验证我们的pull是否执行成功

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

    注:

    • [OPTIONS]是镜像的参数
    • [REPOSITORY[:TAG]]是镜像的名称和版本

5-2 第一个docker容器

运行docker镜像命令

docker run [OPTIONS] IMAGE[:TAG][COMMAND] [ARG…]

注:

  • NAME项是必填,代表运行的镜像名称
  • [COMMAND]代表镜像运行的时候需要执行什么命令
  • [ARG…]代表命令所依赖的参数
  • [OPTIONS]代表运行的时候选项

例如:运行hello-world镜像命令:

docker run hello-world

docker client 执行一条命令,然后根据命令内容发送相应的请求到 docker host,docker host 解析该请求,会首先查询本地镜像仓库是否有对应的资源,假如没有,则向远程镜像中心拉取镜像放回本地,接着在执行该镜像,初始化为一个容器。

Docker初体验
  1. Client :本机的docker执行命令的客户端

  2. DOCKER_HOST:本机docker服务

  3. Registry:docker远程仓库

docker pull 流程:

  • 在Client主机发出docker pull执行命令到DOCKER_HOST主机docker服务的Docker daemon中,Docker daemon会先在本机中寻找是否有相应的镜像,如果存在不进行任何操作,否则会从docker的远程仓库Registry中将相应的镜像拉取到本地服务

docker run 流程:

  • 在Client主机发出docker run执行命令到DOCKER_HOST主机docker服务的Docker daemon中,Docker daemon会先在本机中寻找是否有相应的镜像,如果不存在则会从docker的远程仓库Registry中将相应的镜像拉取到本地服务,然后通过一定方式将镜像运行起来变成docker的容器。

第6章 docker运行nginx静态网站

第二个实例:从运行nginx镜像引出docker网络概念和docker的端口映射,最后运行nginx容器。

6-1 运行nginx镜像

运行NGINX:

  • 持久运行的容器
  • 前台挂机 & 后台运行
  • 进入容器内部

常用命令:

# 查找Docker的nginx镜像
docker search nginx
# 获取Docker的nginx镜像
docker pull nginx
# 查看run的帮助信息
docker run --help
# 以后台运行方式运行docker镜像
docker run -d nginx
# 查看正在运行的容器
docker ps
# 查看运行容器的内部信息
docker exec
# 查看容器指定容器ID(CONTAINER_ID)的信息
docker exec -it CONTAINER_ID bash
# 停止容器
docker stop CONTAINER_ID

6-2 docker网络

Docker使用了Linux的namespace技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Docker容器一般会分配一个独立的Network Namespace。

docker网络:

  • 网络类型

    1. Bridge(桥接):

      docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。

    2. Host(主机):

      容器不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

    3. None(无网络):

      Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。docker将不会和外界的任何网络进行通讯。

    4. container模式:

      新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。

  • 端口映射

    Bridge网络模式需要使用独立的Namespace,就需要容器内的端口可以在主机上访问,这就是端口映射。

    Docker可以指定容器内的某个端口与容器所在主机的某个端口进行映射,此时访问主机的端口就是访问容器内的端口

docker网络示意图:

Docker网络

运行nginx镜像,并指定主机的端口:

docker run -d -p 8080:80 nginx

注:

  • 使用 –p 参数,冒号前面为主机端口,后面为容器端口。

docker开放所有随机端口映射到容器上:

Docker run -d -P nginx

查看网络端口信息:

netstart -na | grep 8080

第7章 第一个java web应用

最后一个实例:创建自己的镜像,引出dockerfile,讲解基本的dockerfile语法。然后讲解私有仓库的搭建。最后分别在两台机器上演示docker的跨平台运行我们的java web项目。

7-1 制作自己的镜像

Linux_基于Docker快速搭建个人博客网站

制作自己的镜像:

  • dockerfile

    是由一系列命令和参数构成的脚本。这些命令应用于基础镜像并最终创建一个新的镜像,简化了从头到尾的流程并极大的简化了部署工作。

  • docker build

    用于使用Dockerfile创建镜像。

  • Jpress: http://jpress.io/

    开源的java web应用。

制作 JAVA WEB应用:

dockerFile是docker镜像的创建脚本文件,告诉docker按照文件里的流程去创建镜像

  • 创建Dockerfile文件

    # 创建的镜像继承自指定的tomcat
    from tomcat
    # 创建镜像人的信息,可不写
    MAINTAINER tyk 766564616@qq.com
    # COPY  [本地war包]  [指定的tomcat/webapps/下]
    COPY jpress.war /usr/local/tomcat/webapps
  • 构建镜像,并把镜像命名为jpress

    # 执行这个Dokerfile脚本文件
    docker build -t jpress:latest .

    注:

    • -t:构建镜像的名字
    • .:dockerfile文件的目录,.代表当前目录下

7-2 运行自己的容器

启动构建好的镜像:

docker run -d -p 8888:8080 jpress

查看端口是否被占用:

netstat -na|grep 8888

安装mysql:

docker pull mysql

创建数据库并启动mysql:

docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=jpress mysql

配置jpress:

查看本机实际IP地址:

ifconfig

上传至dockerhub

# 登录
docker login -u 用户名 -p 密码
# docker push [用户名]/[镜像名]:[版本]
docker push 766564616/jpress:latest
# 登出
docker logout

第8章 课程总结

课程总结

8-1 课程总结

  • 思想:集装箱、标准化,隔离

  • 镜像(BUILD)、容器(SHIP)、仓库(RUN)

  • docker命令pull,build,run,stop,restart,exec…


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com

文章标题:824-第一个docker化的java应用

文章字数:3.9k

本文作者:神秘的小岛岛

发布时间:2019-06-21, 19:32:49

最后更新:2019-11-05, 16:40:27

原始链接:https://www.tuyrk.cn/imooc/824-docker-java/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏