Docker概述
docker为什么会出现
一款产品:开发---->上线 两台电脑,应用环境,应用配置
开发---运维,产生问题:在我的电脑上可以运行,另一台就不行.版本更新,导致服务不可用.对于运维来说,考研很大.
环境配置是十分麻烦的,每一台机器都要部署环境(集群Redis,ES,Hadoop...)费时费力
发布一个项目jar*(Redis,MySqk,jdk,ES)项目能不能带上环境安装打包
之前在服务器配置一个应用环境Reids,MySql,jdk,ES,Hadoop配制超级麻烦,不能跨平台
windows最后发布到lniux
传统:开发jar,运维来做
现在:开发打包部署上线一套流程做完.
java--apk--发布(应用商店)--张三使用apk--安装即可用
java--jar(环境)--打包项目带上环境(镜像)---docker仓库:商店---下载发布的镜像--直接运行即可
docker解决以上问题.
docker的思想来源于集装箱:
jre--多个应用(端口冲突)--原来是交叉的
隔离:docker核心思想,打包装箱,每个箱子互相隔离
docker通过隔离机制,可以将服务器利用到极致
docker历史
Docker 公司起初是一家名为 dotCloud 的平台即服务(Platform-as-a-Service, PaaS)提供商。
底层技术上,dotCloud 平台利用了 Linux 容器技术。为了方便创建和管理这些容器,dotCloud 开发了一套内部工具,之后被命名为“Docker”。Docker就是这样诞生的!
2013年,dotCloud 的 PaaS 业务并不景气,公司需要寻求新的突破。于是他们聘请了 Ben Golub 作为新的 CEO,将公司重命名为“Docker”,放弃dotCloud PaaS 平台,怀揣着“将 Docker 和容器技术推向全世界”的使命,开启了一段新的征程。(开源)
如今 Docker 公司被普遍认为是一家创新型科技公司,据说其市场价值约为 10 亿美元。Docker 公司已经通过多轮融资,吸纳了来自硅谷的几家风投公司的累计超过 2.4 亿美元的投资。
几乎所有的融资都发生在公司更名为“Docker”之后。
提示:“Docker”一词来自英国口语,意为码头工人(Dock Worker),即从船上装卸货物的人。
docker为什么这么火
docker是go语言开发,开源
在容器技术出来之前,我们都是使用虚拟机技术
虚拟机:在window中安装一个Vmware,通过这个软件我们可以虚拟一台电脑,特别占用内存,笨重
虚拟机也是属于虚拟化技术,docker容器技术,也是一种虚拟化技术
wm:linux cnetos镜像(一台电脑),隔离,需要开启多个虚拟机,几个G,启动需要几分钟
docker:隔离,镜像(最核心环境,4m_+jdk+mysql)十分小巧,运行镜像就可以了,几兆,启动秒级
虚拟机技术与容器化技术
虚拟机技术缺点:
- 资源占用十分多
- 冗余步骤多
- 启动慢
容器化技术:
- 容器化技术不是模拟一个完整的操作系统
比较docker和虚拟机的不同
- 传统虚拟机,虚拟出一组硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核,也没有虚拟我们的硬件,所以就很轻便了
- 每个容器间互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
DevOps(开发,运维)
-
应用更快速地交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
-
更便捷的升级扩缩容
使用了docker之后,我们部署应用就和搭积木一样
项目打包为一个镜像,扩展服务器a,服务器b
-
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的
-
更高效的计算资源利用
docker是内核级别的虚拟化,可以在一个物理机上运行很多容器实例,服务器的性能被压榨到极致
Docker安装
docker名词
-
docker镜像(image):镜像类似一个模板,可以通过这个模板创建容器服务,通过tomcat镜像–run—tomcat1容器(提供服务)通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)
-
容器(container):docker容器技术,独立运行一个或者多个应用,通过镜像来创建容器
启动,停止,删除,基本命令.目前可以把这个容器看成一个简易版的linux系统
-
仓库(repository):用来存放镜像的地方
-
公有仓库
-
私有仓库
docker hup默认国外的,速度慢
阿里云容器加速(配置镜像加速)
-
安装docker
网址:https://docs.docker.com/engine/install/centos/
环境:CentOS7
uname -r:查看系统内核3.10版本以上
1.卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.安装包
yum install -y yum-utils
3.设置镜像仓库(阿里云镜像下载快)
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新yum软件包索引
yum makecache fast
5.安装docker相关的内容
yum install docker-ce docker-ce-cli containerd.io
6.启动docker
systemctl start docker
7.使用命令查看是否安装成功
docker version
8.卸载docker(卸载依赖,删除目录)
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
阿里云镜像加速
这个需要输入自己的阿里云地址(容器镜像服务–镜像加速器)
四个命令,一个一个执行
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://06vyb81f.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
底层原理
docker是怎么工作的?
docker是一个Client-Server结构的系统,docker的守护进程运行在主机上,通过socker从客户端访问,DockerServer接收到DockerClient的指令,就会执行这个命令.
docker为什么比vm快?
- docker有着比虚拟机更少的抽象层
- docker利用的是宿主机的内核,vm需要是CuestOs
所以说,新建一个容器的时候,docker不需要像虚拟机一样更新加载一个操作系统内核,避免引导虚拟机是加载GuestOS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程.秒级的.
docker基本命令
docker version #显示docker版本信息
docker info #显示docker的系统信息,包括镜像和容器数量
docker -help #帮助命令
镜像命令
docker images #显示所有本地的主机镜像
REPOSITORY 镜像的仓库源
TAG 镜像的标签
TMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
docker search + 镜像名称 #搜索镜像
docker pull + 镜像名称 #下载最新版镜像
docker rmi + TMAGE ID #删除镜像
docker rmi -f e733 #删除指定镜像
docker rmi -f ajff afdj djsi #删除多个镜像
docker rmi -f $(docker images -aq)#删除所有镜像
容器命令
有了镜像才可以创建容器
docker run [可选参数] image #新建容器启动
#参数说明
--name="name" 容器名字:tomcat1 tomcat2用来区分容器
-d 后台方式运行
-it 使用交互方式,进入容器查看内容
-p 指定容器端口号 -p 8080:8080(小写) 主机端口:容器端口
-P 随机指定端口(大写)
docker run -it centos /bin/bash #启动并进入容器
exit #退出容器命令(容器停止退出)
ctrl + p + q #退出容器命令(容器运行退出)
docker ps #查看正在启动的容器
docker ps -a #查看所有容器
docker ps -a -n=1 #查看最近创建的一个容器
docker rm + 容器id #删除指定容器(先停止运行),后加上-f强制删除
docker rm -f $(docker ps -aq) #递归删除所有容器
docker ps -q|xargs docker rm #删除所有容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止容器
docker kill 容器id #杀死容器