Docker的概述
Docker为什么出现?
一款产品:开发—上线 两套环境!应用环境,应用配置!
开发 -------运维。问题:在我这可以运行,但是在你的电脑就不能运行了。或者版本更新就不能使用了。
开发即运维!!
环境配置十分麻烦,每一个机器都要部署环境(集群redis、ES、Hadoop)。费时费力的。
发布一个项目jar(Redis+mysql+jdk+ES),那么你发送一个jar过去,别人还需要去配置运行这个jar包所需要的环境,而且版本一旦稍有不同就可能会出错。
所以希望项目能够带上环境进行打包发布,而不是单纯的一个jar文件。===>Docker
之前在服务器配置一个应用环境Redis、Mysql、jdk、ES、Hadoop,配置超麻烦,不能跨平台。
Windows开发,发布到Linux。
传统:开发jar,运维来部署
现在:开发打包部署上线,一套流程做完。
比如现在开发了一个Android的应用上线了给别人用:
Java->apk->发布(应用商店)->张三使用apk->到商店下载安装即可
回到我们的开发项目流程
Java->jar(环境)->打包项目带上环境(镜像)->上传到docker仓库(类似上面的商店)->运维下载我们发布的镜像->直接运行即可!
Docker的思想来自于集装箱
同一个JRE->多个应用(可能会出现端口冲突)–>原来的项目是交叉的
隔离:Docker的核心思想,打包装箱,每个箱子都是互相隔离的,每个箱子有自己的环境,即使端口一样也不会冲突。
Docker通过隔离可以使得服务器利用到极致。只要有一点空间,docker就可以利用。
Docker能干嘛
传统的虚拟机技术缺点:
-
资源占用十分多
-
冗余步骤多
-
启动慢
容器技术
容器化技术不是虚拟的一个完整的系统,只要一个核心。
容器内部有自己的运行环境,每个 容器是隔离的,容器是建立在我们的虚拟机之上的,可以充分的使用我们的虚拟机资源。
比较docker和虚拟机的不同
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后再这个操作系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容上,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离的,每个容器内都有自己的文件系统,互不影响。
DevOps(开发、运维)
应用更快的交付和部署
传统的:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行。
更便捷的升级和扩缩容
使用了Docker之后,部署应用就和搭积木一样
项目打包为一个镜像,扩展为服务器A,直接把镜像下载到服务器B运行就可以使服务器A的工作量减少,到达负载均衡的目的。
更简单的系统运维
在容器化之后,我们的开发测试环境都是高度一致的。(底层的系统kernel是一样的)
更高效的计算资源利用
1核2G可以运行十几个tomcat
Docker是内核级别的虚拟化,可以在一个物理机上运行多个容器实例,服务器性能可以被压榨到极限。
Docker的基本组成
镜像(image)
docker镜像就好比一个模板,可以通过这个模板来创建容器服务,Tomcat镜像===>run---->tomcat1容器(提供服务器),通过这个镜像创建多个容器(最终服务运行或者项目运行就是在容器里面的)。镜像run起来就是容器了。
容器(container):
docker利用容器口域独立运行一个或者一组应用,通过镜像来创建
启动,停止,创建,删除,基本命令
目前可以理解为一个容器就是一个简易的Linux系统,就是有些基本的内容。
仓库(repository):
仓库就是存镜像的地方。
有公有仓库和私有仓库!(这个概念和git的相似)
Docker Hub(默认是国外的)
阿里云。。。。都有容器服务器(配置镜像加速!这里类似于maven)
所以应该docker的启动流程应该是这样的:client去启动一个镜像,而这个镜像要去仓库里面去获取,然后运行这个镜像来创建得到容器,我们实际上就是在跑这个容器。
安装docker
环境准备
- 需要会Linux基础
- centos8
- 使用远程终端软件来操作服务器(Xshell)
查看官方文档
网址:https://docs.docker.com/get-docker/
我们这里是需要安装在Linux上的。
# 1、卸载旧的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2、安装的需要的安装包
sudo yum install -y yum-utils
# 3、设置镜像仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #这个仓库地址默认是国外的,非常慢,我们不要这样设置,可以去找国内的加速镜像
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #使用阿里云的镜像来安装
#更新yum软件包索引
yum makecache
#4、安装docker相关的包
#安装最新版本的docker引擎 docker-ce 社区版 ee是企业版
sudo yum install docker-ce docker-ce-cli containerd.io
#我这里安装的时候出现这个问题:
Error:
Problem: package docker-ce-3:20.10.2-3.el7.x86_64 requires containerd.io >= 1.4.1, but none of the providers can be installed
- cannot install the best candidate for the job
- package containerd.io-1.4.3-3.1.el7.x86_64 is filtered out by modular filtering
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
#所以需要安装对应的io
sudo dnf install https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.4.3-3.1.el8.x86_64.rpm
#接着再重新执行安装命令
sudo yum install docker-ce docker-ce-cli containerd.io
#5、启动docker
systemctl start docker
#查看docker的版本,看看是否安装成功
docker version
#7、运行docker helloworld
docker run hello-world
因为我们没有这个hello-world镜像,所以它去仓库进行pull,拉取这个镜像
然后会返回一个签名,代表拉取完成了。
拉取完成之后就会运行起来了。
#8、查看这个下载的hello-world镜像
[root@iZwz96cj54lr4szndhzbezZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 12 months ago 13.3kB
卸载docker
#1、卸载依赖
sudo yum remove docker-ce docker-ce-cli containerd.io
#2、删除资源
sudo rm -rf /var/lib/docker
# docker的默认工作路径 /var/lib/docker
阿里云镜像加速
登录阿里云账号,进入控制台
配置使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://9eigil3c.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
回顾helloworld的执行流程
底层原理
docker是怎么工作的
Docker是一个client-server结构的系统,Docker的守护进程运行再主机上,通过socket从客户端访问。
DockerServer接受到client的指令,就会执行这个命令。
docker为什么比虚拟机要快
1、Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。
2、Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。
Docker容器 | 虚拟机(VM) | |
---|---|---|
操作系统 | 与宿主机共享OS | 宿主机OS上运行宿主机OS |
存储大小 | 镜像小,便于存储与传输 | 镜像庞大(vmdk等) |
运行性能 | 几乎无额外性能损失 | 操作系统额外的cpu、内存消耗 |
移植性 | 轻便、灵活、适用于Linux | 笨重、与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
关于Docker实现原理,简单总结如下
- 使用Namespaces实现了系统环境的隔离,Namespaces允许一个进程以及它的子进程从共享的宿主机内核资源(网络栈、进程列表、挂载点等)里获得一个仅自己可见的隔离区域,让同一个Namespace下的所有进程感知彼此变化,对外界进程一无所知,仿佛运行在一个独占的操作系统中;
- 使用CGroups限制这个环境的资源使用情况,比如一台16核32GB的机器上只让容器使用2核4GB。使用CGroups还可以为资源设置权重,计算使用量,操控任务(进程或线程)启停等;
- 使用镜像管理功能,利用Docker的镜像分层、写时复制、内容寻址、联合挂载技术实现了一套完整的容器文件系统及运行环境,再结合镜像仓库,镜像可以快速下载和共享,方便在多环境部署。
Docker常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器数量
docker 命令 --help #帮助命令
帮助文档地址:https://docs.docker.com/reference/
镜像命令
**docker images:**查看所有本地的主机上的镜像
[root@iZwz96cj54lr4szndhzbezZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 12 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源,也就是这个镜像在仓库里面的命名
TAG 镜像的标签,版本
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a, --all #列出所有的镜像
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet #只显示镜像的id
docker search搜素镜像
[root@iZwz96cj54lr4szndhzbezZ ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10380 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3848 [OK]
#可选项,通过收藏来过滤
--filter=stars=3000 搜素出来的镜像的stars就是大于3000的
[root@iZwz96cj54lr4szndhzbezZ ~]# docker search mysql --filter=stars=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10380 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3848 [OK]
docker pull下载镜像
[root@iZwz96cj54lr4szndhzbezZ ~]# docker pull mysql
Using default tag: latest #如果不写tag,默认就是lates
latest: Pulling from library/mysql
a076a628af6f: Pull complete #分层下载,docker image的核心 联合文件系统
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1a8c919e89bf: Pull complete
9f3cf4bd1a07: Pull complete
80539cea118d: Pull complete
201b3cad54ce: Pull complete
944ba37e1c06: Pull complete
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
#等价于
docker pull mysql
docker pull docker.io/library/mysql:latest
#指定版本下载
docker pull mysql:5.7
docker rmi删除镜像
docker rmi -f #删除所有的镜像
docker rmi -f id #根据镜像的id来删除镜像
docker rmi -f id1 id2 id3 #根据镜像的多个id来删除镜像
docker rmi -f $(docker images -aq) #删除所有的容器
容器命令
有了镜像才可以创建容器
下载一个centos的镜像
新建容器并启动
docker run [可选参数] image
#参数的说明
--name="name" #容器的名字 tomcat1 tomcat2 用来区分容器
-d #后台方式运行
-it #使用交互方式运行,进入容器查看内容
-p #指定容器端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P #随机指定端口
#启动并加入容器
[root@iZwz96cj54lr4szndhzbezZ ~]# docker run -it centos /bin/bash
[root@95ca66a1d3d2 /]# ls #查看容器内部的centos
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#从容器退出到主机
exit
列出所有的运行的容器
#docker ps命令
# 列出所有的正在运行的容器
-a #列出当前正在运行的容器+历史运行过的容器
-n=?