Docker概述 Docker为什么出现
一款产品需要经历2个阶段: 开发 --- 上线. 开发和上线有2个环境: 应用环境(部署), 应用配置(需要配端口,连接等,麻烦)
所以产生了两个角色: 开发 和 运维. 很多企业面临的问题: 我在我的电脑上可以运行,在别人电脑上就运行不起来了. 有时候版本更新,导致服务不可用, 所以对于运维来说,考验就非常大了.
怎么解决这个问题: 要么就是开发管理运维,要么就是运维学开发. 开发即运维.
环境配置是十分的麻烦,每一个机器都要部署环境!(比如部署集群Redis,ES,Hadoop....)耗时耗力
比如发布一个项目jar(有Redis环境,MySQL环境,jdk环境, ES环境).发布项目可能要几分钟,但部署一个项目要花费几小时.
如果我们发布项目的时候带着环境一起打包发给运维,那么就省时省力了. 那docker就是干这事的.
之前在服务器配置一个应用的环境 Redis MySQL jdk ES Hadoop,配置超麻烦,配错就BPQ了,而且环境不能垮平台. 像windows和linux环境有着天壤之别.所以有以下两种解决方法:
传统: 开发发布一个jar给运维,剩下的环境由运维部署
现在: 开发打包部署上线,一套流程做完!
理解docker:
比如用java写的apk -- 发布到了应用商店 ---张三要想使用apk --- 安装即可用
同理: 比如用java写的一个项目jar(里面还有一些环境)---我们把它们打包(即所谓的镜像机制,类似于windows安装就会自带一些软件,这也是windows的镜像.)---运维只需下载发布的镜像运行即可
Docker给以上的问题,提出了解决方案.
logo:
Docker的思想来自于集装箱
箱子是互相隔离的. 那么系统上要运行很多的软件,这些软件可能要发生很多冲突.比如跑了一个java环境在上面,这上面有很多应用,会因为端口冲突报错,或者配置错误,连接错误.这些环境在原来都有一些交叉的.
现在我们要把它们隔离出来, 那隔离就是这个Docker的核心思想. 隔离相当于集装箱,我们把所有东西打包装箱,每个集装箱互相隔离.
举个例子: 一个集装箱来装水果,另一个集装箱来装生化武器. 根据常识我们不能把它们一起放在船上,那样吃了水果我们就会变异了.那么现在我们为了使这些完全不相同的东西能放在同一个环境去运行.比如有一个linux服务器,原来我们把这两个全都放在这个系统中,会导致感染.现在我们通过镜像(容器)来进行隔离不会导致感染.
Docker还有一个好处:它通过隔离机制,可以将服务器利用到极致!
Docker历史2010年,几个搞IT的年轻人,就在美国成立了一家公司dotCloud. 做一些pass的云计算服务! LXC有关的容器技术!
他们将自己的技术(容器化技术) 命名就是Docker!
Docker刚刚诞生的时候,没有引起行业的注意!几乎面临倒闭. 所以创始人想到了开源来维持生存.
2013,Docker开源. 越来越多的人发现它的优点.火了之后.Docker每个月都会更新一个版本.
2014年4月9日,Docker1.0发布!
Docker为什么这么火?因为十分的轻巧! 在容器技术出来之前,我们都是使用虚拟机技术!
虚拟机: 在windows中装一个Vmware,通过这个软件我们可以虚拟出来一台或者多台电脑! 比较笨重,h好处就是和真实机器一样,并相互隔离.
虚拟机也是属于虚拟化技术,Docker容器技术,也是一种虚拟化技术! 它俩本质是一样的.虚拟机注重软件和硬件.Docker注重软件.
vm: centos原生镜像(一个电脑) 隔离: 需要开启多个虚拟机! 几个G 开机几分钟
docker: 隔离 : 镜像(最核心的环境 4m + jdk + mysql) 十分的小巧, 运行镜像就可以 几个M/KB 秒级启动!
到现在, 所有开发人员都必须要会Docker!
聊聊Docker
Docker基于Go语言开发. 开源项目
官网: Home - Docker
文档地址: Docker Documentation | Docker Documentation Docker的文档是超级详细的!
仓库地址: https://hub.docker.com/
Docker能干嘛 之前的虚拟机技术虚拟机技术缺点:
1.资源占用十分多
2.冗余步骤多
3.启动很慢
容器化技术容器化技术不是模拟的一个完整的操作系统
比较Docker和虚拟机技术的不同
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响.
DevOps(开发,运维)
应用更快速的交付和部署
传统: 一堆帮助文档,安装程序
Docker: 打包镜像发布测试,一键运行
更便捷的升级和扩缩容
使用了Docker之后,我们部署应用就和搭积木一样!
项目打包为一个镜像,扩展 服务器A性能到了瓶颈,我们要水平扩展,要做负载均衡.直接在服务器B上一键运行镜像,就运行起来了.不需要一个一个做了.
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的.
更高效的计算资源利用:
Docker是内核级别的虚拟化,可以再一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致.
Docker安装 Docker的基本组成
镜像(image)
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run==>tomcat01容器(提供 服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的).
容器(container)
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的.
启动,停止,删除,基本命令!
目前就可以把这个容器理解为就是一个简易的linux系统
仓库(repository)
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库!
Docker Hub(默认是国外的)
阿里云...都有容器服务器(配置镜像加速!)
安装Docker环境准备
- 需要会一点点的Linux的基础
- CentOS 7
- 我们使用Xshell连接远程服务器进行操作
环境查看
系统内核(3.10),系统版本(7)
安装
帮助文档:
# 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.设置镜像的仓库
sudo yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo # 默认是从国外的! 建议使用国内的
# 更新yum软件包索引
yum makecache fast
# 4.安装docker引擎 docker-ce 社区 ee 企业版
yum install docker-ce docker-ce-cli containerd.io
# 5.启动docker
systemctl start docker
# 6.使用docker version 是否安装成功
# 7.hello-world
docker run hello-world
那我们如何看到镜像是被下载过来了呢?
# 8.查看一下下载的这个 hello-world 镜像 docker images
了解: 卸载docker
# 1.卸载依赖 yum remove docker-ce docker-ce-cli containerd.io # 2.删除资源 rm -rf /var/lib/docker rm -rf /var/lib/containerd # /var/lib/docker docker的默认工作路径!阿里云镜像加速
1.登录阿里云找到容器服务
2.找到镜像加速地址
3.配置使用
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://qiyb9988.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker run了之后会做哪些流程?
docker开始了之后,它会在本机寻找镜像,这是第一步.docker找到了之后,它会做一个事情:判断本机是否有这个镜像,这是会有两种情况,有或没有.有就使用这个镜像并运行.没有这个就会去docker hub下载这个镜像.下载完就能用了吗,答案当然是不行的.docker hub会判断是否可以找到这个镜像,会出现两种情况:要么找到要么找不到.找不到就会返回错误,找到就会下载这个镜像到本地. 如下run的运行流程图:
底层原理Docker是怎么工作的?
Docker是一个Client - Server 结构的系统, Docker的守护进程运行在主机上.通过Socket从客户端访问! DockerServer接收到Docker-Client的指令,就会执行这个命令!
Docker为什么比VM快?
1. Docker有着比虚拟机更少的抽象层.
2. docker利用的是宿主机的内核, vm需要是Guest OS.
所以说,新建一个容器的时候,docker不需要想虚拟机一样重新加载一个操作系统内核,避免引导.虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级!
Docker的常用命令 帮助命令docker version #显示docker的版本信息 docker info #显示docker的系统信息,包括镜像和容器的数量 docker 命令 --help #帮助命令
帮助文档的地址:Reference documentation | Docker Documentation
镜像命令docker images 查看所有本地的主机上的镜像
[root@master ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE #解释 REPOSITORY 镜像的仓库源 TAG 镜像的标签 IMAGE ID 镜像的id CREATED 镜像的创建时间 SIZE 镜像的大小 #可选项 -a, --all #列出所有镜像 -q, --quiet #只显示镜像的id
docker search 搜素镜像
[root@master ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 12508 [OK] mariadb MariaDB Server is a high performing open sou… 4810 [OK] # 可选项,通过搜索来过滤 --filter=STARS=3000 #搜索出来的镜像就是STARS大于3000的 [root@master ~]# docker search mysql --filter=STARS=3000 NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 12508 [OK] mariadb MariaDB Server is a high performing open sou… 4810 [OK]
docker pull 下载镜像
# 下载镜像 docker pull 镜像名[:tag] [root@master ~]# docker pull mysql Using default tag: latest #如果不写 tag, 默认就是latest latest: Pulling from library/mysql 4be315f6562f: Pull complete #分层下载,docker image的核心 联合文件系统 96e2eb237a1b: Pull complete 8aa3ac85066b: Pull complete ac7e524f6c89: Pull complete f6a88631064f: Pull complete 15bb3ec3ff50: Pull complete ae65dc337dcb: Pull complete 573c3c7fa18d: Pull complete 9d10771b98b8: Pull complete 3d8ef442614b: Pull complete 7dc17a6cea26: Pull complete 752752efdaea: Pull complete Digest: sha256:2dafe3f044f140ec6c07716d34f0b317b98f8e251435abd347951699f7aa3904 #签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #真实地址 # 等价于它 docker pull mysql docker pull docker.io/library/mysql:latest # 指定版本下载 [root@master ~]# docker pull mysql:5.7
docker rmi 删除镜像!
[root@master ~]# docker rmi -f 镜像id #删除指定的镜像 [root@master ~]# docker rmi -f 镜像id 镜像id 镜像id 镜像id #删除多个镜像 [root@master ~]# docker rmi -f $(docker images -aq) #删除全部的镜像容器命令
说明: 我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
docker pull centos
新建容器并启动
docker run [可选参数] image #参数说明 --name='Name' 容器名字 例如:tomcat01,tomcat02. 用来区分容器 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 -p 主机端口:容器端口(常用) -P 随机指定端口 # 测试,启动并进入容器 [root@server]# docker run -it centos /bin/bash [root@镜像id]# ls #查看容器内的centos. 基础版本,很多命令都是不完整的! # 从容器中退回主机 exit
列出所有的运行的容器
# docker ps 命令 不加选项 #列出当前正在运行的容器 -a # 列出当前正在运行的容器+带出历史运行过的容器 -n=? #显示最近创建的容器 -q #只显示容器的编号
退出容器
exit #直接容器停止并退出 Ctrl + p + Q #容器不停止退出
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f docker rm -f $(docker ps -aq) #删除所有的容器 docker ps -a -q | xargs docker rm #删除所有的容器
启动和停止容器的操作
docker start 容器id #启动容器 docker restart 容器id #重启容器 docker stop 容器id #停止当前正在运行的容器 docker kill 容器id #强制停止当前容器
操作命令 Docker镜像 容器数据卷 DockerFile Docker网络原理 IDEA整合Docker Docker Compose Docker Swarm CICD jenkins



