Docker的使用、底层原理及常用软件docker下载

1.Docker三要素

镜像、容器、仓库

2.Docker的是怎么工作的?

首先,Docker是一个Client-Server结构的系统。
1. Docker有一个守护进程,运行在主机服务端,通过Socket连接客户端。
2.我们在客户端(Client)上执行 docker run … 命令时,守护进程会接受客户端的run命令,并管理运行在主机服务端的容器。

3.Docker run 。。。的运行流程

1.Docker先在本机寻找该镜像,如果有,直接通过该镜像生成容器实例运行
2.如果本机没有该镜像,去/etc下的配置中的仓库地址中找该镜像,并下载到本地,以该镜像为模板生成容器实例运行。

4.Docker对比虚拟机的优势

1.虚拟机因为有一套完整的虚拟化资源,和win10操作系统之间还有一个Hypervisor接口,在启动时过慢,略显笨重,与虚拟化技术耦合度高
2.docker去掉了Hypervisor,不需要实现硬件虚拟化,运行在docker容器上的程序直接都是实际物理机的硬件资源,因此在cpu和内存利用率上docker更有优势。
3.docker不用加载操作系统,比虚拟机快,docker直接利用宿主机的操作系统,而虚拟机有一套自己的操作系统,每次启动时,虚拟机需要加载自己的操作系统,时间是分钟级别的,docker启动时不需要加载操作系统,所以是秒级。

5.Docker安装(centos7)

在centos7上安装docker
1.确定你是centos7以上版本

cat /etc/redhat-release

2.yum安装gcc相关

yum -y install gcc
yum -y install gcc-c++

3.卸载旧版本(以前没装就不需要)

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
如果不是root权限需要加sudo,是root不需要加

4.安装需要的软件包

sudo yum install -y yum-utils  device-mapper-persistent-data lvm2  //安装工具

5.配置镜像仓库

(以下二选一)
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    //从阿里云安装(推荐,速度快)

6.更新yum软件包索引(下载更快)

yum makecache fast

7.安装Docker CE社区版

yum -y install docker-ce

8.启动docker

systemctl start docker

9.测试docker

docker version
docker run hello-word

10 配置镜像加速(从阿里云或者网易云上下载镜像)
(1)建立文件夹
(2)编辑daemon.json,内容为:
在这里插入图片描述
(3)加载配置文件
(4)重启docker
在这里插入图片描述
11.卸载docker
在这里插入图片描述

6.Docker命令

1.帮助命令

docker version  / docker info           显示docker的版本,以及docker的容器、镜像等信息
docker --help                           docker的帮助命令,可以查询docker操作所需命令

2.镜像命令

(1)查找本地镜像

docker images  							列出本地主机镜像
docker images  	-a						列出本地所有镜像(包含中间映像层)
docker images  	-q						只显示镜像ID
docker images centos 					列出centos镜像

(2)搜索、拉取、删除镜像

docker search tomcat     				从Docker Hup上搜索tomcat镜像(并非阿里云)
docker pull tomcat 						从阿里云上拉tomcat镜像(如果配置了阿里云)不加:版本号默认是最新版
docker rmi -f tomcat                    删除tomcat本地镜像
docker rmi -f romcat nginx 				删除多个本地镜像
docker rmi -f $(docker images -qa)     删除全部本地镜像

(3)新建并启动容器(交互式/守护式容器)

-----交互式容器
docker run -it --name mycentos01  centos      	通过镜像centos创建并启动容器,并为容器命名为mycentos01  
docker run -it 【IMAGE_ID】    					通过镜像id创建并启动容器
两者区别: 有无名字   -i:以交互方式启动容器  -t:启动后弹出当前容器的伪终端

-----守护式容器
docker run -d centos
交互式、守护启动的区别:交互式终端会变成centos的伪终端,守护式只是返回一串字符,终端还是linux的

(4)显示docker中的正在运行的容器容器进程 ,等同于ps -ef

docker ps   					显示docker中所有运行中的容器进程
docker ps -a					是查看所有容器(包括停止的)
docker ps -l 					显示最近创建的一个容器
docker ps -n 32					显示最近创建的32个容器
docker ps -q 					(静默模式) 只显示容器编号
docker ps -lq  					显示最近创建的一个容器的容器编号

(5)退出容器

exit         					容器停止并退出
ctrl+P+Q  					 	容器不停止退出

容器不停止退出后,想要再进入怎么办?
docker attach 容器ID          	由linux终端又变成了容器伪终端
docker exec -it 容器ID ls -l /tmp   在linux终端操作容器内部信息,终端不变,不进入伪终端

exec比arrach功能强大,因为他可以在外边对容器进行操作!

(6)启动/重启 容器(容器已经建立,没建立的话用run)

docker start 【容器id或容器名】         启动容器
docker restart 【容器id或容器名】       重启容器

(7)停止容器/强制停止容器

docker stop【容器id/容器名】 					温柔停止
docker kill 【容器id/容器名】  					强制停止

(8)删除容器(与删除镜像的rmi 相差一个i)

docker rm 容器ID   							删除容器(只能删除已停止的容器)
docker rm -f 容器ID 						强制删除容器
docker rm -f  $(docker ps -a -q)   			一次性删除多个容器

(9)查看docker容器日志

docker logs -f --tail=100 容器id      			动态打印docker的100行log日志

(10)查看容器内运行状态监控(和linux的top一样)

docker top 容器id

(11)查看容器内部细节

docker  inspect 容器Id                  以json串的形式显示这个容器的所有细节

(12)把容器中的文件复制到宿主机里

docker cp 容器ID:/tmp/yum.log  /root   复制容器/tmp目录下的yum.log文件到linux的root目录下

(13)提交容器副本使之成为一个新的镜像

docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:版本
docker commit -m="del tomcat docs"  -a="zy"  容器ID  tomcat1:1.2

7、Docker镜像

docker镜像实际上是由一层层的文件系统组成,被称为文件联合系统UnionFS,
例如一个tomcat镜像,由很多东西层层包裹,在docker镜像的最底层是bootfs,这一层与典型的linux是一致的,包含boot加载器和内核。在bootfs之上,就是rootfs,包含的就是/dev、/proc、/bin等标准目录和文件,rootfs就是不同操作系统的发行版,如 Centos、Ubuntn等。如下图所示:
在这里插入图片描述

tomcat镜像400多MB,就是因为他由一层层的文件系统堆叠而成。
docker镜像(镜像层)只能读,当容器启动时,一个新的可写层被加载到镜像的顶部(容器层)。

为什么docker采用这种联合文件系统?
最大的一个好处就是:共享资源
比如:有多个镜像都从相同的base镜像构建而来,宿主机只需要保存一份base镜像,同时内存种也只需加载一份base镜像,就可以为所有的容器服务,而且镜像的每一层都会被共享。
体现:第一次下载镜像时,会很慢,第二次第三次就变快了,因为有base镜像被加载到内存中了

8.容器数据卷(相当于redis的RDB和AOF)

作用:
1.容器数据的持久化
2.容器间共享数据
操作:使用 -v 绑定linux主机目录与容器目录的数据通道

----启动普通容器
docker run -it 镜像名

----启动带数据卷的容器
docker run -it  -v /宿主机据对路径目录:/容器内目录 镜像名
docker run -it -v /mydate:/container centos  
解释:在主机的mydate目录和centos容器的container目录建立数据卷通道,共享数据
作用:无论从主机还是容器上修改绑定目录下的数据,另一边也会同步刷新,保证数据一致

----启动带权限的数据卷容器
docker run -it  -v /宿主机据对路径目录:/容器内目录:ro 镜像名
同上,不过加入了 ro :read only
作用:只能单方面主机修改更新数据,centos容器只可以查看,没有修改权限

容器和主机间存在数据共享,容器和容器间同样存在数据共享

容器间传递共享命令(--volumes -from)
docker run -it --name doc2 --volumes -from doc1 centos666(镜像名)  
doc1为父容器 , doc2为子容器
无论删除修改子容器/父容器,容器间数据改变的共享功能会一直持续下去,直到删除所有相关联的容器!!

9.DockerFile

构建镜像的方式有两种:一种是基于容器制作,另一种就是通过Dockerfile。Dockerfile其实就是我们用来构建Docker镜像的源码,当然这不是所谓的编程源码,而是一些命令的组合,只要理解它的逻辑和语法格式,就可以编写Dockerfile了。

简要概括Dockerfile的作用:它可以让用户个性化定制Docker镜像。因为工作环境中的需求各式各样,网络上的镜像很难满足实际的需求。
  
  构建容器数据卷一种可以通过 -v 命令来构建,出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法只能实现主机和虚拟机一对一的容器卷通道,如果要创建多个通道,可以通过DockerFile 命令构建多个数据卷通道
dockefile使用volume命令操作,构建多个容器卷通道,如下所示
在这里插入图片描述
8.1docker执行dockerfile的大致流程

1.docker从基础镜像运行一个容器
2.执行一条命令对容器做修改
3.执行类似docker commit操作提交一个新的镜像层
4.docker再基于刚提交的镜像运行一个新的容器
5.执行dockerfile的下一条指令直到所有指令都执行完成

8.2dockerfile、docker镜像、docker容器的区别

从应用软件角度来看
1.dockerfile是软件的原材料
2.docker镜像是软件的交付品
3.docker容器则认为是软件的运行状态
dockerfile面向开发,docker镜像成为交付标准,docker容器则涉及部署和运维,三者缺一不可,合力充当docker体系的基石

8.3 dockerfile各种保留字的解释

在这里插入图片描述
8.4 dockerfile构建镜像案例(以centos为例)
我们从阿里云上拉下来的centos镜像,是精简版,本身不带vim、ifconfig等命令,通过dockerfile的编写,可以构建一个具备这些命令的centos镜像!

步骤
1.编写dockerfile:

------自定义带 vim、ifconfig的dockerfile
FROM centos   //继承阿里云最基本的centos
MAINTAINER  zhb<1149513559@qq.com>     //作者信息

ENV MYPATH  /usr/local     
WORKDIR $MYPATH       //设置默认工作区为usr/local

RUN yum -y install vim    //安装vim编辑器
RUN yum -y install net-tools   //安装ifconfig

EXPOSE 80  	//向外暴露80端口
CMD /bin/bash  //容器启动时要运行的命令

2.构建镜像

docker build -f /mydocker/Dockerfile2 -t mycentos:1.3
build  							---构建镜像
-f   							---file 后边跟dickerfile路径
/mydocker/Dockerfile2   		---Dockerfile的完整路径
-t  							---tag 后边跟镜像的名字和版本
mycentos:1.3  					---新镜像的名字和版本号

执行构建后,可以看到一条条的命令执行完毕,构建mycentos1.3镜像成功!

3.通过镜像构建容器并运行

docker run -it mycentos:1.3

8.5 dockerfile中CMD和ENTRYPOINT的区别和联系
联系:都是指定一个容器启动时要运行的命令
区别:Dockerfile中可以有多个CMD指令,但只有一个生效,CMD会被dokcer run后边的参数替换
例如:

正确的tomcat启动方式
dcoker run -it -p 8888:8080 tomcat 
错误的tomcat启动方式
---tomcat 后边加了 ls -l会直接取代romcat的dockerfile中的启动命令,这样执行完发现tomcat并没有启动
dcoker run -it -p 8888:8080 tomcat ls -l  

ENTRYPOINT docker run 后的命令会传递给ENTRYPOINT,形成一个新的命令组合
8.6 自定义一个tomcat
1.编写dockerfile
在这里插入图片描述
在centos的基础上,增加了tomcat、jdk等,通过add或copy添加到容器中!

2.通过dockerfile构建build镜像

docker  build -t zhbtomcat9   //这里没有加-f的原因是:在当前dockerfile目录下执行命令可以不用加

3.通过镜像运行容器

在这里插入图片描述 -d:以守护模式运行tomcat
-v:建立数据卷,以后项目放在本机就会自动共享到容器

10.Docker的常用安装

在使用docker时,一般不会自定义安装tomcat这些,想用的话直接从阿里云上拉取即可使用,总体步骤:
1.搜索镜像
2.拉取镜像
3.查看镜像
4.启动镜像
5.停止容器
6.移除容器

9.1安装tomcat
在这里插入图片描述
9.2 安装mysql
拉取:docker pull mysql:5.6
运行容器:

docker run -p 3306:3306 --name gulimallmysql
-v /mydate/mysql/log:/var/log/mysql
-v /mydate/mysql/date:/var/lib/mysql
-v /mydate/mysql/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root
-d mysql:5.7

在这里插入图片描述
接下来就可以在容器中的mysql上新建表,插入数据。win10的数据库图形化工具也可以连接到虚拟机机的mysql,共享容器中的表数据

mysql数据备份
把容器中的数据备份到本地zzyy。。。。
在这里插入图片描述
9.3 安装redis
拉取:docker pull redis:3.2
运行容器:并启动redis服务

mkdir -p /mydate/redis/conf
touch -p /mydate/redis/conf/redis.conf

docker run -p 6379:6379 --name gulimallredis
-v /mydate/redis/date:/date
-v /mydate/redis/conf/redis.conf:/etc/redis/redis.conf
-d redis redis-server /etc/redis/redis.conf

在这里插入图片描述
连接redis服务

docker exec -it  redis的ID redis-cli

即可进入redis
此时redis的数据并不是持久化额的,也就是当重启redis后,redis中的数据哦都会丢失
需要在主机的redis.conf中使用aof持久化方式

appendonly yes

9.4 安装ElasticSearch:7.4.2

 //下载 elasticsearch 镜像
 docker pull elasticsearch:7.4.2
//下载 kibana 镜像
docker pull kibana:7.4.2

新建两个本地挂载文件

mkdir -p /mydata/elasticsearch/config   //新建本地config文件挂载es中的config文件
mkdir -p /mydata/elasticsearch/data	//新建本地data文件挂载es中的data文件
echo "http.host: 0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml  //允许外网访问es

启动容器
–name elasticsearch:启动容器命名为elasticsearch
9200:es端口号
9300:集群通信端口
-e “discovery.type=single-node”:以单节点模式启动
-e ES_JAVA_OPTS="-Xms64m -Xmx128m":限制es最大占用空间
-v。。。 : 挂在本地文件到容器中的es
-d elasticsearch:7.4.2 :后台启动elasticsearch:7.4.2容器

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \  
-e “discovery.type=single-node” \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2

查看日志(启动后本机访问可能出错)

docker logs elasticsearch 

出现 **java.nio.file.AccessDeniedException
发现是挂载在外部的文件,由于权限不足导致,如图
在这里插入图片描述
修改权限

 chmod -R 777 /mydata/elasticsearch/

在这里插入图片描述
重启容器即可访问

9.5 安装Kibana:7.4.2

docker run --name kibana -e ELASTICSEARCH_HOSTS=http://9.236.37.100:9200 -p 5601:5601 -d kibana:7.4.2

9.6 安装nginx:1.0

//这里可以直接 run (如果发现没有这个镜像,会自动下载镜像后再run 启动容器)
docker run -p 80:80 --name nginx -d nginx:1.10

以下为商城项目的操作(容器上边已启动)

进入 /mydata  ,创建nginx文件夹
mkdir  nginx

//把niginx容器的配置文件 复制到 本地的nginx中
docker container cp nginx:/etc/nginx .  (注意后边的 .)

//删除刚才启动的nginx容器

//重新启动带有挂载文件的nginx
docker  run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10


11. 提交镜像到阿里云远程仓库

1.先根据容器创建一个新的本地镜像

docker commit -a zhb -m “new centos" c15646548b87  mynewcentos
-a:  作者
-m  提交信息说明
后边跟容器id ,最后边跟新镜像的名字

2.将本地镜像提交到阿里云
在这里插入图片描述

12 真实项目应用

①停止项目容器:docker stop point
②构建镜像:docker build -t “point:v2020070203” .
③运行容器:docker run -it -d -p 8081:8081 --name point point:v2020070203

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker底层原理涉及到几个关键的概念和技术: 1. Linux容器Docker利用Linux容器(LXC)技术来实现虚拟化。Linux容器是一种轻量级的虚拟化技术,通过隔离进程、文件系统、网络等资源,使得应用程序能够在独立的运行环境中运行,而不会影响到宿主操作系统和其他容器。 2. 命名空间(Namespaces):Docker使用Linux内核的命名空间特性来实现容器之间的隔离。命名空间可以将全局资源(如进程、网络、文件系统)划分为独立的命名空间,让每个容器都有自己独立的视图,并且相互之间不会产生冲突。 3. 控制组(Control Groups):Docker利用Linux内核的控制组功能来限制和隔离容器的资源使用。控制组可以对CPU、内存、磁盘IO等资源进行限制和分配,确保容器在资源有限的情况下能够正常运行。 4. 镜像(Images):Docker使用镜像来创建和运行容器。镜像是一个只读的文件系统,包含了应用程序运行所需的所有文件和配置。通过镜像,我们可以快速复制和部署应用程序,并且镜像可以通过层级的方式进行管理和共享,提高了资源的利用效率。 5. 容器(Containers):容器是基于镜像创建的运行实例。每个容器都是相互隔离的运行环境,包含了独立的文件系统、进程空间、网络空间等。容器可以快速启动、停止和销毁,使得应用程序的部署和扩展变得更加灵活和高效。 总之,Docker底层原理就是利用Linux的虚拟化技术、命名空间、控制组等特性来实现容器的隔离和资源管理,通过镜像和容器的组合使用,实现了应用程序的快速部署和运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值