Linux--Docker容器(最新)

安装Docker

安装指令

如下文档
https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcucLZbrn2d

注意因为docker也是一个服务,所以也要启动docker,也可以对Doceker进行开机自启动

配置加速器

仍然在上面文档内
在这里插入图片描述

Docker简介

名词解释

在这里插入图片描述
镜像,就是一个包,将应用本身以及应用运行所需要的环境都打包,形成了镜像
容器,镜像的实例,可以理解为镜像运行时所创建的一个隔离环境,容器之间互不干扰
也就是镜像是一个应用,容器是该应用的各个的运行时的隔离环境,可以理解为应用多开,每个容器都在运行同一个应用
(另一种较为好说法是,镜像就是一个类或者模板,而容器就是他们的实例,相当于实例化对象)
镜像仓库,官方会提供镜像仓库,可以理解为类库,里面有着许多应用的镜像,当然,国内大厂也维护了许多镜像仓库,我们上面因为使用的是阿里云的加速,所以就是阿里云的镜像仓库
Docker主机,运行Docker的虚拟机,也称为宿主机

作用

我们在进行团队开发时,如果遇到有人使用的开发工具的版本不一致,那么会造成许多麻烦,而Docker就保证了应用版本的绝对一致,因为只要是同一个镜像实例化出来的容器,那么就一定是同一个版本

运行思路如下所示:
先从仓库(本地或者云)找到需要的镜像并拉取到宿主机、
之后创建该镜像的容器,给容器命名,该容器就是一个实实在在的应用了

仓库配置

1、我们在安装完docker之后,就会有一个官方的公共仓库以及默认配置好了,所以,我们想要用docker安装一个应用时,可以先去dockerhub官方文档查看官方仓库是否有镜像,如果有,直接在电脑上进行拉取即可
2、我们对docker配置了加速之后,如上面我们配置了阿里云的加速,一旦配置了加速,阿里云就被设置为我们的另一个云仓库,我们可以从阿里云的仓库看看有没有我们想要的镜像,进行拉取
3、我们如果不想或者迫于安全考虑要更换云仓库,我们可以拿到仓库地址后,进行下图所示的配置更换或者添加仓库
在这里插入图片描述

run命令解读

在这里插入图片描述
-d:后台运行
–name 名称 :给容器起个名字
-p :对于-p选项,第一个是宿主机准备开放的端口号,第二个是容器的端口号,其中宿主机端口号可以自定义修改,而容器的端口号轻易不改
-e:设置环境变量,对于mysql来说,必须要设置的环境变量是数据库的密码,具体还有哪些环境变量可以设置可以去官网查阅:hub.docker(访问外网)
最后是指定的运行的镜像的名字

其中,对于p选项:端口映射,
我们可以通过宿主机的ip访问到宿主机,但是无法通过容器的端口访问到容器,所以,如果pc客户端想要访问到容器,可以将容器的端口映射到宿主机的某个端口,通过访问宿主机这个端口,就可以直接访问到容器的端口,也就访问到了容器,如上图

但是镜像完整应该带上版本号,如果不带会默认最新版本:
在这里插入图片描述

操作

常见命令

在这里插入图片描述
注意,这里介绍了一种将自己写的镜像给别人使用的方法:
即,将自己的镜像文件上传到镜像仓库(一般是公司的私服),之后同事就可以从镜像仓库拉取到他们的本地进行使用
案例:
在这里插入图片描述
1、搜索镜像,查看镜像名称,可以进入dockerhub官网进行查文档:
在这里插入图片描述
2、拉取镜像:
docker pull nginx

3、查看本地镜像列表:(确定是否拉取成功)
docker images
该命令会将本地宿主机所有已经下载的镜像展示出来

补充:4、镜像的保存和下载的一种方式:(可以用于自定义镜像在不同电脑之间的转移)
tip:如果忘了一个命令怎么写,可以使用–help 就会显示帮助文档:
在这里插入图片描述

在这里插入图片描述
将镜像文件保存到一个tar包内,之后可以将次tar包用U盘拷到另一台电脑并下载
在这里插入图片描述
在这里插入图片描述
拿到tar包之后,下载该包,就可以下载里面的镜像到本地仓库了

5、创建并运行容器(注意,每次run一次,就会创建新容器)
docker run -d --name nginx -p 80:80 nginx
(无环境变量,无需-e)
在这里插入图片描述
6、查看容器运行状态
docker ps(只能查看运行中的容器)
在这里插入图片描述
docker ps -a(查看所有容器,包括停止的容器)
在这里插入图片描述
7、停掉容器(相当于关闭应用)

在这里插入图片描述
注意,这里只是把容器停止,而不是删除容器,容器虽然被停止,但是还存在

8、运行容器(相当于运行应用)
在这里插入图片描述
9、查看日志
docker logs nginx
docker logs -f nginx(持续访问nginx日志)
在这里插入图片描述
当持续访问nginx日志时,会实时更新nginx的日志,
例如,我们通过pc端的浏览器访问虚拟机的开放映射的端口
在这里插入图片描述
可以进行访问,这条访问信息就会在控制台进行更新显示
注意,要想访问到虚拟机的本地ip的80端口(不写默认80),需要将虚拟机的防火墙关闭,或者开放80端口的防火墙

10、进入容器
docker exec -it nginx bsah(表示进入容器的命令行窗口)
在这里插入图片描述
之后就可以在这个界面,进行mysql的一些操作
在这里插入图片描述
首先登录,可以进入到mysql客户端
在这里插入图片描述
之后可以执行show databases

输入exit 就退出mysql客户端,到了当前容器命令行
再次输入exit,就退出容器,到了操作系统

11、删除容器
在这里插入图片描述
docker rm 容器名
(注意不是rmi rmi是用来删除镜像的)
我们不可以删除正在运行的容器,
第一种方法,将容器停掉,再去删除
第二种方法,强制删除。docker rm -f mysql

命令的别名

在这里插入图片描述
使用vi编辑器,进入到root账户下 ~/.bashrc目录,如下:
在这里插入图片描述
进来之后,alias 别名=‘原始名’
可以使用此方法,将图示第四个优化显示方法的命令,改为dps
https://b11et3un53m.feishu.cn/wiki/MWQIw4Zvhil0I5ktPHwcoqZdnec

数据卷

简介

在这里插入图片描述
宿主机中的目录(一般是固定的)与数据卷进行映射,而数据卷与容器中指定目录形成映射,从而也就是宿主机的目录与容器中的指定目录形成双向映射

向宿主机中的目录增删改查,那么映射到的容器的指定目录会实时同步

数据卷命令

在这里插入图片描述
小tip:使用–help可以直接显示出帮助文档
在这里插入图片描述

使用

在这里插入图片描述
在这里插入图片描述
先删除原有容器(因为要再创建一般,当然如果创建不同的容器,则不用再删除)
之后在run命令里,加一个-v 数据卷名字:容器内指定目录
(数据卷名字可以随意起)
在这里插入图片描述
创建完之后,可以通过docker volume inspect 数据卷名字
来查看宿主机的哪个目录与数据卷建立了链接,一般这个路径是固定的

可以通过宿主机的ip加上图片路径,访问到图片,具体原因:?
在这里插入图片描述

在这里插入图片描述

总结

数据卷 是容器层面的东西 创建容器时可以创建一个该容器挂载的数据卷,并设置该容器挂载的数据卷的名字 同时 设置这个新的数据卷与容器中某个目录挂载 每个容器都可以有自己的数据卷 之后宿主机系统会自动将这个数据卷挂载到宿主机某个位置(一般是在固定的文件夹内,可以使用“查看数据卷详情查看”)这样我们拿到宿主机的挂载目录 就可以完成宿主机与容器内数据同步映射,数据卷就是两者映射的桥梁

补充 查看容器详情 可以看该容器是否有数据卷挂载

本地目录挂载

问题发现

在这里插入图片描述
之前我们使用过docker volume inspect html ,表示查看数据卷的详情
现在不加volume 表示查看容器的详情
在这里插入图片描述
我们之前已经对容器nginx进行过挂载,所以显示没问题
在这里插入图片描述
但是我们之前没有对mysql挂载,他这里却显示挂载,说明系统自动进行了挂载,称为匿名挂载(有一些容器会进行自动挂载)
但是这种挂载的数据卷名字很复杂,并且当更新容器版本时,容易造成数据的丢失,所以要使用本地挂载对其进行解决

问题解决

在这里插入图片描述
当完成挂载之后,我们去宿主机查询data目录,里面会有容器的对应的文件内容
同时,修改宿主机的本地挂载目录,数据库的内容也会被更改

其中mysql容器的数据目录、配置文件目录、初始化脚本目录等等,都需要去官方文档查看

自定义镜像

简介

在这里插入图片描述
自定义镜像:将自己的本地应用以及运行应用的系统、运行环境、配置文件等一起打包,形成镜像
这里以java为例,构建一个java镜像的步骤,准备一个Linux环境,安装jdk以及配置jdk的环境变量,拷贝jar包(应用包),最后运行脚本的文件,也就是启动java应用的脚本

在这里插入图片描述
然而,一个java应用镜像并不是一个整个的包,而是每一步都有自己的包,然后对于每一步的包各自形成镜像,也就是每一步有自己的镜像,我们称之为层
一个应用镜像是由许多层的镜像组合而成的

这样做有几个优势:
1、我们对每一层有特殊处理后,就可以将这一层的内容打包备份,之后形成镜像,之后再使用时,无需从0开始,直接拉取这一层被特殊处理的包所形成的镜像即可
2、在安装某个镜像时,如果本地有某层的包形成的镜像,那么无需重复下载,直接拿过来使用,如下图:
在这里插入图片描述
但是我们无需自己构建镜像,我们只需要理清楚一个应用的镜像的结构,我们将每一层所需要的文件压缩包找到,给Dockerfile命令,该命令会帮助我们将一个包形成一个镜像,各个包形成的各个镜像,每个镜像合起来就是一个应用的完整镜像
也就是我们只需要操作压缩包,形成镜像的工作我们不用管,交给Dockerfile即可,

程序员--------------->包------------------------>镜像--------------------->组合成最终的镜像
由Dockerfile完成
接下来我们说说Dockerfile

Dockerfile语法

在这里插入图片描述
对于一个镜像,我们有基础镜像,也就是运行的系统(实际上是某个系统的函数库)、某个镜像运行所需要的环境、配置文件等压缩包形成的镜像,称为基础镜像

而每个镜像都会有运行入口,一般是程序启动的脚本与参数,称为入口

在基础镜像与入口之间,就是一个应用包了

这三部分构成了一个可以跨系统的完整的可运行的应用镜像了,之所以可以跨系统,是因为我们的镜像里以及包含了应用运行所需要的系统

在这里插入图片描述
以上是Dockerfile的指令,下面是一个demo
在这里插入图片描述
这是一个java应用的镜像的形成过程,然而,我们可以将这个指令文件的通用部分也进行打包,可以简化成如下图所示:
在这里插入图片描述
上图中,我们如果想再构建一个java应用,那么基础层就与之前配置的一模一样,这样重复配置,会浪费较多的时间
所以,我们可以直接将基础层(或者说基础镜像)也打包成一个镜像,

即,将许多零散的基础镜像集合成一个基础镜像,如上图红色箭头指向

这样,我们之后在自定义一个镜像时,只需要三步:
指定基础镜像集合
拷贝应用包(c++是exe文件,java是jar文件)
最后指定一个入口文件,也就是运行一个应用的脚本命令所组成的脚本文件

这样,这就是一个Dockerfile文本文件了

Dockerfile创建镜像命令

在这里插入图片描述
上面只是创建了一个指令文件,我们要依据这个文件进行镜像的创建

创建镜像命令是 docker build -t 镜像名:版本号 Dockerfile文件路径

其中,最后一个参数是Dockerfile文件所在的目录,也就是执行这条build命令时,所在的工作目录为起点的Dockerfile的路径
所以如果想向上图那样,直接用点的话,执行此命令时,就要切换到Dockerfile所在的目录,再执行build命令

而Dockerfile文件里面的路径,是以Dockerfile文件为起点的相对路径,如上图就表示jar包与Dockerfile文件在同一个文件夹里

具体操作:
在这里插入图片描述
首先先下载一下基础镜像,或者通过本地压缩包直接下载,如上图,load命令,就是在当前工作目录有jdk镜像的压缩包

dis检查当前本地有哪些镜像
在这里插入图片描述
之后切换到demo目录下运行命令,因为这里相对路径想要用点,
但是额外注意,如果只是路径,最终没有细化到文件名的话,Dockerfile文件的名字必须叫Dockerfile
在这里插入图片描述
创建完之后,dis查看,已经有了docker-demo镜像

在这里插入图片描述

容器互联

问题出现

在这里插入图片描述
使用inspect命令,可以查看一个容器的信息

在这里插入图片描述
可以看到mysql容器ip地址是172.17.0.3
在这里插入图片描述
这里再查看dd容器,也就是之前构建的java应用镜像的容器,ip是172.17.0.4、

可以看到两者ip相近,之所以会这样,是因为docker默认创建了一个网桥,所有docker容器都会与该网桥建立连接,所有容器都在一个虚拟网桥上,ip前两部分不会改变,只会改变之后的数字
在这里插入图片描述
在这里插入图片描述
我们使用exec命令,进入到dd容器中,然后使用ping,尝试连接mysql的ip,发现可以ping通,也就是可以通过互联网连接到mysql

这里也可以发现,同一个网桥上的容器,可以实现互联

但是,这样使用默认的方式是有弊端的,将来我们要在代码中配置连接,如果使用ip地址来配置,因为每个docker容器的ip是按照启动顺序来依次分配,所以mysql的ip不是固定的,代码中的配置的ip就会失效,所以要解决这个问题

问题解决(自定义网络)

在这里插入图片描述
自定义网络,就是创建一个新的网桥,或者说网卡,将想要保持互联的容器加入到该网桥,在这样一个新的网桥下,同样可以实现互联
同时,更重要的是,加入自定义网络之后,容器之间可以通过容器名直接ping通,无需知道ip地址,使用容器名就可以ping

1、我们先来创建一个新的网桥,命名heima
在这里插入图片描述
可以通过docker network ls
查看目前有哪些网桥,或者说网络
可以看到已经有了heima这个网桥

2、之后我们将容器连接到新网桥
同时查看容器mysql的信息
在这里插入图片描述
在这里插入图片描述
可以看到,已经有两个网桥并且有两个ip

3、同样的,我们将java某个应用镜像的容器dd加入到新网桥
在这里插入图片描述
当然,我们也可以在创建容器时,就将其加入到新网桥:
在这里插入图片描述
在-p后面加上 --network 网桥名
这样的话,他就只有新网桥,不会像上面mysql那样有:默认+新网桥
如下:
在这里插入图片描述
这样的话,dd就跟在默认网桥的容器无法连接了,因为不在同一网桥

但是可以访问到同处一个新网桥的mysql,并且可以通过容器名进行访问
在这里插入图片描述
之后,无论mysql的ip如何变化,由于我们是通过容器名进行互联,所以ip地址变化不会有任何影响

tips:
1、使用–help,会显示帮助文档
在这里插入图片描述

在这里插入图片描述
中括号是可选项,也可以不选

2、查看本机网卡
在这里插入图片描述
会显示出系统网卡以及docker的所有网桥

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值