1.是什么
2.能干嘛
3.去那下载
4.怎么玩
5.永远的HelloWord跑一次
一次镜像,处处运行,从搬家到搬楼
就是为了解决在开发能运行,到运维运行不起来的问题,出现的原因是版本不一样
现在开发提交的文件不仅包括代码,还包括运行环境
容器与虚拟机比较
虚拟机(vm)就是带环境安装的一种解决方案,在一个操作系统操作另一个操作系统
虚拟机的缺点:1.资源占用多 2.重复步骤多 3.启动慢
容器和虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置,系统因此变得高效轻量保证部署在任何环境中的软件都能始终如一的运行。
docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,docker优势体现为启动速度快,占用体积小。
比较docker和传统虚拟化方式的不同之处:
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程
容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器比传统虚拟机更为轻便。每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程互不影响,能区分计算资源。
Docker能干啥
docker的出现 开发-------承担部分运维角色
devops 开发兼运维
coder 码农 cv
programmer 程序员
software engineer 软件开发工程师
DevOps engineer 运维开发工程师
优点:
1.更快速的应用交付和部署
传统的应用开发完后,需要提供一堆安装程序和配置说明文档,安装部署后需要根据配置文档进行繁杂的配置才能正常运行。docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署和测试验证时间。
2.更便捷的升级和扩缩容
随着微服务架构和docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个docker容器将变成一块积木,应用的升级将变得非常容易,当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级
3.更简单的系统运维
应用容器化运行后,生产环境运行的应用可与开发,测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的bug,当出现异常时,也可以通过测试环境的相同容器进行快速定位和修复。
4.更高效的计算资源利用
docker是内核级虚拟化,不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的cpu和内存的利用率
那些企业在使用
大厂 :新浪 美团
Docker安装
官网 http://www.docker.com
仓库 Docker Hub官网 https://hub.docker.com/(安装docker的镜像的仓库)
前提说明
docker不是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境
docker必须部署在Linux内核的系统上,如果其他系统想要部署docker就必须安装一个虚拟Linux环境
docker的三大组成(三件套)
镜像 容器 仓库
镜像:就是模板,可以用来创建docker容器,一个镜像可以创建很多容器,它也相当于是一个root文件系统。比如官方的cenOS7就包含了完整的一套centos最小系统的root文件系统
相当于容器的源代码,docker镜像文件类似于java的类模板,而docker容器实例类似于java中new出来的对象。
容器:从镜像的角度,可以把容器看做是一个简易版的Linux环境(包括root用户权限,进程空间,用户空间和网络空间)和运行其中的应用程序。
仓库:就是集中存放镜像文件的地方
类似于
Maven仓库 存放各种jar包的地方
github仓库 存放各种git项目的地方
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方
仓库分为public公开库和private私有库两种形式
最大的公开库是 Docker Hub https://hub.docker.com/
存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云,网易云等
Docker架构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Okj6LHe3-1645630716567)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220123133719512.png)]
入门版
Docker平台架构篇
Docker centos安装
如果以前安装过需要先卸载旧版的docker
首先安装gcc
yum -y install gcc yum -y install gcc
安装gcc+
yum -y install gcc-c++ yum -y install gcc-c++
安装软件包
yum install -y yum-utils yum install -y yum-utils
设置stable镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件包索引
yum makecache fast yum makecache fast
安装Docker ce
yum -y install docker-ce docker-ce-cli containerd.io
yum -y install docker-ce docker-ce-cli containerd.io
启动docker
systemctl start docker
测试
docker version
docker run hello-word
卸载Docker
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf/var/lib/docker
rm -rf/var/lib/containerd
阿里云镜像加速器
登录阿里云 在弹性计算下找到容器镜像服务
创建一个个人实例
选择镜像工具
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HXZdLSLn-1645630716568)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220127112843439.png)]
按提示输入命令即可
mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’ { “registry-mirrors”: [“https://ajw20zns.mirror.aliyuncs.com”] } EOF
systemctl daemon-reload
systemctl restart docker
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TwIhh2k6-1645630716569)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220127113345748.png)]
成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y5HxL2vZ-1645630716569)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220127114148896.png)]
为什么docker比虚拟机快(底层原理)
docker有着比虚拟机更少的抽象层
由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在cpu,内存利用率上docker将会在效率上有明显的优势。
docker利用的是宿主机的内核,而不需要加载操作系统OS内核
当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统,进而避免引寻,加载操作系统内核返回等比较费时资源的过程,当新建一个虚拟机时,虚拟软件需要加载OS,返回新建过程是分钟级,而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker只需要几秒钟
Docker命令
帮助启动类命令
启动docker :systemctl start docker
停止docker :systemctl stop docker
重启docker : systemctl restart docker
查看docker状态 :systemctl status docker
开机启动:systemctl enable docker
查看docker的概要信息: docker info
查看docker总体帮助文档 : docker --help
查看docker命令帮助文档: docker 具体命令 --help
镜像命令
列出本地主机上的镜像
docker images
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fjt0ZpfC-1645630716570)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220127124935994.png)]
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签版本号
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一个仓库源可以有多个版本TAG版本,代表这个仓库源的不同版本,我们使用REPOSITORY :TAG来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用ubuntu,docker将默认使用ubuntu :latest镜像
docker images -a显示所有镜像
docker images -q只显示镜像的ID
搜索镜像
docker search 某个xxx镜像的名字 搜索某个镜像是否在远程仓库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FG99tlcC-1645630716570)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220127130337304.png)]
docker search 【OPTIONS】 镜像名字
OPTIONS说明:limit:只列出N个镜像,默认25个
docker search --limit 5 redis
下载镜像
docker pull 某个xxx镜像名字
docker pull 镜像名字【:TAG】
没有TAG就是最新版
等价于docker pull 镜像名称 :latest(latest可以不写)
docker pull ubuntu
docker pull redis:6.0.8 下载6.0.8版本的redis
查看镜像/容器/数据卷所占的空间
docker system df
删除某个镜像的ID
docker rmi
docker rmi -f 镜像名强制删除(删除一个)
docker rmi -f 镜像名1:TAG 镜像名2 :TAG(删除多个)
docker rmi -f $(docker images -qa)(删除全部)
面试题
谈谈docker虚悬镜像是什么?
仓库名 。标签都是《none》的镜像,俗称虚悬镜像dangling image
长什么样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CcNSzQOS-1645630716570)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220127135731307.png)]
容器命令
启动交互式容器
有镜像才能创建容器,这是根本前提
启动交互式容器docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
OPTIONS说明(常用):有些是一个减号,有些是两个减号
–name=“容器新名字” 为容器指定一个名称;
-d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与-t同时使用;
-t:为容器重新分配一个伪输入终端,通常与-i同时使用;
也即启动交互式容器(前台有伪终端,等待交互);
-P:随机端口映射,大写P
-p:指定端口映射,小写p
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eglwrGjO-1645630716571)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220127143844292.png)]
docker run -it ubuntu /bin/bash交互式启动ubuntu
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sg9Hwg7X-1645630716571)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220127144302896.png)]
退出终端输入exit
docker run -it --name=myu1 ubuntu /bin/bash
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VsqlNPI8-1645630716572)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220127145148702.png)]
列出所有正在运行的容器
docker ps [OPTIONS]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gQzYozdK-1645630716572)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220127144836682.png)]
OPTIONS说明:
-a:列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器
-n:显示最近n个创建的容器
docker ps -n 2显示2个
-q:静默模式,只显示容器编号
退出容器
exit run进去容器,exit退出,容器停止
ctrl+p+q run进去容器,ctrl+p+q退出,容器不停止
启动已经停止的容器
docker start 容器ID或者容器的名字
重启容器
docker restart 容器ID或者容器的名字
停止容器
docker stop 容器ID或者容器的名字
强制停止容器
docker kill 容器ID或者容器的名字
删除已经停止的容器
docker rm 容器ID
删除多个
docker rm -f $(docker ps -a -q)
docker ps -a -q |xargs docker rm
重要
启动守护式容器
在大部分场景下,我们希望docker的服务是在后台运行我们可以通过-d指定容器的后台运行模式
docker run -d 容器名
redis演示
docker run -d centos
问题:然后docker ps -a 进行查看,会发现容器退出,很重要的要说明的一点:Docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出
这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可,例如service nginx start 但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样容器后台启动后,就会立即自杀因为他觉得他没事可做了,所以最佳的解决方案就是,将你要运行的程序以前台进程的形式运行,常见就是命令模式,表示我还有交互操作,别中断。
前台交互
docker run -it redis:6.0.8
ctrl+c退出
后台守护式启动
docker run -d redis:6.0.8
查看容器的日志
docker logs 容器名
查看容器内部细节
docker inspect 容器ID
进入正在运行的容器并以命令行交互
docker exec -it容器ID bashShell(交互)
实例:docker exec -it 容器ID /bin/bash
docker attach 容器ID(后台)
上述两个区别:attach直接进入容器启动命令的终端,不会启动新的进程用exit退出,会导致容器停止
exec是在容器中打开新的终端,并且可以启动新的进程用exit退出,不会导致容器的停止。
推荐使用docker exec命令,因为退出容器终端,不会导致容器的停止
从容器内拷贝文件到主机上
容器到主机
docker cp 容器ID:容器内路径 目的主机路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dWq1GblE-1645630716572)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220127170909862.png)]
导入和导出容器
export导出容器的内容流作为一个tar归档文件【对应import命令】
import从tar包中的内容创建一个新的文件系统再导入为镜像【对应export】
案例
docker export 容器ID >文件名.tar
cat 文件名.tar |docker import -镜像用户/镜像名:镜像版本号
Docker镜像
有问题?????????????*****需要重新补充
docker commit提交容器副本使之成为一个新的镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器ID要创建的目标镜像名:【标签名】
案例演示ubuntu安装vim
1.从Hub上下载ubuntu镜像到本地并成功运行
docker pull ubuntu
2.原始的默认Ubuntu镜像是不带vim命令的
3.外网连通的情况下安装vim
先更新我们的包管理工具
apt-get update
然后安装vim
apt-get -y install vim
4.安装完成后,commit我们自己的新镜像
docker commit -m"add vim cmd" -a=“gjx” 容器ID gjxUbuntu:1.0
5.启动我们的新镜像并和原来的对比
总结
docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似java继承于一个Base基础类,自己再按需扩展新镜像从base镜像一层一层叠加生成的,每安装一个软件,就在现有镜像的基础上增加一层。
本地镜像发布到阿里云
镜像生成的方法
将本地镜像推送到阿里云
创建仓库镜像
选择控制台进入镜像服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SsT6KCo2-1645630716573)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220222140051250.png)]
选择个人实例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yvJG7uqH-1645630716573)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220222140113297.png)]
命名空间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MBKlXwhY-1645630716573)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220222140210537.png)]
选择命名空间自己随意创建一个
选择镜像仓库创建一个镜像仓库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-80WMnt8w-1645630716574)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220222140423908.png)]
进入管理界面获得脚本
将镜像推送到阿里云registry
管理界面脚本
脚本实例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-57h5QCAH-1645630716574)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220222163136324.png)]
按上面命令一步一步来完成
将阿里云上的镜像下载到本地
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L1F8z8o2-1645630716575)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20220222163703099.png)]
将本地镜像发布到私有库
与公有的类似
1.下载镜像Docker Registry
docker pull Registry
2.运行私有库Registry,相当于本地有个私有Docker hub
docker run -d -p 5000:5000 -v /zzyyuse/myregistry --privileged=true registry
3.案例演示创建一个新镜像,ubuntu安装ifconfig命令
apt-get update
apt-get install net-tools
4.curl验证私服库上有什么镜像
curl -XGET http://192.168.111.167:5000/v2/_catalog
5.将镜像zzyyubuntu:1.2修改符合私服规范的Tag
6.修改配置文件使之支持http
7.push推送到私服库
8.curl验证私服库上有什么镜像2
Docker容器数据卷
是什么?
卷就是目录或者文件,存在于一个或者多个容器之中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Unio File System提供一些用于持续存储或者共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会存在容器删除时删除其挂载的数据卷.
有点类似于redis里面的rdb和aof文件将docker容器内的数据保存进宿主机的磁盘中
运行一个带有容器卷存储功能的容器实例
docker run -it --privileged=true -v/宿主机绝对路径目录:/容器内目录 镜像名
Docker常规安装简介
总体步骤
搜索镜像 拉取镜像 查看镜像 启动镜像 停止容器 移除容器
安装tomcat
查找tomcat镜像
安装mysql
docker启动mysql
docker run -p 3307:3306 --name gjxmrrmysql
-v /mydata/mysql/log:/var/log/mysql
-v /mydata/mysql/data:/var/lib/mysql
-v /mydata/mysql/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root
-d mysql:5.7
参数:
- -p 3306:3306:将容器的3306端口映射到主机的3306端口
- –name:给容器命名
- -v /mydata/mysql/log:/var/log/mysql:将配置文件挂载到主机/mydata/…
- -e MYSQL_ROOT_PASSWORD=root:初始化root用户的密码为root
配置mysql
进入挂载的mysql配置目录
cd /mydata/mysql/conf
修改配置文件 my.cnf
vi my.cnf
写入以下内容
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect=‘SET collation_connection = utf8_unicode_ci’
init_connect=‘SET NAMES utf8’
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
然后重启mysql使配置生效
docker restart mysql
安装redis
创建redis配置文件目录
mkdir -p /mydata/redis/conf
这里复习一下
mkdir 和mkdir -p的区别 mkdir只能创建一个目录 mkdir -p 可以一次创建多个目录
例如 mkdir -p /mydata/redis/conf 如果mydata存在就继续在mydata下创建后面的目录,如果不存在就先创建一个mydata目录再创建后面的目录
创建redis配置文件
touch /mydata/redis/conf/redis.conf
启动redis服务
docker run -p 6380:6379 --name gjxmrrredis
-v /mydata/redis/data:/data
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf
-d redis redis-server /etc/redis/redis.conf补充:docker exec -it redis redis-cli 可以直接使用镜像中的redis
配置redis的持久化
在redis.conf中写入appendonly yes
重启redis
docker restart redis