隐藏知识1

容器数据卷:将容器数据与主机数据共享

DockerFile:自行编写,构建Docker镜像 。发布自己镜像

Docker网络

企业实战

Docker Compose

Dokcer Swarm

CI/CD Jenkins流水线!

什么是容器数据卷?

数据 不应该放在容器中,因为容器一旦删除,数据就会丢失! 数据卷就相当于数据可持久化

比如 Mysql容器删除了 数据就丢失了 这个时候就是需要容器数据卷,如何解决?

使用docker容器产生的数据 挂载在Linux主系统上。

能解决什么? 容器的持久化和同步操作,容器回见也是可以数据共享的!

使用数据卷

docker run it -v 主机目录:容器内目录

docker run -it -v /home/ceshi:/home centos /bin/bash

#查看当前容器状态
docker inspect 镜像容器

容器删除后 数据依旧保留

以后修改配置文件 就可以使用本地修改即可。

实战Mysql 数据文件挂载到宿主机

(建议去dockerHub看看)

docker run -d -p3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql --name mysql001 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

# -v 容器配置文件 指定同步到本地配置文件
# -v 容器数据数据 指定同步到本地的数据
# -e 配置环境 指定参数 密码123456 不配置mysql启动不了

即便容器停止、销毁,数据卷依旧停留在本地文件中!

# 找到容器的挂载情况,去Mounts 里面找
docker inspect 容器id

测试:

编写Dockerfile

FROM centos

Volume ["volume1","volume2"]

CMD echo "-end-"
CMD /bin/bash

通过一个脚本生成镜像

docker build -f Dockerfile kun/centos:1.0 .
# 格式 docker build -f 文件 -t 镜像名:版本号 .        注意 . 不能少!!!

镜像是一层一层的,脚本就是一个个命令,每个命令都是一层

注意:不加targ 就会默认找最新的,由于刚才是使用制定了targs 所以就必须加上,才算能启动

正常启动(我们自己镜像的文件夹 volume01 02 也都在了)

docker inspect mycentos
挂载成功!

只要使用 –volumes-from 名字或者容器id 就可以共享文件了

如果删除任意一个 共享文件夹会依旧存在

即 数据共享 不会随着容器删除而消失,只在最后一个使用该数据的容器删除后,才删除。

总结论:

容器之间配置信息传递,数据卷容器的生命周期一直持续到没有容器使用为止

但是数据卷同步到本地,不会随着容器删除而删除。

文件挂载

什么是挂载?

同步镜像文件到宿主机

挂载到哪里?

挂载到宿主机的
cd /var/lib/docker/volumes

具名、匿名、指定路径挂载

# 匿名挂载一个nginx
docker run -d -P --name nginx01 -v /etc/nginx nginx 

# 具名挂载一个nginx
docker run -d -P --name nginx02 -v Nginx02:/etc/nginx nginx

# 指定路径挂载一个nginx
docker run -d -P --name nginx03 -v /etc/localNginx:/etc/nginx/logs:rw nginx
# docker run -d -P --name nginx03 -v /etc/localNginx:/etc/nginx:rw nginx 此命令无法启动,虽然是指定路径挂载,但是:引发的思考:可能是将主机的localNginx映射给了容器的nginx文件夹,因为没有localNginx是空的,就导致Nginx文件为空,进而导致nginx无法正常运行!不信,可以去尝试 run出一个容器,用docker logs 容器名 查看。

# 查看docker数据卷 帮助
docker volume --help

查看所有卷的情况 (volume叫做数据卷)

#查看所有卷的情况 指定路径挂载无法查看!
docker volume ls

看似乱码的Volume Name的话 就是匿名挂载

查看某个挂载情况

docekr volume inspect [VolumeName]
# 匿名挂载,还是比较难受的,名字太长
# 注意 VolumeName 区分大小写,不能用缩写
Nginx2就是具名挂载时指定的名字,这个时候在看到在宿主机路径/var/lib/docker/volumes时候就能看到Nginx2文件夹

如何确定是具名挂载 还是匿名挂载 还是指定路径挂载

-v 容器内路径	 			#匿名挂载
-v 卷名:容器内路径			#具名挂载 不指定宿主机路径,在/var/lib/docker/volumes/卷名 里面
-v /宿主机路径:/容器内路径		#指定路径挂载

Docker容器内的卷 没有指定目录的情况都是在/var/lib/docker/volumes/ 文件夹下 即匿名挂载、具名挂载的数据卷都在这个路径里面

宿主机绝对路径都是/开头的 所以区别是否是指定路径挂载 可以通过 -v后面第一个是不是‘/’来区别

使用聚名挂载可以很快确定卷的位置,不用担心看到,匿名挂载的卷名时混乱的一串字符串

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 代表ReadOnly  容器 只读
rw 代表ReadWrite 容器 可读写 默认是rw

问题多个Mysql如何同步数据?

使用命令 –volumes-from 名字或者容器id

初始DockerFile

什么是DockerFile?

Dockerfile就是构建Docker镜像的构建文件、命令脚本

DockerFIle的意义:

  • 步骤 : 开发 部署 运维 。。。缺一不可!
  • Dockerfile 是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件
  • Docker镜像 逐渐成为了一个企业交付的标准,必须要掌握!
  • DockerFile 构建文件 定义了一切的步骤,源代码
  • DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品
  • Docker容器:容器就是为镜像运行起来提供服务

构建步骤

  • 1 编写一个dockerfile 文件
  • 2 docker bulid images #构建成为一个镜像
  • 3 docker run images #启动镜像
  • 4 docker push images(dockerhub)

例如:我们pull的所有镜像 都是dockerfile

DockerHUB中99% 都是从基础镜像开始的 scratch
然后在配置需要的软件和环境来进行构建

很多官方镜像都是基础包,很多功能没有,我们需要自定义

官方可以制作镜像,我们也可以制作我们自己的Docker FIle

DockerFile制作过程基础知识:

  1. 每个保留关键字(指令)都是大写字母
  2. 执行顺序从上到下
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交!

DockerFile的指令

  • FROM # 基础的镜像
  • MAINTAINER # 作者:镜像是谁写的,国际标准格式:姓名+邮箱
  • RUN # Docker镜像构建时候需要运行的命令
  • ADD # 提那件会自动解压
  • WORKDIR # 镜像工作的目录
  • VOLUME # 文件挂载的目录
  • EXPOSE # 暴露端口配置 和run的时候-p是相同的
  • CMD # 指定这个容器启动的时候运行的命令,只有最后一个会生效,可被替代
  • ENTRYPOINT # 指定这个容器启动的时候运行的命令,可以追加命令
  • ONBUILD # 当构建一个被继承DockerFile 这个时候 就会运行ONBUILD 的指令。是一个触发指令
  • COPY # 将文件拷贝到镜像中
  • ENV # 构建的时候设置环境变量

创建一个自己的CentOS

2021年7月21日 文件追加了新注释 内容如下:

FROM centos
MAINTAINER zanglikun<740969606@qq.com>

ENV MYPATH /usr/local		# MYPATH是变量名 /usr/local是变量值 最后意思:run后默认进入的文件位置
# 可以参考Windows环境变量添加的 JAVA_HOME
WORKDIR $MYPATH                 # 镜像工作的目录

RUN yum -y install vim          # 给centos镜像添加vim命令
RUN yum -y install net-tools    # 给centos镜像添加ipconfig命令

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

开始编译

# 将dockerfile 编译为镜像,这里需要指定镜像名与tag
docker build -f 文件路径 -t 镜像名:tag

#编译完成,就需要去查看当前docker 是否有镜像了 如果出现

代表 你构建失败了。失败的原因可能是追加vim、net-tools 下载出错

成功的是这样的:

启动一下自己的docker 测试 发现vim、ifconfig命令就可以用了。完成

CMD参数的使用 ,切记多个CMD 只有最后一个生效!如果run的时候 追加了命令,所有的CMD 都不生效

# 让对应镜像的容器启动后执行,ls -a 切记 每个逗号 相当于一个空格
CMD ["ls","-a"]

ENTRYPOINT的使用 :比CMD 要好用,不会被覆盖,永远会执行!

ENTRYPOINT ["ls","-a"]

实战:制作Tomcat镜像

先写dockerfile

vim Dockerfile

实战:发布自己的镜像到 DockerHub

想要发布,需要在DockerHub创建自己的账号:https://hub.docker.com/

账号:740969606 密码:*******

想要发布,切记一点,一定要在dockerhub验证自己的邮箱。否则,你即便用docker 命令发布成功,你依旧无法在dockerhub的网页上查看到自己。

登录

# 登录 需要输入密码
docker login -u 账号

想看自己受否登录成功

docker info

修改容器名字(跟发布镜像没关系)

# newname 只能是A-Z 0-9
docker rename 容器id newname 

修改镜像名称

docker tag 镜像id dockerhub账号/新名字:版本号
例如:docker tag 300 740969606/mycentos:1.0.1

上传镜像(到国外服务器)

docker push 740969606/mycentos:1.0.1

阿里云容器镜像,自行百度即可

Docker 网络: Docker0

查看宿主机的网卡,(每次启动一个容器,都会多一个虚拟网卡!)

ip addr
  • lo 本机ip
  • docker0 docker网卡地址 相当与网关!桥接到真实的宿主机上

注意 Linux可以 ping 通docker 容器内部:每次启动容器,docker就会给容器分配一个与docker0虚拟网卡同段的地址。所以主机就可以用docker虚拟网卡docker0 来访问容器了。切记,是成对出现,(容器有一个公网,一个内网)通过 veth-pair 技术充当桥梁所以多个容器之间可以进行通信!

还是那句话,你只看到了大佬轻松解决问题的光鲜,却不记得当初人家死磕Bug的痛苦。

万物皆入轮回,谁也躲不掉!

以上文章,均是我实际体验,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,支持下原创,请勿直接盗用,有条件的可以开通个会员支持下,谢谢!!!

Java Code Study » Docker 高级

合肥招聘,请发自己的简历至:📧740969606@qq.com

招聘前端 招聘Java