Docker基础(容器数据卷前)

Docker安装


Docker的基本组成

在这里插入图片描述

Docker镜像(image)

Docker镜像就好比一个模板,可以通过这个模板来创建容器服务 tomcat镜像 —> run —> tomcat01容器(提供服务器),通过镜像可创建多个容器(最终项目运行在容器中)

Docker容器(container)

Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的

容器启动、停止、删除

Docker仓库(repository)

仓库就是存放镜像的地方

仓库分为公有仓库和私有仓库

Docker安装与卸载

前言

在新主机首次安装 Docker 之前,需要设置 Docker 仓库,之后,您可以从仓库安装和更新 Docker,设置仓库,需要安装所需的软件包。yum-utils 提供了 yum-config-manager

yum

Yellow dog Updater, Modified(Yum),是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理工具。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。

yum-utils

utils是常用工具的意思
yum-utils是一个包。需要用yum来安装:yum install yum-utils

yum-config-manager

yum-config-manager是一个命令。包含在yum-utils这个包内。即安装yum-utils之后才能运行yum-config-manager命令。

安装

# 卸载旧版本
		yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
                  
#需要的安装包
        yum install -y yum-utils

#设置镜像仓库
        yum-config-manager \
            --add-repo \
            https://download.docker.com/linux/centos/docker-ce.repo  #默认是国外的,十分慢

            http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #阿里云的
            
#下载安装docker相关
		yum install docker-ce docker-ce-cli containerd.io
		
#启动docker
		systemctl start docker
		
#使用 docker version 查看是否安装成功
		docker version 
#Helloworld
		docker hello-world		#看到 Hello from Docker
		
		
#查看已下载的docker镜像
		docker images

卸载Docker

#卸载依赖
yum remove docker-ce docker-ce-cli containerd.io

#删除资源
rm -rf /var/lib/docker

配置阿里云镜像加速

在阿里云的产品与镜像服务中找到容器镜像服务,然后点击镜像加速器

在这里插入图片描述

#在/etc/docker下建立一个daemon.json,然后注册了阿里云镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://8su6p2zl.mirror.aliyuncs.com"]
}
EOF

#镜像重启 + docker重启
sudo systemctl daemon-reload
sudo systemctl restart docker

docker run hello-world流程

在这里插入图片描述

在这里插入图片描述

底层原理

Docker是怎么工作的?

Docker是一个 Client/Server 结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!

DockerServer 接收到 DockerClient 的指令,就会执行这个命令

在这里插入图片描述

Docker为什么比VM快?

  • Docker有着比虚拟机更少的抽象层
  • Docker利用的是宿主机的内核,VM需要的是Ghest OS
  • 新建一个容器,Docker不需要像VM一样重新加载一个OS内核,避免引导性操作
  • VM加载Ghest OS为分钟级别,而Docker是利用宿主机OS,省略了复杂的过程,秒级启动

在这里插入图片描述

Docker的常用命令


帮助命令

#显示docker的版本信息
docker version

#显示docker的系统信息,包括镜像与容器数量
docker info

#帮助命令
docker 命令 --help

官方帮助文档:https://docs.docker.com/reference/

镜像命令

查看所有本地主机上的镜像 docker images

[root@dinosaur /]# docker images
REPOSITORY          TAG                 IMAGE ID                    CREATED                      SIZE
hello-world         latest              bf756fb1ae65        	   9 months ago              	 13.3kB

#解释
REPOSITORY				仓库的镜像源
TAG					 	镜像的标签
IMAGE ID	       	 	镜像的ID
CREATE				    镜像的创建时间
SIEZ					镜像的大小

#可选项
  -a,  --all             出所有的镜像
  -q,  --quiet         	 只显示镜像的ID

搜索镜像 docker search

[root@dinosaur /]# docker search mysql
NAME                                 DESCRIPTION                                							         	STARS               				OFFICIAL            					AUTOMATED
mysql                                MySQL is a widely used, open-source relation…      10053                   [OK]                
mariadb                           MariaDB is a community-developed fork of MyS…   3684                   [OK]                
mysql/mysql-server    			 Optimized MySQL Server Docker images. Create…    735                                     			[OK]

#可选项,通过收藏数量来过滤
--fliter=STARTS=3000			搜索出来的镜像就是STARTS大于3000的

下载镜像 docker pull

#下载镜像	docker pull  镜像名[:tag]
[root@dinosaur /]# docker pull mysql
Using default tag:latest 	#如果不写tag,默认就是最新版本
latest: Pulling from library/mysql
bb79b6b2107f: Pull complete 	#分层下载,docker image 的核心
49e22f6fb9f7: Pull complete 
842b1255668c: Pull complete 
9f48d1f43000: Pull complete 
c693f0615bce: Pull complete 
8a621b9dbed2: Pull complete 
0807d32aef13: Pull complete 
9eb4355ba450: Pull complete 
6879faad3b6c: Pull complete 
164ef92f3887: Pull complete 
6e4a6e666228: Pull complete 
d45dea7731ad: Pull complete 
Digest: sha256:86b7c83e24c824163927db1016d5ab153a9a04358951be8b236171286e3289a4	#签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest	#真实地址    即 docker pull mysql 与 docker.io/library/mysql:latest	等价


#指定版本下载		
[root@dinosaur /]# docker pull mysql:5.7
bb79b6b2107f: Already exists 
49e22f6fb9f7: Already exists 
842b1255668c: Already exists 
9f48d1f43000: Already exists 
c693f0615bce: Already exists 
8a621b9dbed2: Already exists 
0807d32aef13: Already exists 
6d2fc69dfa35: Pull complete 
56153548dd2c: Pull complete 
3bb6ba940303: Pull complete 
3e1888da91a7: Pull complete 
Digest: sha256:b3dc8d10307ab7b9ca1a7981b1601a67e176408be618fc4216d137be37dae10b
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

删除镜像 docker rmi

[root@dinosaur /]# docker rmi -f 镜像ID		#删除指定的镜像
[root@dinosaur /]# docker rmi -f 镜像ID 镜像ID 镜像ID		#删除指定的多个镜像
[root@dinosaur /]# docker rmi -f $(docker images -aq)		#删除全部镜像

容器命令

说明:我们有了镜像才可以创建容器,下载一个 centos 镜像来测试学习

docker pull centos

新建容器并启动

docker run [可选参数] image

#参数说明
--name="Name"		#容器名字	eg:tomcat01		tomcat02
-d									#后台方式运行
-it									 #使用交互方式运行,进入容器查看内容
-p								    #指定容器的端口			-p 8080:8080
		-p	ip:主机端口:容器端口
		-p  主机端口:容器端口
		-p  容器端口
		容器端口
-P									 #随机指定端口

#测试:启动并进入容器
[root@iZm5e8bu6m70tacta2xvz9Z ~]# docker run -it centos /bin/bash
[root@683ca0574062 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@683ca0574062 /]# exit
exit

列出所有的运行的容器

#docker ps 命令
		   	    #列出当前正在运行的容器 
-a			 #列出当前正在运行的容器 + 历史运行过的容器
-n=?	  #显示最近创建的n个容器
-q		     #只显示容器的编号


[root@dinosaur ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@dinosaur ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
683ca0574062        centos              "/bin/bash"         5 minutes ago       Exited (0) 4 minutes ago                       nifty_dewdney
1ba49974e12b        bf756fb1ae65        "/hello"            14 hours ago        Exited (0) 14 hours ago                        sharp_zhukovsky

退出容器

exit	#容器停止并退出
ctrl + p + q	#容器不停止并退出

删除容器

docker rm 容器ID			#删除指定ID的容器,不能删除正在运行的容器
docker rm -f $(docker ps -sq)			#删除所有的容器
docker ps -a -q|xargs docker rm  	 #删除所有的容器

启动与停止容器

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

常用的其他命令

后台启动容器

#docker run -d 镜像名
[root@dinosaur ~]# docker run -d centos
7f800c985ad510df2e0173b98456c4190e2831a1ab485033758cf09b0e186a57

#问题:docker ps 发现centos停止了

#常见坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用就会自己停止
#nginx :容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志

docker logs -tf --tail 日志数 容器ID

查看容器中进程信息

docker top 容器ID

查看容器的元数据

[root@dinosaur ~]# docker inspect 容器ID

进入当前正在运行的容器

#我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
#命令:docker exec -it 容器ID /bin/bash			进入容器后开启一个新的终端(常用)

#方式2:docker	attach 容器ID				进入容器正在执行的终端,不会启动新的进程

从容器内拷贝文件到主机上

docker cp 容器ID:容器内路径	目的主机路径 

结尾

在这里插入图片描述

Docker镜像讲解


镜像是什么?

镜像是一种轻量级,可执行的独立软件包,用于打包软件运行环境和基于运行环境开发的软件。它包含运行整个软件所需要的所有内容,包括代码、运行时库、环境变量和配置文件

所有的应用,直接打包成Docker镜像,就可以直接跑起来

如何得到镜像?

  • 从远程仓库下载
  • 别人拷贝给你
  • 自己制作一个镜像:DockerFile

Docker镜像加载原理

base镜像

base 镜像含义

  • 不依赖其他镜像,从 scratch 构建
  • 其他镜像可以之为基础进行扩展

base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu, Debian, CentOS 等

Base镜像提供的是最小化的发行版本,且不同的Base镜像共用 kernel,各自有自己的rootfs

rootfs

内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉

用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录

对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了

而对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了

base 镜像提供的是最小安装的 Linux 发行版,不同 Linux 发行版的区别主要就是 rootfs

UnionFS(联合文件系统)

UnionFS(联合文件系统)是一种分层,轻量级,并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,它是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像

特征:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理

Docker镜像实际上由一层层的文件系统组成 — UnionFS

bootfs(boot file system)主要包含 bootloader 和 kernel,bootloader 主要是引导加载 kernel ,Linux 刚启动时候会加载 bootfs 系统,在 Docker 镜像的最底层是 bootfs。这一层与我们典型的 Linux/Unix 系统是一样的,包含boot加载器和内核,当加载完成之后整个内核就在内存中了,此时内存的使用权已从 bootfs 转交给内核,系统卸载 bootfs

rootfs(root file system),在 bootfs 之上,包含的就是典型 Linux 系统中的 /dev /prov /bin /etc 等标准目录和文件,rootfs 就是各种不同的操作系统的发行版,比如 Ubuntu、Centos等

在这里插入图片描述

平时我们安装虚拟机的 Centos 都是好几个 G ,为什么 Docker 这里才200多M?

对于一个精简的 OS ,rootfs 可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用 Host 的 kernel ,自己只需要提供 rootfs 就可以了。由此可见对于不同 Linux 的发行版, bootfs 基本是一致的,rootfs 会有差别,因此不同的发行版可以共用 bootfs

虚拟机分钟级别启动,容器则为秒级

分层理解

分层的镜像

我们去下载一个镜像,观察下面的日志输出可以看到是在一层一层的下载!

[root@dinosaur home]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
bb79b6b2107f: Pull complete 
1ed3521a5dcb: Pull complete 
5999b99cee8f: Pull complete 
f99a38f44786: Pull complete 
d6fc863042e2: Pull complete 
9bd1af4eae13: Pull complete 
Digest: sha256:33ca074e6019b451235735772a9c3e7216f014aae8eb0580d7e94834fe23efb3
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

为什么Docker 镜像要采用这种分层的结构呢?

最大的好处莫过于资源共享,比如有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需要在磁盘保留一份 base 镜像,同时内存中也只需要加载一份 base 镜像就可以为所有的容器服务了,而且镜像的每一层都可以被共享

查看镜像分层的方式可以通过 docker image inspect 命令 eg :docker image inspect redis

理解

所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就在当前镜像层上创建新的镜像层

举个例子:如果基于 Ubuntu Linux 16.04 创建一个新的镜像,这就是镜像的第一层,如果在该镜像中添加 python 包

就会在基础镜像层上创建第二个镜像层,如果继续添加一个安全补丁就是第三个镜像层

在这里插入图片描述

在添加额外镜像层的同时,镜像始终保持是当前所有镜像的组合

例子:下面图中每个镜像层包含三个文件,而镜像包含了来自于两个镜像层的六个文件

在这里插入图片描述

下图展示了一个三层镜像,在外部看来整个镜像只有六个文件,实际上文件七为文件五的更新版本

在这里插入图片描述

这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件,使得文件的版本更新作为一个新的镜像层添加到镜像中

特点

Docker镜像都是可读的,当容器启动时,一个新的可写层被加载到镜像的顶部

这一层就是我们通常说的容器层,其下的都叫镜像层

commit镜像

docker commit 		#提交镜像成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 镜像ID 目标镜像名:[TAG]

测试

#启动一个默认的tomcat
#发现这个默认的tomcat没有webapps应用,这是镜像的原因,官方的镜像默认webapps下没文件
#拷贝进去基本的文件

#将我们操作过的容器通过commit提交为一个新的镜像 我们以后就使用我们修改后的镜像即可!
[root@dinosaur home]# docker commit -a="dinosaur" -m="add webapps->app !" 6aa8e563dab6 tomcat02:1.0
sha256:f75fcdcb1ab32066104c1aed527db0b6937f9abe369f840776a32d65991ad2fe
[root@dinosaur home]# docker images
REPOSITORY          TAG                 IMAGE ID            		CREATED                  SIZE
tomcat02            1.0                  f75fcdcb1ab3       	 18 seconds ago      		 652MB
tomcat             latest               91fcd9c5b3a          	  2 days ago           	 	 647MB
centos             latest               0d120b6ccaa8        	  2 months ago        		 215MB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大恐龙的小弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值