Docker

Docker

Docker官网文档地址:https://docs.docker.com/

Docker hub https://registry.hub.docker.com/

Docker安装

Ubuntu20.04安装Docker

  1. 卸载老版本docker

     sudo apt-get remove docker docker-engine docker.io containerd runc
    
  2. 安装一些docker需要的包

    sudo apt-get update #更新操作
    sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    
  3. 设置docker镜像,默认国外,建议设置为国内

    #添加 Docke 的官方 GPG 密钥
     curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    
  4. 安装docker相关内容

    sudo apt-get update
     sudo apt-get install docker-ce docker-ce-cli containerd.io
     # ce社区版,ee企业版 
    
  5. 测试docker是否安装成功

    sudo docker run hello-world
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tLeMKYHA-1629430249366)(https://i.loli.net/2021/08/20/oNqPexWTb9urmkv.png)]

  6. 启动docker

    sudo systemctl start docker
    docker version
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7gwQ5cKL-1629430249369)(https://i.loli.net/2021/08/20/Y2wMKujCZ1l3AsH.png)]

  7. 查看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

1629254528962

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容器启动后,发现自己没有提供服务,就是没有程序

1629255530679

查看日志

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 宿主机端口 : 容器内部端口

1629257778076

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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

1629272888488

进入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,增加内存的限制()

1629274893903

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

现在内存就小了

1629275249837

使用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 阿里云要开启安全组

1629275861368

进入面板:平时不怎么用,测试玩玩

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]

启动之后:

1629276627494

分层理解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 

1629282066393

# 查看是否挂载成功 可以用docker inspect 查看系统信息docker inspect f3e50683fe65 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bfMNNV0Y-1629430249433)(https://i.loli.net/2021/08/20/Lk8WOzPlim7HG9u.png)]

# 测试是否数据真的可以同步# 1、停止容器# 2、宿主机上修改文件# 3、开启容器# 4、容器内的数据依旧是同步的

1629282672655

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ht2zd5cf-1629430249435)(https://i.loli.net/2021/08/20/I92Xrq8TzyRUw5Z.png)]

所以:nginx修改配置可以直接在服务器上修改,不用每次都进容器里进行修改

1629282947605

使用卷的好处:修改只需要在本地修改,容器内自动同步

实战:安装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)]

1629285460309

假设我们将容器删除

发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!

具名挂载和匿名挂载

# 匿名挂载-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 . 

1629333256816

# 启动我们自己的镜像docker run -it 38859301e20b /bin/bash

1629333488239

这个卷和外部一定有一个同步的目录!(匿名挂载

# 查看一下卷挂载的路径#测试一下刚才创建的文件是否同步出去了

1629333798820

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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

1629368265249

# 测试# 进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中查看是否存在

1629369034741

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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镜像的文件!命令参数脚本!

构建步骤:

  1. 编写一个dockerfile文件
  2. docker build 构建一个镜像
  3. docker run 运行镜像
  4. 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

1629371281465

# 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)]

1629371958900

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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# 发现列出了

1629373069302

实战:Tomcat镜像

1、准备镜像文件,tomcat压缩包和jdk压缩包

1629422596899

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 .

1629422793339

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)]

1629426265183

5、浏览阿里云

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AtkMYwpg-1629430249504)(https://i.loli.net/2021/08/20/EHnWwZCcJpXPsvz.png)]

#使用阿里云教程推送到阿里云镜像

参考官方文档

Docker小结

1629426474512

Docker 网络(铺垫 容器编排 集群部署!)

企业实战

Docker Compose

DockerSwarm

CI/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值