Docker
Docker官网文档地址:https://docs.docker.com/
Docker hub https://registry.hub.docker.com/
Docker安装
Ubuntu20.04安装Docker
-
卸载老版本docker
sudo apt-get remove docker docker-engine docker.io containerd runc
-
安装一些docker需要的包
sudo apt-get update #更新操作 sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release
-
设置docker镜像,默认国外,建议设置为国内
#添加 Docke 的官方 GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
-
安装docker相关内容
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io # ce社区版,ee企业版
-
测试docker是否安装成功
sudo docker run hello-world
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tLeMKYHA-1629430249366)(https://i.loli.net/2021/08/20/oNqPexWTb9urmkv.png)]
-
启动docker
sudo systemctl start docker docker version
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7gwQ5cKL-1629430249369)(https://i.loli.net/2021/08/20/Y2wMKujCZ1l3AsH.png)]
-
查看docker镜像
docker images # Repository 仓库镜像源 # Tag 镜像标签 # Image Id 镜像id # Create 创建时间 # Size 镜像大小
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r1AtkttE-1629430249375)(https://i.loli.net/2021/08/20/7vMdDIVi1pBs6xa.png)]
Docker命令
要了解docker运行helloworld实例的过程
Docker镜像命令
docker images #查看所有本地的主机上的镜像
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs 显示镜像id
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3qGWaQ2o-1629430249378)(C:\Users\24704\AppData\Roaming\Typora\typora-user-images\1629253268503.png)]
docker search #搜索镜像,与DockerHub搜索结果差不多
-f, --filter filter Filter output based on conditions provided 过滤,比如要显示结果Star>=3000,则可以使用 docker search mysql --filter=stars=3000
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qvVxGam8-1629430249382)(https://i.loli.net/2021/08/20/1nzo3XxdeuNZHg7.png)]
docker pull mysql #从仓库中下载镜像 如果不写tag则下载为latest 核心:分层下载,下次下载不同版本只会下载不存在的数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tJIfUHIf-1629430249383)(https://i.loli.net/2021/08/20/ctGZ8V6Mdzn5jAT.png)]
docker rmi 镜像id #删除镜像 删除多个时,中间空格; docker rmi -f $(docker images -aq) # 递归删除全部镜像
Docker容器命令
docker pull centos # 我们要先下载镜像才可以创建容器,下载一个centos学习docker run [可选参数] ImageID --name string =' ' Assign a name to the container 容器名字,比如tomcat01 tomcat02 区分不同容器 -d, --detach Run container in background and print container ID 后台方式运行容器 -it, --interactive 交互模式运行docker -p 指定容器端口 比如 8080
docker ps [可选参数] # 列出所有当前运行中的容器 -a, --all Show all containers (default shows just running)列出当前运行+历史运行 -n, --last int Show n last created containers (includes all states) (default -1) 列出最近创建容器 -q, --quiet Only display container IDs 只显示容器id
exit 退出容器,直接停止并退出crtl+P+Q 容器不停止,退出
docker rm 容器id 删除容器 -f, --force Force the removal of a running container (uses SIGKILL)
启动和停止容器的操作
docker start 容器id # 启动容器docker restart 容器id # 重启容器docker stop 容器id # 停止当前容器docker kill 容器id # 强制停止当前容器
Docker常用其他命令
后台启动容器
docker run -d 镜像名# 问题:docker ps centos停止运行了# 这是常见的坑:docker容器使用后台运行,就必须要有前台进程,docker发现没有应用,就会停止。nginx容器启动后,发现自己没有提供服务,就是没有程序
查看日志
docker logs #查看日志# shell命令 docker run -d centos /bin/sh -c "while true;do echo helloworld; sleep 1; done;"# docker logs -tf --tail 10 容器id
查看容器中进程信息
docker top 容器idtop 命令
查看镜像元数据
docker inspect 容器id
进入当前正在运行的容器
# 我们通常容器都是使用后台方式运行的,需要进入容器修改一些配置docker exec -it 容器id bashShell #方式1docker attach 容器id #方式2:这个会执行当前运行终端两者区别: docker exec 进入容器后开启一个新的终端,可以在里面操作(常用) docker attach 进入正在执行的终端,不会开启新的进程
从容器内拷贝文件到主机上
docker cp 容器id:容器内的路径 目的主机路径# 拷贝是一个手动过程,后期可以用卷实现自动拷贝
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AweEaE72-1629430249388)(https://i.loli.net/2021/08/20/MxcphtkFjZLI2TJ.png)]
案例学习
安装nginx
第一步,搜索nginx镜像,建议网站上搜索 docker search nginx
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-83toI6NH-1629430249389)(https://i.loli.net/2021/08/20/BYHknSmuiW7ZMA6.png)]
第二步,下载镜像 docker pull nginx
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-abSaqKAx-1629430249392)(https://i.loli.net/2021/08/20/SW6Gwqd95bDzE3t.png)]
第三步,启动nginx 公网端口映射到80端口,运行测试
-d 后台运行
–name 给容器命名
-p 宿主机端口 : 容器内部端口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5HLPrGnQ-1629430249394)(https://i.loli.net/2021/08/20/QeOS2TKZLj1Nd3x.png)]
端口暴露概念:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sO8YJhsD-1629430249395)(https://i.loli.net/2021/08/20/Dy5NgUjqPQVCht8.png)]
第四步,测试成功后,进入容器
docker exec -it nginx01 /bin/bashwhere is nginx====>/usr/lib/nginx/ /etc/nginx/ /usr/share/nginxcd /etc/nginxls这里有nginx配置文件,html在share目录下
思考问题:
每次改动nginx配置文件,都要进入容器内部?十分麻烦,我要可以在容器外部提供提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改? -V 数据卷
安装tomcat
#官方的使用docker run -it --rm tomcat:9.0#我们之前启动都是后台,停止容器之后,容器还是可以看到,docker run -it --rm 一般用来测试,用完就删除
下载好已经在运行了,我们退出使用docker -ps 发现镜像不在了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3vaJX2d-1629430249397)(https://i.loli.net/2021/08/20/8VOnsuvAkEIyjow.png)]
前期不建议使用官方的用法,建议先下载再使用
# 搜索tomcatdocker search tomcat# 下载tomcatdocker pull tomcat # 不使用tag直接下载最新版本tomcat latest# 使用tomcatdocker run -d -p 3355:8080 --name tomcat01 tomcat# 本机测试tomcat 外网是可以访问的,但是因为docker的tomcat是阉割版的。 localhost:3355
进入tomcat容器:
# 测试访问之后没有问题,进入容器 root@dl-group-3620:/home/wx# docker exec -it tomcat01 /bin/bash# 发现问题, 1、linux命令少了(连ll命令都没有);2、没有webapps(webapps目录为空) 阿里云镜像的原因,默认是最小的镜像,所有不必要的都剔除了。#保证最小可以运行的环境! 可以web.dist 改名或者复制到webapps目录下,然后再运行tomcat就可以了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PFh2H7Mf-1629430249399)(https://i.loli.net/2021/08/20/w9d26GWEZ1nkDMb.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sblqJpA4-1629430249401)(https://i.loli.net/2021/08/20/tN3CTMIuVFKqzdr.png)]
思考问题:
我们以后要布署项目,如果每次都要进入容器是十分麻烦的,我要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了!
docker 容器 tomcat+网站
布署es+kibana
# es暴露端口很多# es非常耗内存# es的数据一般需要放置到安全目录!挂载
# 下载和启动es --net somenetwork docker网络配置,先不使用docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag# 启动了es 发现很卡,连敲命令都卡,怎么解决# docker states 查看cpu状态# es十分耗内存,1.xG# 停止整个docker或者整个服务器# 查看cpu状态 docker stats# 测试一下es是否成功# 赶紧关闭es,增加内存的限制()
root@dl-group-3620:/home/wx# curl localhost:9200
{
“name” : “6c54d1ff38cb”,
“cluster_name” : “docker-cluster”,
“cluster_uuid” : “uUcf_MRfRLa_N-tdYpD2Fg”,
“version” : {
“number” : “7.14.0”,
“build_flavor” : “default”,
“build_type” : “docker”,
“build_hash” : “dd5a0a2acaa2045ff9624f3729fc8a6f40835aa1”,
“build_date” : “2021-07-29T20:49:32.864135063Z”,
“build_snapshot” : false,
“lucene_version” : “8.9.0”,
“minimum_wire_compatibility_version” : “6.8.0”,
“minimum_index_compatibility_version” : “6.0.0-beta1”
},
“tagline” : “You Know, for Search”
}
8G内存用了一半,因此要加内存限制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E7MuaHoi-1629430249403)(https://i.loli.net/2021/08/20/wOofl6WIDc9zebM.png)]
增加内存的限制,修改配置文件 -e 环境配置修改
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.14.0
现在内存就小了
使用kibana连接es,网络如何才能连接过去
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-thfWZah0-1629430249406)(https://i.loli.net/2021/08/20/4CdeLPKrqX7xtI9.png)]
可视化
-
portainer(先用这个)
-
Rancher(CI/CD再用)
什么是portainer?
Docker图像化界面管理工具!提供要给后台面板供我们操作!
docker run -d -p 8080:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试:外网8080 阿里云要开启安全组
进入面板:平时不怎么用,测试玩玩
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SwXNNb1w-1629430249409)(https://i.loli.net/2021/08/20/Z4obzFLi7X3sPf6.png)]
Docker镜像讲解
镜像是什么
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dlIxaG9U-1629430249410)(C:\Users\24704\AppData\Roaming\Typora\typora-user-images\1629276262346.png)]
怎么获取docker呢?
- docker仓库
- 朋友给你
- 自己制作一个镜像DockerFile
Docker镜像加载原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y3vRs9nJ-1629430249412)(https://i.loli.net/2021/08/20/BjXbZy2wslpqhTQ.png)]
我们下载的时候看到的一层层就是联合文件系统
联合文件系统
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-baoanAi3-1629430249413)(https://i.loli.net/2021/08/20/4fWslTRhYPBrdAK.png)]
Docker镜像加载原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nOtKqyC8-1629430249414)(https://i.loli.net/2021/08/20/6Z3jq8IA4bWlwNH.png)]
开始启动时:(黑屏-开机)直接到加载:公用的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SWHnNiQ4-1629430249416)(https://i.loli.net/2021/08/20/gpdh83mJIasE52z.png)]
启动之后:
分层理解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dHpBUxxj-1629430249418)(https://i.loli.net/2021/08/20/HB1lz5vM2mLY3NV.png)]
理解:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n0e2Naws-1629430249420)(https://i.loli.net/2021/08/20/4wXVqWGH6nPmfR2.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hAZxuGGA-1629430249421)(https://i.loli.net/2021/08/20/Esv5nAePcxfuQTh.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f6ZZTaQH-1629430249422)(https://i.loli.net/2021/08/20/zxAcGg6pv4DsR8y.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SoLkOvoq-1629430249424)(https://i.loli.net/2021/08/20/YSKzCedLAxg5ykj.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EgtxkUmb-1629430249426)(https://i.loli.net/2021/08/20/KlnUPC8ZauhIRbc.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SLwAQhsj-1629430249427)(https://i.loli.net/2021/08/20/crGOtezblH7Vs4d.png)]
如何提交一个自己的镜像
commit 镜像
docker commit 提交容器成为要给新的副本# 命令和git原理类似docker commit -m='提交的描述信息' -a=“作者” 容器id 目标镜像名[Tag]
实战测试
# 启动一个默认的tomcat# 发现这个默认的tomcat没有webapps应用,这是因为官方默认镜像的原因,默认情况下webapps文件夹下没有文件#自己拷贝进去了基本文件#将我们操作过得容器通过commit提交一个镜像,我们以后就使用我们修改过得镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JekXSTjD-1629430249429)(https://i.loli.net/2021/08/20/rqLEOtCHwUuxVWP.png)]
到了这里才算是入门docker
Docker数据卷
什么是容器数据卷
docker的理念回顾
将应用和化境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
Mysql,容器删了,删库跑路! 需求:MySql数据可以存在本地!
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术,目录的挂载,将我们容器内的目录,挂载到Linux上面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-USTPa5Sc-1629430249431)(https://i.loli.net/2021/08/20/4xpWCqFgRnzyhTS.png)]
总结一句话:容器的持久化和同步操作,容器间也是可以数据共享的!
使用数据卷
方式1:直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录 # 测试一下 在linux中home建一个测试目录名为ceshidocker run -d -p 3355:8080 -v /home/ceshi:/home 1845617df3f4
# 查看是否挂载成功 可以用docker inspect 查看系统信息docker inspect f3e50683fe65
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bfMNNV0Y-1629430249433)(https://i.loli.net/2021/08/20/Lk8WOzPlim7HG9u.png)]
# 测试是否数据真的可以同步# 1、停止容器# 2、宿主机上修改文件# 3、开启容器# 4、容器内的数据依旧是同步的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ht2zd5cf-1629430249435)(https://i.loli.net/2021/08/20/I92Xrq8TzyRUw5Z.png)]
所以:nginx修改配置可以直接在服务器上修改,不用每次都进容器里进行修改
使用卷的好处:修改只需要在本地修改,容器内自动同步
实战:安装MySQL
思考:MySQL的数据持久化问题,data
# 1、搜索镜像docker search mysql# 2、下载镜像docker pull mysql:5.7# 3、运行镜像,要做数据挂载,安装mysql时候,需要配置密码。dockerhub找mysql#mysql官方方法:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag#启动我们mysqldocker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name=mysql001 6c20ffa54f86-d 后台运行-p 端口映射-v 卷挂载-e 环境配置--name 容器名字
启动成功后,用我们本地mysql图像化软件连接服务器mysql
navicat—连接到服务器3310----3310和容器内3306映射 这个时候就可以连接上了
在本地测试常见一个数据库,查看一下我们的映射路径是ok的
连接成功:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cmv8AgV8-1629430249438)(https://i.loli.net/2021/08/20/zkmt8PVAFcyCj1Q.png)]
假设我们将容器删除
发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!
具名挂载和匿名挂载
# 匿名挂载-v 容器内路径!docker run -d -P(随机映射端口) --name nginx01 -v /etc/nginx nginx# docker run -d -P --name nginx001 -v /etc/nginx nginx# 查看所有的volume的情况docker volume lslocal 22785d32e6a9b7fc3526c440de6a0ead44a98e245db9a5b3dd9006bc11f36b00# 这里发现,这种就是匿名挂载,我们在-v只写了容器内路径,没有写容器外的路径# 再启动一个docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx #juming-nginx前没有/有的话就是绝对路径开始 local juming-nginx# 通过-v 卷名:容器内路径# 查看一下这个卷
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7XuQSGmR-1629430249441)(https://i.loli.net/2021/08/20/ilVJK6amW2dboTf.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5BYw8JqA-1629430249442)(C:\Users\24704\AppData\Roaming\Typora\typora-user-images\1629286490395.png)]
所有的docker容器内的卷,没有指定目录的情况下都在/var/lib/docker/volumes/xxxx/_data
下
docker的工作路径[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bteOBwWv-1629430249444)(C:\Users\24704\AppData\Roaming\Typora\typora-user-images\1629286729125.png)]
我们通过具名挂载可以方便的找到我们的一个卷,大多数在使用具名挂载
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载-v 容器内路径 #匿名挂载-v 卷名:容器内路径 #具名挂载-v /宿主机路径:容器内路径 # 指定路径挂载!
扩展:
# 通过-v 容器内路径 :ro rw 改变读写权限ro readonly # 只读rw readwrite # 可读可写# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx # ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内无法操作!
初识Dockerfile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!先体验一下!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个命令,每个命令都是一层!
# 创建一个dockerfile文件,名字可以随机,建议Dockerfile#文件中的内容,指令(大写)参数root@dl-group-3620:/home/wx# mkdir docker-test-volumeroot@dl-group-3620:/home/wx# cd docker-test-volume/root@dl-group-3620:/home/wx/docker-test-volume# pwd/home/wx/docker-test-volumeroot@dl-group-3620:/home/wx/docker-test-volume# vim dockerfile1 #写一个镜像#dockerfile1文件内容#FROM centosVOLUME ["volume01","volume02"]CMD echo "------end-----"CMD /bin/bash# docker build -f dockerfile1 -t stevedreamer/centos:1.0 .
# 启动我们自己的镜像docker run -it 38859301e20b /bin/bash
这个卷和外部一定有一个同步的目录!(匿名挂载)
# 查看一下卷挂载的路径#测试一下刚才创建的文件是否同步出去了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hU4jdVj0-1629430249450)(https://i.loli.net/2021/08/20/drIQTtwVkMnOpfH.png)]
这种方式我们未来用到很多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
数据卷容器
多个mysql同步数据!该如何同步
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DcLnvTvu-1629430249452)(https://i.loli.net/2021/08/20/U8qlSvDpaMwKfxb.png)]
# 启动3个容器,通过我们刚才自己的镜像启动
# 启动第一个容器docker run -it --name docker01 stevedreamer/centos:1.0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Rmm4AZm-1629430249453)(https://i.loli.net/2021/08/20/RXSPkujn91It6ZB.png)]
# 启动容器2docker run -it --name docker02 --volumes-from docker01 stevedreamer/centos:1.0
# 测试# 进docker01 容器 docker attach docker01的id# 进入volum01 创建一个docker01_create文件#在docker02中查看volum01下是否有刚刚创建的文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wJmSyCGC-1629430249457)(https://i.loli.net/2021/08/20/ot62iwuMayKHqez.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPQdpEhG-1629430249459)(https://i.loli.net/2021/08/20/4yJQMpB5PDCTidl.png)]
# 再创建一个docker03 docker run -it --name docker03 --volumes-from docker01 stevedreamer/centos:1.0# 进入volum01发现还是有刚docker01创建的文件# 测试docker03创建一个文件,查看docker01中volume01中查看是否存在
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oTlPrOGZ-1629430249462)(https://i.loli.net/2021/08/20/NgQOnrqPfmTWEs7.png)]
# 测试:可以删除docker01,查看docker02和docker03是否还可以访问这个文件# 测试依旧可以访问# 这是一种备份机制(容器之间的数据是相互拷贝的过程),而非共享机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kAFbCnw9-1629430249463)(https://i.loli.net/2021/08/20/LMb413gsZofJkwU.png)]
多个mysql实现数据共享
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kG1l5XMT-1629430249465)(https://i.loli.net/2021/08/20/ndaU6KSwWY9uGNm.png)]
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个 时候本地数据就不会丢失。
DockerFile
dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
- 编写一个dockerfile文件
- docker build 构建一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub 阿里云仓库 )
查看一下官方是怎么写的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F2xX0dVZ-1629430249466)(https://i.loli.net/2021/08/20/9Gbvwn57FrEHPTt.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cVGHdyKp-1629430249467)(https://i.loli.net/2021/08/20/L1uUjzAYg8Taf9d.png)]
FROM scratchADD centos-8-x86_64.tar.xz /LABEL org.label-schema.schema-version="1.0" org.label-schema.name="CentOS Base Image" org.label-schema.vendor="CentOS" org.label-schema.license="GPLv2" org.label-schema.build-date="20201204"CMD ["/bin/bash"]
很多官方镜像都是基础包,很多功能没有,我们通常会搭建自己的镜像!
官方既然后壳制作镜像,那我们也可以!
DockerFile构建过程
基础知识:
1、每个保留关键字(指令)都是必须是大写的字母
2、执行从上到下执行
3、#表示注释
4、每个指令都会创建一个新的镜像层,并提交
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-putBgZCZ-1629430249468)(https://i.loli.net/2021/08/20/qaO9WNHzMtlYU4g.png)]
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件是十分简单!
Docker镜像(springboot项目) 逐渐成为企业交付的标准,因此必须掌握。
步骤:开发,布署,运维
DockerFile:构建文件,定义了一切步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品,原来是jar war
Docker容器:容器就是镜像运行起来提供服务器
DockerFile的指令
以前的话我们都是用别人的,现在知道这些指令,我们自己写一个镜像
FROM #基础镜像,一切从这里构建MAINTAINER #镜像是谁写的,姓名——邮箱RUN #镜像构建的时候需要运行的命令ADD #步骤:tomcat镜像,这个tomcat压缩包,添加内容WORKDIR #镜像工作目录VOLUME #挂载的目录EXPOST #保留端口配置ls -a CMD #执行这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代ENTRYPOINT #执行这个容器启动的时候要运行的命令,可追加命令ONBUILD #当构建一个被继承DockerFie这个时候会运行ONBUILD的指令,触发指令COPY #类似ADD,将我们文件拷贝到镜像中ENV #构建的时候设置环境变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2DiWCeof-1629430249472)(https://i.loli.net/2021/08/20/P7hNRfelTmV3ycX.png)]
实战测试
DockerHub 99%的镜像都是从这个镜像过来的FROM scratch ,然后配置需要的软件和配置来进行的构建
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ekEuPvDf-1629430249474)(https://i.loli.net/2021/08/20/DepkESnqIYLvRMl.png)]
创建一个自己的Centos
# 1、编写dockerfile文件,文件内容如下FROM centosMAINTAINER stevedreamer<fanghuaye@email.ncu.edu.cn>ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vimRUN yum -y install net-tools EXPOSE 80CMD echo $MYPATHCMD echo "---end--=="CMD /bin/bash#2、通过这个文件构建镜像# 命令 docker build -f dockerfile文件路径 -t 镜像名(版本)docker build -f mydockerfile -t mycentos:0.1 .#3、测试运行ifconfig和vim命令都可运行了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VIjFL4FJ-1629430249477)(C:\Users\24704\AppData\Roaming\Typora\typora-user-images\1629371906584.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fwo9aefF-1629430249481)(https://i.loli.net/2021/08/20/gstampyj4hS6ZbG.png)]
我们可以列出本地镜像变更历史
docker history f163c8506854
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-71NLUm4I-1629430249483)(https://i.loli.net/2021/08/20/fNkojdRm52K6Ov4.png)]
我们平时拿到一个镜像可以研究一下它是怎么做的?
CMD和ENTRYPOINT的区别
测试CMD
# 编写dockerfile文件FROM centosCMD ["ls","-a"]#构建镜像docker build -f dockerfile-test-cmd -t cmdtest .#run运行 cmd命令生效 ls -a没问题docker run 683f53fc53b....dockerenvbindevetchomeliblib64lost+foundmediamnt# 测试,追加一个命令 -l ls -aldocker run 683f53fc53b -l # 想要是ls -aldocker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.ERRO[0003] error waiting for container: context canceled # cmd的情况下 -l 替换了CMD["ls","-a"]命令,-l不是命令,所以报错!
测试ENTRYPOINT
# 编写dockerfile文件FROM centosENTRYPOINT ["ls","-a"]#构建镜像docker build -f dockerfile-test-entrypoint -t entrypoint-test .#run运行 cmd命令生效 ls -a没问题docker run 7cc21cc49de6....dockerenvbindevetchomeliblib64lost+foundmediamnt# 测试,追加一个命令 -ldocker run 683f53fc53b -l # 想要是ls -al# 发现列出了
实战:Tomcat镜像
1、准备镜像文件,tomcat压缩包和jdk压缩包
2、编写Dockerfile文件,默认为Dockerfile
默认会找到他,其他命名用用-f查找
FROM centosMAINTAINER stevedreamer<fanghuaye@email.ncu.edu.cn>COPY readme.txt /usr/local/readme.txtADD jdk-8u301-linux-x64.tar.gz /usr/local/ADD apache-tomcat-9.0.52-src.tar.gz /usr/local/RUN yum -y install vimENV MYPATH /usr/localWORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_301ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-9.0.52-srcENV CATALINA_BASE /usr/local/apache-tomcat-9.0.52-srcENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /usr/local/apache-tomcat-9.0.52-src/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.52-src/bin/logs/catalina.out
3、构建镜像
docker build -t diytomcat .
4、测试运行镜像
docker run -d -p 9000:8080 --name stevetomcat -v /home/wx/tomcat/test:/usr/local/apache-tomcat-9.0.52-src/webapps/test -v /home/wx/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.52-src/bin/logs diytomcat
5、访问测试
6、发布项目,直接在本地挂载目录发布就可以(建一个WEB-INF)
webxml文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kU8FngfG-1629430249489)(https://i.loli.net/2021/08/20/X4TOV3wQSIPlAtj.png)]
jsp文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L3nw3O7G-1629430249491)(https://i.loli.net/2021/08/20/AkGZBRUnaJd2sIl.png)]
测试项目是否部署成功,可以访问就OK
以后开发步骤,需要掌握Dockerfile的编写,用docker镜像来发布运行
问题:tomcat构建不了
发布自己的镜像
DockerHub
1、注册DockerHub账号
2、确定这个账号可以使用
3、在我们的服务器上提交自己的镜像
root@dl-group-3620:/home/wx/tomcat# docker login --helpUsage: docker login [OPTIONS] [SERVER]Log in to a Docker registry.If no server is specified, the default is defined by the daemon.Options: -p, --password string Password --password-stdin Take the password from stdin -u, --username string Username
4、登录完毕后就可以提交镜像了,就是一步,docker push
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GcWFxeI9-1629430249492)(https://i.loli.net/2021/08/20/Hb3Uy4ZEox9VRA5.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-69WZOPZF-1629430249494)(C:\Users\24704\AppData\Roaming\Typora\typora-user-images\1629426151735.png)]
提交到阿里云镜像服务上
1、登录阿里云
2、找到容器镜像服务
3、创建命名空间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ZCKngBI-1629430249495)(C:\Users\24704\AppData\Roaming\Typora\typora-user-images\1629426249514.png)]
4、创建容器镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7VgHqDuj-1629430249500)(https://i.loli.net/2021/08/20/rXGBlR4iKuONFU5.png)]
5、浏览阿里云
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AtkMYwpg-1629430249504)(https://i.loli.net/2021/08/20/EHnWwZCcJpXPsvz.png)]
#使用阿里云教程推送到阿里云镜像
参考官方文档
Docker小结
Docker 网络(铺垫 容器编排 集群部署!)
企业实战
Docker Compose
DockerSwarm
CI/