一、docker介绍
背景:docker出现主要是用于解决软件跨环境迁移问题
特点:容器技术,沙箱机制,相互隔离,互不影响
诞生时间:2013
版本:社区版(CE)、企业版(EE)
了解docker三个重要概念
1)image镜像
docker镜像就是一个只读模板,比如,一个镜像可以包含一个完整的centos,里面仅安装apache或用户的其他应用,镜像可以用来创建docker容器,另外docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下周一个已经做好的镜像来直接使用
2)container容器
docker利用容器来运行应用,容器是从镜像创建的运行实例,它可以被启动,开始、停止、删除、每个容器都是互相隔离的,保证安全的平台,可以吧容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行再其中的应用程序
3)repostory仓库
仓库是集中存储镜像文件的沧桑,registry是仓库主从服务器,实际上参考注册服务器上存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)
仓库分为两种,公有参考,和私有仓库,最大的公开仓库是docker Hub,存放了数量庞大的镜像供用户下周,国内的docker pool,这里仓库的概念与Git类似,registry可以理解为github这样的托管服务。
二、docker架构
一位同学曾给我打比方:宿主机就好比一间大房子,Docker 把它成了 N 个小隔断。在这些小隔断之间,有独立的卫生间、小床、电视...
麻雀虽小,五脏俱全,这个比喻非常的贴切。Linux 提供了非常全面的隔离机制,使得每个小隔间互不影响。即使隔壁小间满室春光,我的小房间一样的冷清,对我毫无影响。
Docker 能实现这些功能,依赖于 chroot、namespace、cgroup 等三种老技术。
我们本篇文章,就先聊一下 namespace 方面的东西。毕竟隔离是容器的第一要素
Linux 的内核,提供了多达 8 种类型的 Namespace。在这些独立的 Namespace 中,资源互不影响,隔离措施做的非常好。
(1) Namespace
docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)
(2)control Group 控制组
cgroup的特点是:
cgroup的api以一个伪文件系统的实现方式,用户的程序可以通过文件系统实现cgroup的组件管理
cgroup的组件管理操作单元可以细粒度到线程级别,另外用户可以创建和销毁cgroup,从而实现资源载分配和再利用
所有资源管理的功能都以子系统的方式实现,接口统一子任务创建之初与其父任务处于同一个cgroup的控制组
四大功能:
资源限制:可以对任务使用的资源总额进行限制
优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
任务控制:cgroup可以对任务执行挂起、恢复等操作
(3)docker特点
- 灵活:即使是最复杂的应用也可以集装箱化。
- 轻量级:容器利用并共享主机内核。
- 可互换:您可以即时部署更新和升级。
- 便携式:您可以在本地构建,部署到云,并在任何地方运行。
- 可扩展:您可以增加并自动分发容器副本。
- 可堆叠:您可以垂直和即时堆叠服务。
客户端:用于接收用户命令传递至守护进程,进行执行
守护进程:docker后台进程
镜像:qq安装包/redis安装包/jdk安装包
容器:给镜像提供运行环境,类似于集装箱,特点:沙箱机制,相互隔离
镜像仓库:
官方仓库:处于外网环境,所以下载镜像比较慢,建议你配置镜像加速器
私服仓库:公司自己搭建的仓库(二道贩子)
三、docker使用
3.1 打开虚拟机
账密: root/root
3.2 docker安装(已经安装好了,不需要你再操作)
# 1、yum 包更新到最新 yum update -y #2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3、 设置yum源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 4、 安装docker,出现输入的界面都按 y yum install -y docker-ce # 5、 查看docker版本,验证是否验证成功 docker -v
3.3 镜像加速器配置(可以不操作,使用讲师配置好的)
-
网易云镜像加速器
-
腾讯云镜像加速器
-
中科大镜像加速器
-
............................
-
阿里云镜像加速器(需要登录阿里云账号,按照个人分配)
登录阿里云账号后搜索容器镜像服务,点击管理控制台---》镜像加速器
-
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://afi5x6i2.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker#查看镜像加速是否配置成功,查看输出的最后两行即可
docker info
如有执行报错如下:linux进程数超载
[root@cdh1 docker]# cat /proc/sys/kernel/pid_max
32768
[root@cdh1 docker]# echo 1000000 > /proc/sys/kernel/pid_max
3.4 docker三大命令(重点)
a. 守护进程操作命令
#1.启动命令
systemctl start docker
#2.停止命令
systemctl stop docker
#3.重启命令
systemctl restart docker
#4.查看状态
systemctl status docker
#5.加入开机自启
systemctl enable docker
b.镜像操作命令
#1.搜索镜像
docker search xxx(镜像名称)
#2.下载镜像
docker pull xxx(镜像名称) #默认下载最新版 latest
docker pull xxx:版本 #docker pull redis:5.0
#3.查看本地镜像
docker images
docker images -q #查看本地镜像id
#4.删除镜像
docker rmi xxx(镜像名称) #默认删除最新版
docker rmi xxx:版本 #指定版本删除
#5.删除所有镜像
docker rmi 'docker images -q'
c.容器操作命令
#1.创建容器
交互式容器:创建后直接会进入容器内部,一旦退出容器,容器会自动停止运行
docker run -it --name=c1 centos:7 /bin/bash
守护式容器:创建后不会直接进入容器内部,需要使用命令进入,退出容器后,容器正常运行
docker run -id --name=c2 centos:7
#2.查看容器
docker ps #查看正在运行着的容器
docker ps -a #查看所有容器(包含历史)
#3.进入容器命令
docker exec -it 容器名称/容器id /bin/bash
#4.退出容器
exit
#5.停止容器
docker stop 容器名称
#6.启动容器
#如果容器原来是交互式容器,使用start之后会自动转换守护式容器
docker start 容器名称
#7.删除容器
docker rm 容器名称
#8.强制删除容器命令(不建议使用)
docker rm -f 容器名称
四、数据卷(了解)
1.数据卷作用
- 数据持久化
- 容器之间数据共享
- 使容器可以与外部机器间接进行交互数据
容器默认不会留下任何东西。对容器所做的任何更改(假设您没有将其另存为 Image)都会在删除后立即丢失。
为了能够保存(持久化)数据并在容器之间共享数据,Docker 提出了Volume(数据卷)的概念 。很简单,Volume是默认文件系统之外的目录(或文件),并作为主机文件系统上的普通目录和文件存在。
Docker Volume使我们能够保存数据并在容器之间共享
2. 命令
#-v 表示挂载数据卷
# 路径 冒号必须是英文冒号,并且前后没有空格,冒号前表示linux路径,冒号后表示容器内部的路径
docker run -id --name=c1 -v /root/data:/root/datacantiner centost:7
#创建c2容器挂载和c1容器相同的数据卷实现数据的共享
docker run -id --name=c2 -v /root/data:/root/datac2 centost:7
五、docker应用部署
1.mysql部署
#1.搜索镜像
docker search mysql
#2.拉取镜像
docker pull mysql:5.7
#3.部署
docker run -id --name=c_mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
#--name 指定容器名称,可自定义,不指定自动命名
# -p 表示端口号映射 3307 是linux宿主机的端口,3306是容器端口
# -e MYSQL_ROOT_PASSWORD : 给root用户设置密码
#4.进入容器命令
#-it -i以交互模式运行容器,-t分配一个伪终端即命令行
docker exec -it c_mysql bash
#5.mysql连接命令
mysql -uroot -proot
#6.mysql相关命令
show databases; #查看所有的数据库
use 数据库名称; #切换数据库
show tables; #查看所有表
select * from 表名; #查询所有数据
2.tomcat部署
#1.搜索镜像
docker search tomcat
#2.拉取镜像
#3.部署
docker run -id --name=c_tomcat -p 8080:8080 -v /root/tomcat:/usr/local/tomcat/webapps tomcat
#4.新建html页面访问
cd /root/tomcat
mkdir test #创建test文件夹
cd test
vim index.html #新建html文件
#5.这里的场景是index.html在 /root/tomcat下,并且当前目录也在/root/tomcat下,将/root/tomcat/index.html移动值 /root/tomcat/test文件夹
mv index.html test#运行tomcat
docker run --name=tomcat-anguoan -it -d -p 8008:8080 tomcat
#进入容器命令行
docker exec -it 80aaf554d6a4 /bin/bash
3.nginx部署
#0.nginx前情概要
反向代理
负载均衡
部署页面服务器
#1.搜索镜像
#2.拉取镜像
#3.部署
docker run -id --name=c_nginx -p 80:80 -v /root/nginx:/usr/share/nginx/html nginx
#4.新建html
cd /root/nginx
vim index.html
4.redis部署
#1.搜索镜像
#2.拉取镜像
#3.部署
docker run -id --name=c_redis -p 6379:6379 redis
5.应用服务部署
1.编辑dockfile app.jar为重命名后名称
From java:8
Add spring-function-hbase-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar
||
entrypoint ["./xx.sh"]
2.打包镜像(fuction镜像名称)
docker build -f dockerfile -t fuction:1.0 .
3.运行
docker images
docker run -id --name=envenvontrol -p 8081:8081 17d45d73439c
4.进入命令行
docker exec -it 80aaf554d6a4 /bin/bash
六、总结
1.docker架构
客户端:用于接收用户命令,传递至守护进程
守护进程
镜像:一个个的安装包
容器:给镜像提供运行环境,沙箱机制,相互隔离
镜像仓库
官方仓库:处于外网环境,访问慢,需要配置镜像加速器(网易云、腾讯云...;阿里云(首选))
私服:自己公司搭建(二道贩子)
2.docker命令
守护进程命令:
systemctl start docker #启动
systemctl stop docker #停止
systemctl restart docker #重启
systemctl status docker #查看状态
systemctl enable docker #开机自启动
镜像命令:删除镜像的时候,必须把容器里面的占用的镜像删除,才能删除镜像
docker search 镜像名称 #搜索镜像
docker pull 镜像名称 #下载镜像(最新)
docker pull 镜像名称:版本号 #下载指定版本的镜像
docker images #查看本地镜像
docker images -q #查看本地镜像id
docker rmi 镜像名称 #删除最新镜像
docker rmi 镜像名称:版本号 #删除指定版本的镜像
docker rmi $(docker images -q) #删除所有镜像
容器命令:
交互式容器:容器创建完毕直接进入容器内部,一旦退出容器停止运行,
docker run -it --name=c1 centos:7 /bin/bash
守护式容器:容器创建成功后不会自动进入容器内部,进入退出后不会自动停止
docker run -id --name=c2 centos:7
启动容器:如果启动的是交互式容器那么交互式容器会自动转换为守护式容器
docker start 容器名称
停止容器
docker stop 容器名称
删除容器:如果容器正在运行会报错,需要停止后再删除
docker rm 容器名称
强制删除容器
docker rm -f 容器名称
docker rm $(docker ps -a -q) 强制删除所有容器中使用的镜像