概念

Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
可以把容器理解为一个简易的Linux系统

Docker为什么比虚拟机更快

docker利用宿主机内核,VM需要Guest OS

“宿主机就是主机”,这个概念是相对于子机而言的,比如你安装有虚拟机的话,那么相对于虚拟机而言,你正在使用的计算机就是宿主机,虚拟机是安装在主机上的,必须在主机上才能运行,主机就是一个“宿主”。

image.png

例如你的电脑上的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
image.png
平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M
image.png
centos大小231MB
对以一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就行,因为底层直接用host和kernel,自己只需要提供rootfs就行。由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
(3)分层的镜像
以pull为例,在下载的过程中我么可以看到docker的镜像好像是在一层一层的下载
image.png

(4)为什么Docker镜像要采用这种分层的结构
最大一个好处就是——共享资源
比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也需要加载一份base镜像,就可以为所有服务器服务了。而且镜像的每一层都可以被共享。
image.png
第一层已经存在了,所以不需要下载啦

2.docker镜像特点

docker镜像都是只读的
当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下都叫“镜像层”,我们操作在容器层
image.png

容器数据卷

使用数据卷

方式一:直接使用命令挂载 -v

  1. # 本质就是同一个文件,映射过来,即修改容器内的文件不需要进入容器内部修改
  2. docker run -it -v /home/ceshi:/home centos /bin/bash # docker地址:Linux地址

image.png

方式二:匿名挂载

  1. # 卷挂载只写容器里面的路径,不写容器外的路径
  2. docker run -d -P --name nginx01 -v /etc/nginx nginx # -P 随机指定端口

方式三:具名挂载

  1. # 通过具名挂载可以方便的找到一个卷
  2. docker run -d --name nginx03 -v junit-nginx:/etc/nginx nginx

区分挂载方式:

  1. -v 容器内路径 #匿名挂载
  2. -v 卷名:容器内路径 #具名挂载
  3. -v /宿主内路径:容器内路径 #指定路径挂载

卷的读写权限:

-v 容器内路径:ro rw 改变读写的权限

  1. ro readonly # 表示只读
  2. docker run -d -p 8080:80 --name nginx -v jundas-nginx:/etc/nginx:ro nginx
  3. rw readwrite #可读可写
  4. docker run -d -p 8080:80 --name nginx -v jundas-nginx:/etc/nginx:rw nginx

DockerFile

安装

官方文档地址:

  1. # 卸载旧版本
  2. yum remove docker \
  3. docker-client \
  4. docker-client-latest \
  5. docker-common \
  6. docker-latest \
  7. docker-latest-logrotate \
  8. docker-logrotate \
  9. docker-engine
  10. # 安装yum-utils包(提供yum-config-manager实用程序)并设置稳定的存储库
  11. yum install -y yum-utils
  12. # 设置镜像仓库
  13. yum-config-manager \
  14. --add-repo \
  15. https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  16. # 更新yum索引,可以提升yum安装的速度
  17. yum makecache fast
  18. # 安装Docker引擎 docker-ce 社区版
  19. yum install docker-ce docker-ce-cli containerd.io
  20. # 如果出现Is this ok [y/N]: 按Y即可
  1. # 启动Docker
  2. systemctl start docker
  3. # 开机自启动
  4. systemctl enable docker
  1. docker run -p 3306:3306 --name mysql \
  2. -v /mydata/mysql/log:/var/log/mysql \
  3. -v /mydata/mysql/data:/var/lib/mysql \
  4. -v /mydata/mysql/conf:/etc/mysql \
  5. -e MYSQL_ROOT_PASSWORD=ROOT \
  6. -d mysql:5.7

image.png
检查Docker是否安装成功,类似于Java -version

  1. # 通过运行hello world映像,验证Docker引擎是否已正确安装
  2. docker run hello-world

1645881359(1).png
运行Hello-world

  1. docker images

image.png
hello-world镜像

Docker安装_Nginx

dockerHub地址:[https://hub.docker.com//nginx](https://hub.docker.com/_/nginx)

image.png
显示 Welcome to nginx!
image.png
公网访问

端口暴露概念

就像去访问朋友一样,云服务器防火墙(阿里云叫安全组)就像门口保安一样,确认你的身份之后可以进去,Linux 就好比小区一样,Linux 防火墙就是单元门,而你此行的目的就是要访问 Docker 里的 Nginx ,按照朋友提供的“地址”:-p:8888:80 ,最后找到朋友家的地址,Nginx 防火墙是住户门,敲门,确认身份了,进屋。
image.png
解释 -p:8888:80

可视化面板安装_Portainer

portainer新版本更新到portainer-ce

  1. # 拉取镜像
  2. docker pull portainer/portainer-ce
  3. # 运行镜像
  4. docker run -d -it --name portainer -p 8000:9000 -v /var/run/docker.sock:/var/run/docker.sock --restart=always portainer/portainer-ce

image.png

Docker命令

常用命令官方文档地址:

常用命令

  1. # 查看docker帮助文档
  2. docker --help
  3. # 查看docker概要信息
  4. docker info
  5. # 查看docker状态
  6. systemctl status docker

镜像命令

  1. -a, --all # 显示所有图像(默认情况下隐藏中间图像)
  2. --digests # 显示摘要
  3. -f, --filter filter # 根据输出条件提供
  4. --format string # 使用Go模板漂亮地打印图像
  5. --no-trunc # 不截断输出
  6. -q, --quiet # 仅显示图像ID
  1. search XXX # 搜索相关镜像,例如MySQL、Tomcat。。。
  2. ########################################################################
  3. -f, --filter filter # 根据提供的条件过滤输出
  4. --format string # 使用Go模板进行漂亮的打印搜索
  5. --limit int # 最大搜索结果数(默认值25)
  6. --no-trunc # 不截断输出
  7. ########################################################################
  8. --filter=STARS=3000 # 搜索出来的镜像stars大于3000,类似于Github上的stars
  1. docker pull:指定版本号 # docker pull:5.7 指定下载5.7,不写默认下载最新版本
  2. ########################################################################
  3. -a, --all-tags # 下载存储库中所有标记的图像
  4. --disable-content-trust # 跳过图像验证(默认为true)
  5. --platform string # 如果服务器支持多平台,则设置平台
  6. -q, --quiet # 抑制详细输出
  1. -f, --force # 强制删除图像
  2. --no-prune # 不要删除未标记的父项
  3. ########################################################################
  4. docker rmi -f IMAGE ID # 指定ID删除镜像
  5. docker rmi -f IMAGE ID IMAGE ID IMAGE ID # 删除多个镜像,之间用空隔隔开
  6. docker rmi -f mysql:latest # 按照镜像名称和版本号删除

容器命令

  1. docker run image # 运行镜像
  2. ########################################################################
  3. --name # 为容器指定名称
  4. --detach ,-d # 在后台运行容器并打印容器ID
  5. --interactive ,-i # 即使未连接STDIN也应保持打开状态(即后台运行)
  6. --it # 使用交互式运行,例如与cmd交互
  7. --publish ,-p # 指定容器端口,例如8080:8080
  8. --publish-all ,-P # 随机指定端口

测试:

  1. [root@VM-8-5-centos ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. mysql latest 6126b4587b1b 3 days ago 519MB
  4. hello-world latest feb5d9fea6a5 5 months ago 13.3kB
  5. centos latest 5d0da3dc9764 5 months ago 231MB
  6. [root@VM-8-5-centos ~]# docker run -it centos /bin/bash
  7. [root@8b8cfcf03592 /]#

查看运行的容器:

  1. --all ,-a # 显示所有容器(正在运行+历史运行)
  2. --latest ,-i # 显示最新创建的容器(包括所有状态)
  3. --quiet ,-q # 仅显示容器ID

退出容器:

  1. exit # 退出容器并关闭
  2. Ctrl + P + Q # 不关闭且退出

启动和停止容器:

  1. docker start ID # 启动容器
  2. docker restart ID # 重启容器
  3. docker stop ID # 停止当前正在运行的容器
  4. docker kill ID # 强制停止当前容器