824-第一个docker化的java应用
https://www.imooc.com/learn/824
简介:Docker是一个使用Go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的机器上。Docker的发展速度和火爆程度着实令人惊叹,一发不可收拾,形成了席卷整个IT界的新浪潮。学完本课程你将了解到什么是docker,docker的思想以及诸如镜像,仓库,容器等核心概念。你将学会怎样运行一个容器,如何搭建私有仓库,怎么写dockerfile以及怎样把自己的应用放到容器中运行。docker将会是你的IT路上一笔不小的财富。
目录
第1章 课程介绍
对docker有个简单的印象,了解课程的安排。
1-1 课程介绍
docker解决企业大部分痛点:
- 快速的持续集成
- 服务的弹性伸缩
- 部署简单,解放了运维
- 为企业节省了机器资源
课程内容:
什么是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是一个用来装应用的容器,就像被子可以装水,笔筒可以放笔,书包可以放书一样,可以把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解决了什么问题
我本地运行没问题啊。
一个Java Web程序要启动起来需要依赖什么?
操作系统
调用了操作系统不一致的系统命令
JDK
JDK版本,如:JDK1.7编译的class文件在JDK1.6上运行
Tomcat
Tomcat版本,旧版本配置可能在新版本中不再支持
代码
比如代码引用了磁盘上(C盘)的一个文件,系统环境编码
配置文件
可能少了某些配置文件
docker解决了运行环境不一致带来的问题。
系统好卡,哪个哥们又写死循环了。
docker的隔离性,使自己运行的程序不受其他程序的影响。
双11来了,服务器撑不住啦。
docker的标准化让快速扩展,弹性伸缩变得简单。
第3章 走进docker
结合上面的类比引出docker的核心技术:镜像、仓库和容器的概念,并分别深入讲解技术、原理。
3-1 docker核心技术
核心概念
- 镜像:集装箱
- 仓库:超级码头
- 容器:运行程序的地方
docker运行程序的过程
- 去仓库把镜像运到本地,用命令把镜像运行起来变成容器。
分别讲解核心概念
- Build:构建镜像
- Ship:运输镜像,从仓库和主机上运输
- Run:运行的镜像,就是容器
3-2 docker镜像
docker镜像就是image。从本质上来说镜像就是一系列的文件(包括应用程序的文件,也包括应用环境的文件)。镜像以联合文件系统分层的形式保存到本地;
docker镜像:(docker中的文件系统都是只读的)
Docker文件保存存储格式?
联合文件系统(Union FS),联合文件系统是一种分层的文件系统,它可以将不同的目录挂到同一个虚拟的文件系统下面。
联合文件系统可以通过这种方式实现文件的分层,比如test1可以看做是第一层,test2可以看做是第二层,每一层有每一层自己的文件,Docker镜像就是利用了这种分层的概念来实现了镜像存储。
docker镜像的存储方式

- 最底层:操作系统的引导
- 上面一层:具体的Linux操作系统
- 上面一层:具体的软件,比如说JDK、Tomcat
- 上面一层:我们自己的应用代码
- 最上面一层:容器层
3-3 docker容器
- docker的容器可理解为一个进程(可以将容器想象为一个虚拟机)
- docker容器中除了Container层可写外,其他层都是只读的
- 镜像的各层都是可读的,如果想对可读层进行修改操作,那么本层内容会传到可写层,然后再进行修改操作;
- 当我们的应用进行文件查找是会从最顶层可写层查找(因为可读层内容都传到可写层),如果可写层没有相应数据才会去可读层查找
- 容器中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.10Ubuntu
系统要求: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镜像
从docker远程的仓库拉取镜像到本地
docker pull [OPTIONS] NAME [:TAG]
注:
- NAME项是必填,代表需要拉取的镜像名称
- [:TAG]是可选的,代表镜像的版本
- [OPTIONS]代表拉取的镜像参数
例如:拉取hello-world镜像命令:
docker pull hello-world
查看我们本机都有哪些镜像,也可以验证我们的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 解析该请求,会首先查询本地镜像仓库是否有对应的资源,假如没有,则向远程镜像中心拉取镜像放回本地,接着在执行该镜像,初始化为一个容器。

Client :本机的docker执行命令的客户端
DOCKER_HOST:本机docker服务
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网络:
网络类型
Bridge(桥接):
docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
Host(主机):
容器不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
None(无网络):
Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。docker将不会和外界的任何网络进行通讯。
container模式:
新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。
端口映射
Bridge网络模式需要使用独立的Namespace,就需要容器内的端口可以在主机上访问,这就是端口映射。
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 制作自己的镜像
制作自己的镜像:
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" 转载请保留原文链接及作者。