概念
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 nginx
rw 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即可
# 启动Docker
systemctl 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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 6126b4587b1b 3 days ago 519MB
hello-world latest feb5d9fea6a5 5 months ago 13.3kB
centos 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 # 强制停止当前容器