参考:imooc 《第一个docker化的java应用》
docker概念
服务弹性伸缩、部署简单、解放运维、节省机器资源
应用:京东、阿里、腾讯
docker历史
- 2010 dotCloud PAAS
- 2013 docker开源
- 2014.6 Docker 1.0
- 至今…
docker是什么
- 一个用来装应用的容器
- 官网:https://www.docker.com/
- 跨平台
docker理解
docker思想

- 集装箱(解决零散问题、货物就是程序)
- 标准化
- 运输方式:由鲸鱼统一运输(超级码头)
- 存储方式:不需关心应用存在哪,用docker管理/运行
- api接口:执行同样的命令控制所有应用
- 隔离:理解为虚拟机
docker解决了什么问题
我本地运行没问题啊??(javaweb依赖:操作系统、jdk、tomcat、代码、配置文件)
- docker把这些环境统统打包装箱
系统好卡(内存不够、服务变慢、别的应用疯狂吃cpu)
- docker隔离性:限定本应用的cpu\内存\硬盘,违规就杀掉自己
双11来了,服务器撑不住
- 一年就那么关键几天并发量特高、按最高标准准备服务器对平时是浪费,所以在节日前临时扩展机器,过节完把节点下线:运维工作量巨大
- docker标准化:让快速扩展、弹性伸缩变得简单
docker技术
docker核心技术
核心词汇:
- 镜像(集装箱)
- 仓库(超级码头)
- 容器(运行程序的地方)
用docker运行一个程序的过程:去仓库把镜像拉到本地,然后用一条命令把镜像运行起来,变成容器
核心词汇:
Build:构建镜像
Ship:运输镜像
Run:运行镜像(运行的镜像就是容器)
docker镜像
镜像(image)就是集装箱
镜像就是一系列的文件,它可以包括我们应用程序的文件,也可以包括应用环境的文件。Docker会把这些文件保存到本地,存储方式采用Linux中的联合文件系统的分层概念方式。
联合文件系统:将不同文件夹的内容挂在到同一层目录下
存储方式见下图:

由下而上:
- 操作系统的引导
- 具体的Linux操作系统
- 相关软件:tomcat、jdk等
- 应用代码
- 顶层为可写层(属于容器)
docker镜像每一层(除了顶层容器)都是只读的,每一层加载完后,这些文件被看作同一个目录,相当于只有一个文件系统。
(参考其他文章:镜像可以用来创建Docker容器的。一个镜像可以包含一个完整的操作系统环境和用户需要的其它应用程序。在docker hub 里面有大量现成的镜像提供下载。docker的镜像是只可读的,一个镜像可以创建多个容器,每个容器之间相互不干扰。)
docker容器
运行程序之地
容器本质是一个进程,和虚拟机的理解相似
最顶层容器为什么可写:程序运行起来,会写入日志文件等
容器是镜像创建的实例。它可以被启动、开始、停止、删除。每个容器都是 相互隔离的、保证安全的平台。
docker仓库
1、镜像构建来干嘛?
为了搬运到其他环境上运行
2、所以镜像如何传输?
先把镜像从运输起点传到docker仓库,再由运输终点(目的地)去docker仓库拉镜像。仓库是集中存放镜像文件的场所
3、谁提供了docker仓库?
~ docker自己 hub.docker.com(国内被墙|慢)
~ 国内:https://c.163yun.com/hub#/m/home
~ 这些仓库是别人提供好的,我们可以把镜像传过去
~ 如果出于安全等因素考虑,docker支持自己搭建镜像中心(比如在内网搭建公司自己的docker仓库,类似于maven的理解)
docker实践
docker安装
版本说明:
- CentOS Linux release 7.4.1708
docker是用ubunto开发的(支持好些)
1 | # 启动docker |
docker体验hello world
第一个docker镜像
1 | # docker pull [OPTIONS] NAME[:TAG] |
第一个docker容器
1 | # docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...] |
图解执行流程:

从左至右分别为 Client、Host、Registry。前两个属于本机,Registry在hello-world例子中相当于远程仓库,整个流程为:
docker pull 过程
- 先向 docker daemon(在Host中)发送拉取镜像请求
- daemon先在本机查找是否由符合版本要求的镜像,如果有,则不会做其他操作;
没有的话,daemon就去 Registry中查找,Registry返回相应镜像到本地。
docker run 过程
先向 docker daemon发送请求,镜像不存在则再执行一次 docker pull过程。
然后通过一定方式把镜象变成容器
docker运行Nginx静态网站
运行nginx镜像
前奏
- 持久运行的容器
- 前台挂起 & 后台运行
- 进入容器内部
1 | $ docker pull hub.c.163.com/library/nginx:latest |
docker网络
如何访问到nginx?
- 网络类型:
- Bridge(默认)
bridge模式是Docker默认的网络设置,此模式会为每一个容器 分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。 - Host
不会创建独立的network namespace。Docker容器中的进程处于宿主机的网络环境中,相当于Docker容器和宿主机共同用一个network namespace,使用宿主机的网卡、IP和端口等信息。
但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。 - None
没有网络,Docker不会和外界进行通讯。Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。 - Container
Container模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。 - 端口映射
使容器的端口在主机上访问到,采用端口映射,Docker可以将容器里面的端口与主机的端口进行映射,这样就可以通过访问主机端口去访问容器端口。
- Bridge(默认)

访问nginx
1 | # 默认桥接 端口映射 |
docker运行java web应用
制作自己的镜像
- Dockerfile(文本文件)
- docker build( docker 命令)
- Jpress:http://www.jpress.io/
1 | vi Dockerfile |
运行自己的容器
1 | docker run -d -p 8888:8080 jpress |


