学习的视频地址: https://www.bilibili.com/video/BV1og4y1q7M4
Docker
Docker 为什么要学它
- 高级工程师必备
- DevOps开发模式
学前准备:
- Linux(必备)
- SpingBoot
Docker 学习
学习路线
-
Docker 概述
-
Docker 安装
-
Docker 命令
- 镜像命令
- 容器命令
- 操作命令
- … .
-
Docker 镜像
-
容器数据卷
-
DockerFile
-
Docker 网络原理
-
IDEA整合Docker
上面这些对于一个开发者一家够用了
-
集群管理:Docker Compose
-
集群管理:Docker Swarm(简化版的k8s)
-
Ci\CD Jenkins
下面才是考验功底的
Docker概述
Docker为什么出现?
一款产品:
开发:上线 两套环境!应用环境,应用配置!
开发——>运维 问题:在我的电脑上可以运行!版本更新,导致服务不可用!对于运维来说,考验就十分大? 环境配置是十分的麻烦,每一个机器要部署环境(集群Redis、ES、Hadop…)!费时费力。
发布一个项目(jar + (Redis MySQL jdk ES)),项目能不能都带上环境安装包! 之前在服务配置一个应用的环境Redis MySQL jdk ES Hadop,配置超麻烦了,不能够跨平台。 Windows,最后发布到Linux!
传统:开发jar,运维来做!
现在:开发打包部署上线,一套流程做完!
java — apk — 发布(应用商城) —张三使用apk — 安装即可用! java — jar(环境) — 打包项目带上环境(镜像) — (Docker 仓库:商店) — 下载我们发布的镜像 —直接运行即可!
Docker给以上的问题,提出了解决方案!https://www.docker.com/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52BYEQQP-1653723132472)(docker学习笔记.assets/image-20220525165042809.png)]
Docker的思想就是来自于集装箱 JRE --多个应用(多个端口冲突)–原来都是交叉的! 隔离:Docker核心思想!打包装箱!每个箱子是相互隔离的。 水果 生化武器 Docker 通过隔离机制,可以将服务器利用到极致!
Docker的历史
历史:
2010年,几个搞it的年轻人,就在美国成立了一家公司dotCloud
做一些pass的云计算服务!LXC 有关的容器技术(pass:is基础设计服务,平台服务,以及最终的应用级服务、软件服务)
他们将自己的技术(容器化技术)命名 就是Docker!
Docker 刚刚诞生的时候,没有引起行业的注意!dotCloud,就活不下去!
开源
开源代码!
2013年,Docker开源!
Docker越来越多的人发现了Docker的优点!火了,Docker每个月都会更新一个版本
2014年4月9日,Docker1.0发布!
在容器技术出来之前,我们都使用虚拟机技术!
虚拟机:在window中装一个Vmware,通过这个软件我们可以虚拟出一台或多台电脑!笨重!
虚拟机也是属于虚拟化技术,Docker容器技术,也是一种虚拟化技术!
vm:linux centos 原生镜像(一台电脑!)隔离,需要开启多个虚拟机! 几个G 几分钟
Docker:隔离,镜像(最核心的环境 4m + jdk + mysql )十分的小巧,运行镜像就可以了!小巧! 几个m kb 秒级启动!
聊聊Docker
Docker是基于GO语言开发的!开源项目!
官网:https://www.docker.com/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t03WJLr2-1653723132473)(docker学习笔记.assets/image-20220525165836628.png)]
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/
Docker能做什么
kernel:内核
Lib:运行所需要的库
之前的虚拟机技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xAeU10Cl-1653723132475)(docker学习笔记.assets/image-20220525170117628.png)]
虚拟机技术的缺点:
1、资源占用十分多
2、冗余步骤多
3、启动很慢
容器化技术
容器化技术不是模拟一个完整的操作系统(每个容器都是个独立的个体)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7bzu68QX-1653723132475)(docker学习笔记.assets/image-20220525170258527.png)]
比较Docker和虚拟机技术的不同:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后再这个系统上安装和运行软件
- 容器内的应用直接运行再宿主机的内容,容器时没有自己的内核的,也没有虚拟我i们的硬件,所以轻巧了
- 每个容器间时相互隔离,每个容器内都有一个属于自己的文件系统互不影响。
DevOps(开发\运维)
应用更快捷的交付部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布到测试,一键运行
更便捷的升级和扩缩容
使用了Docker之后,我们部署应用和搭积木一样!
项目打包为一个镜像,扩展 服务器A! 服务器B!
更简单的系统运维
在容器化之后,我们的开发,测试环境都在高度一致的.
更高效的计算机资源利用
Docker是内核级别的虚拟化,可以再一个物理机上运行很多容器实例!服务器性能可以被压榨到极致!
Docker安装
Docker的基本组成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GENqfIvn-1653723132476)(docker学习笔记.assets/image-20220525174519486.png)]
镜像(image):
Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run==>tomcat01容器(提供服务),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的).
容器(container):
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的.
启动,停止,删除,基本命令!
仓库(repository):
仓库就是存放镜像的地方!
仓库分为共有仓库和私有仓库!
Docker Hub(默认是国外的)
阿里云…都有容器服务器(配置镜像加速!)
安装Docker
环境准备
- 需要会一点点的Linux的基础
- CenOS7
- 我们使用Xshell连接远程服务器进行操作
阿里云服务器的购买
- 入口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zxfb58ci-1653723132478)(docker学习笔记.assets/购买服务器的入口.png)]
-
选择自己需要的服务器类型(看经济情况和使用场景)
2.1修改阿里云连接服务器的密码设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WXvi5raM-1653723132479)(docker学习笔记.assets/修改阿里云连接服务器的密码设置.png)]
-
新增或编辑端口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vRZcLiAt-1653723132480)(docker学习笔记.assets/新增或编辑端口.png)]
-
容器加速的配置
4.1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-41GY0b52-1653723132482)(docker学习笔记.assets/容器加速的配置地方1.png)]
4.2
![容器加速的配置地方2](docker学习笔记.assets/容器加速的配置地方2.png)
查看环境
# 系统内核是3.10以上
[admin@localhost /]$ uname -r
2.6.32-642.el6.x86_64
# 系统版本
[root@localhost ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="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、设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/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
# 4、安装docker docker-ce 社区 ee 企业版
yum install docker-ce docker-ce-cli containerd.io
# 5、启动docker
systemctl start docker
# 6、使用docker version
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ch7LwrtB-1653723132483)(docker学习笔记.assets/image-20220525224110730.png)]
# 7.测试hello -world
docker run hello-world
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x1gpPIAB-1653723132484)(docker学习笔记.assets/image-20220525224726471.png)]
# 8、查看一下下载的这个hello-world镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 8 months ago 13.3kB
了解:卸载docker
# 1、卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2、删除资源(要谨慎)
rm -rf /var/lib/docker
# /var/lib/docker docker的默认工作路径!
1、登录阿里云找到容器服务,并找到镜像加速地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uFbBTr3u-1653723132485)(docker学习笔记.assets/image-20220525230908378.png)]
2、配置使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://l9bydpdt.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
回顾Hello-World执行流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BJoIC9J5-1653723132486)(docker学习笔记.assets/image-20220525224726471.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gbI2MMK2-1653723132487)(docker学习笔记.assets/image-20220525231634938.png)]
Docker底层原理
Docker是什么工作原理
Docker是一个Client - Server结构的系统,Docker的守护进行运行在主机上。通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VbXDQRZW-1653723132488)(docker学习笔记.assets/image-20220525232000844.png)]
备注:Linux守护进程
守护进程是一个在后台运行并且不受任何终端控制的进程。Unix操作系统有很多典型的守护进程(其数目根据需要或20—50不等),它们在后台运行,执行不同的管理任务。
用户使守护进程独立于所有终端是因为,在守护进程从一个终端启动的情况下,这同一个终端可能被其他的用户使用。例如,用户从一个终端启动守护进程后退出,然后另外一个人也登录到这个终端。用户不希望后者在使用该终端的过程中,接收到守护进程的任何错误信息。同样,由终端键人的任何信号(例如中断信号)也不应该影响先前在该终端启动的任何守护进程的运行。虽然让服务器后台运行很容易(只要shell命令行以&结尾即可),但用户还应该做些工作,让程序本身能够自动进入后台,且不依赖于任何终端。
守护进程没有控制终端,因此当某些情况发生时,不管是一般的报告性信息,还是需由管理员处理的紧急信息,都需要以某种方式输出。Syslog 函数就是输出这些信息的标准方法,它把信息发送给 syslogd 守护进程。
Docker为什么比VM快?
1、Docker有着比虚拟机更少的抽象层。
2、Docker利用的是宿主的内核,vm需要Guest OS。
- 如果要在vm上面跑两个服务,就需要虚拟两个centos出来
- docker是直接在主机上安装docker engine服务,然后实例镜像,产生容器(每一个容器都是一个小的linux系统)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n3sKUE7J-1653723132489)(Docker学习笔记.assets/image-20220526160618393.png)]
所以说,新建一个容器的时候,docker不需要像虚拟机一样加载操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YtfuzT2B-1653723132490)(docker学习笔记.assets/image-20220525234936246.png)]
Docker的常用命令
帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令
镜像命令
docker images 查看所有本地主机的镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 8 months ago 13.3kB
# 解析
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
--all , -a # 列出所有镜像
--quiet , -q # 只显示镜像的id
docker search 查找镜像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9822 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3586 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 719 [OK]
# 可选项,通过过来搜索
--filter=STARS=3000 # 搜素出来的镜像就是STARS大于3000的
[root@yebin ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9822 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3586 [OK]
docker pull 下拉镜像
# 下载镜像,docker pull 镜像名[:tag]
[root@yebin ~]# docker pull mysql
Using default tag: latest # 如果不写tag,默认就是latest
latest: Pulling from library/mysql
bf5952930446: Pull complete # 分层下载,dockerimages的核心,联合文件系统
8254623a9871: Pull complete
938e3e06dac4: Pull complete
ea28ebf28884: Pull complete
f3cef38785c2: Pull complete
894f9792565a: Pull complete
1d8a57523420: Pull complete
6c676912929f: Pull complete
ff39fdb566b4: Pull complete
fff872988aba: Pull complete
4d34e365ae68: Pull complete
7886ee20621e: Pull complete
Digest: sha256:c358e72e100ab493a0304bda35e6f239db2ec8c9bb836d8a427ac34307d074ed # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# 等价于它
docker pull mysql
docker pull docker.io/library/mysql:latest
# 指定版本下载
[root@yebin ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
bf5952930446: Already exists
8254623a9871: Already exists
938e3e06dac4: Already exists
ea28ebf28884: Already exists
f3cef38785c2: Already exists
894f9792565a: Already exists
1d8a57523420: Already exists
5f09bf1d31c1: Pull complete
1b6ff254abe7: Pull complete
74310a0bf42d: Pull complete
d398726627fd: Pull complete
Digest: sha256:da58f943b94721d46e87d5de208dc07302a8b13e638cd1d24285d222376d6d84
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
# 查看本地镜像
[root@yebin ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 718a6da099d8 6 days ago 448MB
mysql latest 0d64f46acfd1 6 days ago 544MB
hello-world latest bf756fb1ae65 7 months ago 13.3kB
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-usiNU5fS-1653723132491)(docker学习笔记.assets/image-20220526000649735.png)]
docker rmi 删除镜像
[root@yebin ~]# docker rmi -f IMAGE ID # 删除指定镜像
[root@yebin ~]# docker rmi -f IMAGE ID1 IMAGE ID2 IMAGE ID3 # 删除多个镜像
[root@yebin ~]# docker rmi -f $(docker images -aq) # 删除所有镜像
容器命令
说明: 我们有了镜像才可创建容器,linux,下载一个centos镜像来测试学习
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name=“Name” 容器名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-p 随机指定端口
# 测试,启动并进入容器
[root@yebin ~]# docker run -it centos /bin/bash
[root@74e82b7980e7 /]