概念
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
可以把容器理解为一个简易的Linux系统
Docker为什么比虚拟机更快
docker利用宿主机内核,VM需要Guest OS
“宿主机就是主机”,这个概念是相对于子机而言的,比如你安装有虚拟机的话,那么相对于虚拟机而言,你正在使用的计算机就是宿主机,虚拟机是安装在主机上的,必须在主机上才能运行,主机就是一个“宿主”。

例如你的电脑上的Windows系统就是作为Host OS,如果在你的电脑设备上拓展出一些虚拟机,并在虚拟机上安裝了 Windows XP,那么Windows XP 就叫做 Guest OS。
Docker镜像
1.镜像是什么?
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件
(1)UnionFS(联合文件系统)
UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Dokcer镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统加载起来,这样最终的文件系统会包含所有的底层文件和目录
(2)Docker镜像加载原理
docker的镜像实际上是由一层一层的文件系统构成,这种层级的文件系统UnionFS。
主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的linux/unix系统是一样的,包含boot加载器内核。当boot加载完之后整个内核就都在内存中了,此时内存的使用权已经由bootfs交给内核了,此时系统也会卸载bootfs
平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M
centos大小231MB
对以一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就行,因为底层直接用host和kernel,自己只需要提供rootfs就行。由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
(3)分层的镜像
以pull为例,在下载的过程中我么可以看到docker的镜像好像是在一层一层的下载
(4)为什么Docker镜像要采用这种分层的结构
最大一个好处就是——共享资源
比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也需要加载一份base镜像,就可以为所有服务器服务了。而且镜像的每一层都可以被共享。
第一层已经存在了,所以不需要下载啦
2.docker镜像特点
docker镜像都是只读的
当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下都叫“镜像层”,我们操作在容器层
容器数据卷
使用数据卷
方式一:直接使用命令挂载 -v
# 本质就是同一个文件,映射过来,即修改容器内的文件不需要进入容器内部修改docker run -it -v /home/ceshi:/home centos /bin/bash # docker地址:Linux地址

方式二:匿名挂载
# 卷挂载只写容器里面的路径,不写容器外的路径docker run -d -P --name nginx01 -v /etc/nginx nginx # -P 随机指定端口
方式三:具名挂载
# 通过具名挂载可以方便的找到一个卷docker run -d --name nginx03 -v junit-nginx:/etc/nginx nginx
区分挂载方式:
-v 容器内路径 #匿名挂载-v 卷名:容器内路径 #具名挂载-v /宿主内路径:容器内路径 #指定路径挂载
卷的读写权限:
-v 容器内路径:ro rw 改变读写的权限
ro readonly # 表示只读docker run -d -p 8080:80 --name nginx -v jundas-nginx:/etc/nginx:ro nginxrw readwrite #可读可写docker run -d -p 8080:80 --name nginx -v jundas-nginx:/etc/nginx:rw nginx
DockerFile
安装
官方文档地址:
# 卸载旧版本yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 安装yum-utils包(提供yum-config-manager实用程序)并设置稳定的存储库yum install -y yum-utils# 设置镜像仓库yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 更新yum索引,可以提升yum安装的速度yum makecache fast# 安装Docker引擎 docker-ce 社区版yum install docker-ce docker-ce-cli containerd.io# 如果出现Is this ok [y/N]: 按Y即可
# 启动Dockersystemctl start docker# 开机自启动systemctl enable docker
docker run -p 3306:3306 --name mysql \-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

检查Docker是否安装成功,类似于Java -version
# 通过运行hello world映像,验证Docker引擎是否已正确安装docker run hello-world

运行Hello-world
docker images

hello-world镜像
Docker安装_Nginx
dockerHub地址:[https://hub.docker.com//nginx](https://hub.docker.com/_/nginx)
端口暴露概念
就像去访问朋友一样,云服务器防火墙(阿里云叫安全组)就像门口保安一样,确认你的身份之后可以进去,Linux 就好比小区一样,Linux 防火墙就是单元门,而你此行的目的就是要访问 Docker 里的 Nginx ,按照朋友提供的“地址”:-p:8888:80 ,最后找到朋友家的地址,Nginx 防火墙是住户门,敲门,确认身份了,进屋。
解释 -p:8888:80
可视化面板安装_Portainer
portainer新版本更新到portainer-ce
# 拉取镜像docker pull portainer/portainer-ce# 运行镜像docker run -d -it --name portainer -p 8000:9000 -v /var/run/docker.sock:/var/run/docker.sock --restart=always portainer/portainer-ce

Docker命令
常用命令官方文档地址:
常用命令
# 查看docker帮助文档docker --help# 查看docker概要信息docker info# 查看docker状态systemctl status docker
镜像命令
-a, --all # 显示所有图像(默认情况下隐藏中间图像)--digests # 显示摘要-f, --filter filter # 根据输出条件提供--format string # 使用Go模板漂亮地打印图像--no-trunc # 不截断输出-q, --quiet # 仅显示图像ID
search XXX # 搜索相关镜像,例如MySQL、Tomcat。。。########################################################################-f, --filter filter # 根据提供的条件过滤输出--format string # 使用Go模板进行漂亮的打印搜索--limit int # 最大搜索结果数(默认值25)--no-trunc # 不截断输出########################################################################--filter=STARS=3000 # 搜索出来的镜像stars大于3000,类似于Github上的stars
docker pull:指定版本号 # docker pull:5.7 指定下载5.7,不写默认下载最新版本########################################################################-a, --all-tags # 下载存储库中所有标记的图像--disable-content-trust # 跳过图像验证(默认为true)--platform string # 如果服务器支持多平台,则设置平台-q, --quiet # 抑制详细输出
-f, --force # 强制删除图像--no-prune # 不要删除未标记的父项########################################################################docker rmi -f IMAGE ID # 指定ID删除镜像docker rmi -f IMAGE ID IMAGE ID IMAGE ID # 删除多个镜像,之间用空隔隔开docker rmi -f mysql:latest # 按照镜像名称和版本号删除
容器命令
docker run image # 运行镜像########################################################################--name # 为容器指定名称--detach ,-d # 在后台运行容器并打印容器ID--interactive ,-i # 即使未连接STDIN也应保持打开状态(即后台运行)--it # 使用交互式运行,例如与cmd交互--publish ,-p # 指定容器端口,例如8080:8080--publish-all ,-P # 随机指定端口
测试:
[root@VM-8-5-centos ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmysql latest 6126b4587b1b 3 days ago 519MBhello-world latest feb5d9fea6a5 5 months ago 13.3kBcentos latest 5d0da3dc9764 5 months ago 231MB[root@VM-8-5-centos ~]# docker run -it centos /bin/bash[root@8b8cfcf03592 /]#
查看运行的容器:
--all ,-a # 显示所有容器(正在运行+历史运行)--latest ,-i # 显示最新创建的容器(包括所有状态)--quiet ,-q # 仅显示容器ID
退出容器:
exit # 退出容器并关闭Ctrl + P + Q # 不关闭且退出
启动和停止容器:
docker start ID # 启动容器docker restart ID # 重启容器docker stop ID # 停止当前正在运行的容器docker kill ID # 强制停止当前容器


