这里写目录标题
安装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的所有网桥