1 什么是Docker
1-1 Docker历史
2010 dotCloud PAAS
2013 Docker开源
2014.6 Docker 1.0
2014.7 C轮 $4000万
2015.4 D轮 $9500万
1-2 什么是Docker?
Docker是一个装应用的容器,就像杯子可以装水,笔筒可以放笔,书包可以放书一样,你可以把Hello World放在Docker里,你可以把网站放在Docker里,你可以把任何你想得到的程序放在Docker里。
官方解释:Docker is the world's leading software containerization platform。
Docker开源,代码托管在GitHub。
跨平台,支持Windows,MacOS,Linux。
2 了解Docker
2-1 Docker思想
1.集装箱
在没有集装箱之前,运输货物零散,没有规矩。有了集装箱后,货物装在集装箱,箱子很大,不容易丢失。保证货物安全原样送到目的地。把货物想象成程序,现在要把运行的程序部署到另外一台新的机器上去,如果有过相关经验的人可能会想到少拷了一些配置文件等会启动不起来。这些大部分都是认为的疏忽导致的错误,有了Docker的集装箱,就解决了这些问题。它会保证程序不管放在哪,运行时候不会缺少东西。
2.标准化
运输方式标准化:Docker运输程序有一个超级码头,任何一个地方需要货物的时候,都由鲸鱼把货物先送到超级码头,再由鲸鱼从超级码头送到目的地。例如想要从台式机将程序发到笔记本,之前可以使用QQ、U盘等方法。有了Docker之后,就标准化了这个过程:需要做的就是在台式机上执行一个Docker命令,将鲸鱼派过来,把程序送到超级码头去。再在笔记本上执行一个Docker命令,让鲸鱼把程序从超级码头送到笔记本上。
存储方式标准化:把程序拷贝到笔记本上时,得指定一个目录,还得记住这个目录。而有了Docker后,就不需要关心你的应用存储在什么地方,要想运行或者停止它的时候,只需要执行Docker命令即可。
API接口的标准化:Docker提供了一系列REST的接口,包含了对Docker应用的控制,包含启动,查看,进入,删除等。有了接口标准化,只需要执行同样的命令,就能控制所有的应用。
3.隔离
在使用虚拟机时,它有自己的内存、CPU、硬盘,完全感觉不到外面主机的存在。Docker类似,不过它的技术更加轻量,能够快速的创建和销毁,比如创建一个虚拟机需要几分钟,而创建一个Docker只需要一秒。底层的技术实际上是Linux的一种内核限制机制,叫做LXC,LXC是一种轻量级的容器虚拟化技术,最大效率隔离了进程和资源。通过cgroup、namespace限制隔离进程组使用的物理资源,比如CPU、memory等等。其实这个机制早在8、9年前已经加入Linux内核中,直到2013年Docker出世时候才火起来。Docker成功更像是时势造英雄,如果没有云计算,没有敏捷开发,没有高频度的弹性伸缩需求,没有IT行业的这么多年的长期发展,就没有Docker。
2-2 Docker解决了什么问题
--“我本地运行没问题啊!”
Docker解决了运行环境不一致所带来的问题。
--“系统好卡,哪个哥们又写死循环了?!”
Docker启动时候就已经限定好了最大能够使用的CPU、硬盘等资源,如果超过,只会自己挂掉,丝毫不影响其他的程序。
--“双11来了,服务器撑不住啦!”
一到这种节日,运维需要在各台机器上部署各种各样的服务,比如要装Java、Tomcat等等,还要调试。有了Docker后,这个过程就很轻松。
Docker的标准化让快速扩展及弹性伸缩变得非常简单。
3 走进Docker
3-1 Docker核心技术
Docker里三大核心:镜像、容器、仓库。
可以理解为:
仓库→超级码头
镜像→集装箱→Java类
容器→运行镜像的地方→Java类new出来的对象
用Docker运行一个程序的过程就是:去仓库把镜像拉到本地,然后用一条命令把镜像运行起来,变成容器。
Build:构建镜像
Ship:运输镜像(从仓库和主机)
Run:运行镜像,成为一个容器
3-2 Docker镜像
镜像本质上就是一系列文件,既包括应用程序的文件,也可以包括应用运行环境的文件。
利用了联合文件系统
最底层是操作系统的引导,第二层是具体的Linux操作系统,上面是相关的软件。
Docker镜像每一层文件系统都是只读的。把每一层加载完成之后,这些文件都会被看做是同一个目录,相当于是一个文件系统。Docker的这种文件系统就被称为镜像。
3-3 Docker容器
容器的本质就是一个镜子,可以把容器想象是一个虚拟机。和虚拟机的区别是,容器里面的文件系统是一层一层的,并且最下面的N层都是只读的,只有最上面的一层是可写的。
3-4 Docker仓库
先把本地的镜像传到Docker仓库,再由目的地从Docker仓库把镜像拉过去。
由Docker中央服务器提供:
hub.docker.com(国外,速度慢)
https://c.163yun.com/hub#/m/library/(国内网易云)
网易云仓库访问步骤:
1.注册后,在主界面的产品与服务一栏找到镜像仓库:
2.在镜像仓库中找到镜像中心:
3.在镜像中心找到镜像库,进去后就可以找到各种已经生成好的镜像了:
4 在CentOS安装Docker
参考教程:https://www.cnblogs.com/yufeng218/p/8370670.html
5 Docker初体验
5-1 第一个Docker镜像
sudo service docker start
启动docker服务
docker pull [OPTIONS] NAME [:TAG]
从远程库拉取镜像
NAME:镜像名称
TAG:版本
OPTIONS:拉取参数
docker images [OPTIONS] [REPOSITORY[:TAG]]
查看本机都有哪些镜像,也可以用来验证pull是否成功
REPOSITORY:指定镜像名称
TAG:版本
docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
运行镜像
COMMAND:运行时,执行哪些命令
ARG...:运行时,执行哪些参数
docker ps
查看正在这台机器上运行的容器
docker stop 容器id名(简写也行)
停止容器
5-2 第一个Docker容器
出现如下语句,说明镜像运行成功
docker pull&docker run流程:
Client:本机Docker Client
Docker_host:也是本机Docker daemon来管理
Registry:Docker远程仓库
docker pull:客户端client向docker daemon发送一条命令让其拉取某一个镜像,deamon先去本机去检查是否存在镜像是否存在及版本是否一致,如果存在,deamon不会执行任何操作;如果不存在,deamon会从远端仓库去找该镜像,如果找到,就从远端仓库将其拉到本地。
docker run:同样,客户端client向docker daemon发送一条命令,deamon会先检查镜像在本地是否已经存在,如果不存在,此时执行docker pull操作,从远端将镜像拉取到本地,然后将镜像通过一定的方式运行起来,变成docker容器。
6 Docker运行Nginx静态网站
6-1 运行Nginx镜像
实践前奏
持久运行的容器
前台挂起&后台运行
进入容器内部
使用pull命令把Nginx镜像拉取下来:
docker pull hub.c.163.com/library/nginx
查看镜像:
docker images
运行Nginx镜像(前台启动):
docker run hub.c.163.com/library/nginx
运行Nginx镜像(后台启动):
docker run -d hub.c.163.com/library/nginx
进入容器:
docker exec -it 容器id bash
6-2 Docker网络
网络类型:
Bridge:使用的网络有独立的namespace
Host:如果启动容器时指定使用host模式,那么该容器将不会获得一个独立的network namespace,而是和主机共同使用一个。这时容器将不会虚拟出自己的网卡、配置自己的IP等等,而是会使用宿主机的IP和端口
None:docker不会和外界进行任何通讯
端口映射:
使用Bridge模式时,涉及到一个问题:既然使用的网络有独立的namespace,这就需要一种技术,使容器内的端口可以在主机上访问到,这种技术就是端口映射。访问主机上的端口,就是访问Docker容器内的端口
-p:开放一个容器端口给主机
启动一个镜像,并将容器的80端口映射到主机的8080端口:
docker run -d -p 8080:80 镜像名
-P:开放所有的端口给一个随机端口
docker run -d -P 镜像名:
可以看到,Docker容器的80端口映射到了主机的32768端口
7 第一个Java Web应用
7-1 制作自己的镜像
Dockerfile:用来告诉Docker我要如何制作我的镜像,每一步操作分别是什么
docker build命令:来执行Dockerfile里所描述的每一件事情,最终会把Docker镜像构建出来
Jpress: http://jpress.io/
1.下载一个JavaWeb项目,下载地址:https://gitee.com/fuhai/jpress/blob/alpha/wars/jpress-web-newest.war
2.将下载好的war包放到/app目录
3.将tomcat下载到本地
docker pull hub.c.163.com/library/tomcat:latest
4.编辑Dockerfile文件,让应用随tomcat启动就加载:
vi Dockerfile
添加如下代码:
from hub.c.163.com/library/tomcat
MAINTAINER jiangfan [email protected]
COPY jpress.war /usr/local/tomcat/webapps/
每一步做的事:
第一步:执行from hub.c.163.com/library/tomcat命令,作为基础镜像
第二步:把所有者信息写进去
第三步:把jpress.war拷贝到tomcat的webapps路径下
最后build成功
(如果报错not a directory,检查下在webapps后面的/是否存在)
使用命令来生成镜像:
docker build -t jpress:latest .
-t:指定REPOSITORY及TAG
.:当前目录
7-2 运行自己的容器
使用指令
docker run -d -p 8888:8080 jpress
运行jpress镜像,并将tomcat的8080端口映射到8888,通过浏览器访问tomcat主页:
访问jpress项目:
在Docker中安装mysql数据库:
docker pull hub.c.163.com/library/mysql:latest
启动mysql镜像:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=jpress -p 3306:3306 -d hub.c.163.com/library/mysql:latest
其中指定mysql的密码为123456,数据库的名字为jpress
可能出现的错误:
1.修改mysql编码,否则jpress报错:
https://blog.csdn.net/m0_37639542/article/details/72852875
2. host IP地址错误,用docker exec -it 容器ID bash 进入到容器,之后用cat /etc/hosts 即可看到系统mysql的host IP,用这个IP才能连接。172.17.0.26