参考资料:

1.官网教程:https://docs.docker.com/engine/reference/builder/ (官网教程,稍后我做一下总结和翻译输出到本文)

2.官网练习推荐:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/(建议跟着敲一遍)

2.视频教程:https://www.bilibili.com/video/BV1og4y1q7M4?t=380&p=8(老师讲的很好)

3.博客1:https://www.cnblogs.com/yaowen/p/8431710.html

前言:

  1. Docker容器的数据卷(data volume),数据卷容器,数据卷的备份和还原。
  2. 数据卷就是数据(一个文件或者文件夹)。
  3. Docker的理念之一是将应用与其运行的环境打包,docker容器的生命周期是与其运行的程序一致的,而对数据的要求是持久化,docker容器之间也需要有共享数据的渠道。
  4. 数据卷是特殊的目录,可以绕过联合文件系统,为一个或多个容器提供访问。数据卷设计的目的是数据的永久化,是完全独立于容器的生命周期,不会在容器删除时删除其挂载的数据卷,也不会存在类似垃圾收集机制,对容器引用的数据卷进行处理。

说上面这段话的原因是,当使用数据卷技术,来实现比如数据库数据持久化和数据库之间共享数据等目的时,往往会以为一份数据被拷贝了多份,因此删除了其中一个另外的也不会丢失。

其实拷贝的思想是错误的,其实数据实际上实在宿主机本地的某个路径下。

请参考下面一段话:

  1. 数据卷存在于宿主机中,独立于容器,和容器的生命周期是分离的,数据卷存在于宿主机的文件系统中,数据卷可以目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换。
  2.  
  3. 数据卷的特点:
  4. 1.容器启动的时候初始化的,如果容器使用的镜像包含了数据,这些数据也会拷贝到数据卷中。
  5. 2.容器对数据卷的修改是及时进行的。
  6. 3.数据卷的变化不会影响镜像的更新。数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像与数据卷之间不会有相互影响。
  7. 4.数据卷是宿主机中的一个目录,与容器生命周期隔离。
  8. 为容器添加数据卷(数据存放的地址):
  9. $sudo docker run -v ~/container_data:/data -it ubuntu /bin/bash :-v指定数据卷在本机中的目录和在容器中映射的目录名。如果本机目录container_data不存在会创建,data 是容器中映射的目录。
  10. yw1989@ubuntu:~$ docker run -it -v ~/ywjuan:/ywjuan ubuntu /bin/bash
  11. root@b78c81987d93:/# ls 就包含了叫ywjuan的目录
  12. bin dev home lib64 mnt proc run srv tmp var
  13. boot etc lib media opt root sbin sys usr ywjuan
  14. root@b78c81987d93:/# touch ywjuan/c1 在这个目录中创建一个文件
  15. root@b78c81987d93:/ywjuan# echo "i am yaowen" > c1 : 文件中写入一个字符串
  16. exit退出容器。
  17.  
  18. 本机ls可以看到ywjuan文件夹,查看文件可以看到c1文件存在于ywjuan中了。
  19. yw1989@ubuntu:~$ ls
  20. Desktop Documents examples.desktop Pictures Templates ywjuan
  21. dockerfile Downloads Music Public Videos
  22. yw1989@ubuntu:~$ cd ywjuan/
  23. yw1989@ubuntu:~/ywjuan$ ls
  24. c1 :刚才输入的字符也存在了
  25.  
  26. 查看刚才的镜像:
  27. yw1989@ubuntu:~/ywjuan$ docker ps
  28. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  29. b78c81987d93 ubuntu "/bin/bash" 15 minutes ago Up 15 minutes nifty_wozniak
  30.  
  31. $docker inspecr b78c81987d93:可以看到Volumes信息。
  32.  
  33. 为数据卷添加权限:$sudo docker run -it -v ~/datavolume:/data:ro --name=bghd ubuntu /bin/bash ro是只读, 在容器的data文件目录中就不能创建文件,因为是只读的。$docker inspecr b78c81987d93可以看到数据卷信息和权限。
  34.  
  35. 可以在dockerfile文件中加上VOLUME[“/data”]来创建含有数据卷的镜像并使用该镜像创建包含数据卷的容器。Dockefifle可以创建多个数据卷,与在run命令中创建数据卷不同,dockerfile中的数据卷不能映射到已经存在的本地文件目录的,在镜像构建时指定的数据卷会在容器启动时创建指定名字的数据卷,运行同样镜像的容器创建的数据据是不一样的(可以看到不同容器的数据卷地址是不一样的)。当容器中的数据卷地址不一样时,容器之间就无法共享数据了。
  36. Docker run --name 容器名 -it 该镜像名。
  37.  
  38. 数据卷容器:命名的容器挂在数据卷,其他容器通过挂在这个容器实现数据共享,挂在数据卷的容器叫做数据卷容器。数据卷容器挂载了一个本地目录,其他容器连接这个容器来实现数据的共享(数据地址的拷贝)。

回顾:

之前学习了通过命令提交一个新的镜像(在原镜像的基础上进行修改),具体是通过commit命令

commit镜像

  1. docker commit 提交容器成为一个新的副本
  2.  
  3. # 命令和git原理类似
  4. docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[版本TAG]

本篇:

通过写Dockerfile来生成镜像

初始Dockerfile

Dockerfile 就是用来构建docker镜像的构建文件!命令脚本!先体验一下!

通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层!

  1. # 创建一个dockerfile文件,名字可以随便 建议Dockerfile
  2. # 文件中的内容: 指令(大写) + 参数
  3. $ vim dockerfile1
  4. FROM centos # 当前这个镜像是以centos为基础的
  5.  
  6. VOLUME ["volume01","volume02"] # 挂载卷的卷目录列表(多个目录)
  7.  
  8. CMD echo "-----end-----" # 输出一下用于测试
  9. CMD /bin/bash # 默认走bash控制台
  10.  
  11. # 这里的每个命令,就是镜像的一层!
  12. # 构建出这个镜像
  13. -f dockerfile1 # f代表file,指这个当前文件的地址(这里是当前目录下的dockerfile1)
  14. -t centos_test # t就代表target

  15. $ docker build -f dockerfile1 -t centos_test .
  16. Sending build context to Docker daemon 2.56kB
  17. Step 1/4 : FROM centos
  18. latest: Pulling from library/centos
  19. 8a29a15cefae: Already exists
  20. Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
  21. Status: Downloaded newer image for centos:latest
  22. ---> 470671670cac
  23. Step 2/4 : VOLUME ["volume01","volume02"] # 卷名列表
  24. ---> Running in c18eefc2c233
  25. Removing intermediate container c18eefc2c233
  26. ---> 623ae1d40fb8
  27. Step 3/4 : CMD echo "-----end-----" # 输出 脚本命令
  28. ---> Running in 70e403669f3c
  29. Removing intermediate container 70e403669f3c
  30. ---> 0eba1989c4e6
  31. Step 4/4 : CMD /bin/bash
  32. ---> Running in 4342feb3a05b
  33. Removing intermediate container 4342feb3a05b
  34. ---> f4a6b0d4d948
  35. Successfully built f4a6b0d4d948
  36. Successfully tagged caoshipeng/centos:latest
  37.  
  38. # 查看自己构建的镜像
  39. $ docker images
  40. REPOSITORY TAG IMAGE ID CREATED SIZE
  41. centos_test latest f4a6b0d4d948 About a minute ago 237MB

数据卷容器

多个MySQL同步数据!

命名的容器挂载数据卷!

  1. # 测试 启动3个容器,通过刚才自己写的镜像启动
  2. # 创建docker01:因为我本机是最新版,故这里用latest,狂神老师用的是1.0如下图
  3. $ docker run -it --name docker01 caoshipeng/centos:latest
  4.  
  5. # 查看容器docekr01内容
  6. $ ls
  7. bin home lost+found opt run sys var
  8. dev lib media proc sbin tmp volume01
  9. etc lib64 mnt root srv usr volume02
  10.  
  11. # 不关闭该容器退出
  12. CTRL + Q + P
  13.  
  14. # 创建docker02: 并且让docker02 继承 docker01
  15. $ docker run -it --name docker02 --volumes-from docker01 caoshipeng/centos:latest
  16.  
  17. # 查看容器docker02内容
  18. $ ls
  19. bin home lost+found opt run sys var
  20. dev lib media proc sbin tmp volume01
  21. etc lib64 mnt root srv usr volume02

  1. # 再新建一个docker03同样继承docker01
  2. $ docker run -it --name docker03 --volumes-from docker01 caoshipeng/centos:latest
  3. $ cd volume01 #进入volume01 查看是否也同步docker01的数据
  4. $ ls
  5. docker01.txt
  6.  
  7. # 测试:可以删除docker01,查看一下docker02和docker03是否可以访问这个文件
  8. # 测试发现:数据依旧保留在docker02和docker03中没有被删除

这里是持久化到了本地,这个时候,本地的数据是不会删除的!相当于硬链接,不是拷贝。

多个mysql实现数据共享

  1. $ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
  2.  
  3. $ docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
  4.  
  5. # 这个时候,可以实现两个容器数据同步!

结论:

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

但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!

--------------------------------------------------------------------------------------------------------------------------------分割线:正式开始Dockerfile----------------------------------------------------------------------------------------------------------------------------------------

DockerFile介绍

dockerfile是用来构建docker镜像的文件!命令参数脚本!

构建步骤:

1、 编写一个dockerfile文件

2、 docker build 构建称为一个镜像

3、 docker run运行镜像

4、 docker push发布镜像(DockerHub 、阿里云仓库)

DockerFile构建过程

基础知识:

1、每个保留关键字(指令)都是必须是大写字母

2、执行从上到下顺序

3、#表示注释

4、每一个指令都会创建提交一个新的镜像曾,并提交!

Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!

Docker镜像逐渐成企业交付的标准,必须要掌握!

DockerFile:构建文件,定义了一切的步骤,源代码

DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。

Docker容器:容器就是镜像运行起来提供服务。

DockerFile的指令

  1. FROM # from:基础镜像,一切从这里开始构建
  2. MAINTAINER # maintainer:镜像是谁写的, 姓名+邮箱
  3. RUN # run:镜像构建的时候需要运行的命令
  4. ADD # add:步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
  5. WORKDIR # workdir:镜像的工作目录
  6. VOLUME # volume:挂载的目录
  7. EXPOSE # expose:暴露端口配置
  8. CMD # cmd:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
  9. ENTRYPOINT # entrypoint:指定这个容器启动的时候要运行的命令,可以追加命令
  10. ONBUILD # onbuild:当构建一个被继承DockerFile这个时候就会运行onbuild的指令,触发指令
  11. COPY # copy:类似ADD,将我们文件拷贝到镜像中
  12. ENV # env:构建的时候设置环境变量!

实战测试

  1. 创建一个自己的centos
  1. # 1./home下新建dockerfile目录
  2. $ mkdir dockerfile
  3.  
  4. # 2. dockerfile目录下新建mydockerfile-centos文件
  5. $ vim mydockerfile-centos
  6.  
  7. # 3.编写Dockerfile配置文件
  8. FROM centos # 基础镜像是官方原生的centos
  9. MAINTAINER cao<1165680007@qq.com> # 作者
  10.  
  11. ENV MYPATH /usr/local # 配置环境变量的目录
  12. WORKDIR $MYPATH # 将工作目录设置为 MYPATH
  13.  
  14. RUN yum -y install vim # 给官方原生的centos 增加 vim指令
  15. RUN yum -y install net-tools # 给官方原生的centos 增加 ifconfig命令
  16.  
  17. EXPOSE 80 # 暴露端口号为80
  18.  
  19. CMD echo $MYPATH # 输出下 MYPATH 路径
  20. CMD echo "-----end----"
  21. CMD /bin/bash # 启动后进入 /bin/bash
  22.  
  23. # 4.通过这个文件构建镜像
  24. # 命令: docker build -f 文件路径 -t 镜像名:[tag] .
  25. $ docker build -f mydockerfile-centos -t mycentos:0.1 .
  26.  
  27. # 5.出现下图后则构建成功

  1. $ docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. mycentos 0.1 cbf5110a646d 2 minutes ago 311MB
  4.  
  5. # 6.测试运行
  6. $ docker run -it mycentos:0.1 # 注意带上版本号,否则每次都回去找最新版latest
  7.  
  8. $ pwd
  9. /usr/local # 与Dockerfile文件中 WORKDIR 设置的 MYPATH 一致
  10. $ vim # vim 指令可以使用
  11. $ ifconfig # ifconfig 指令可以使用
  12.  
  13. # docker history 镜像id 查看镜像构建历史步骤
  14. $ docker history 镜像id

CMD 和 ENTRYPOINT区别

  1. CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
  2. ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令

docker学习笔记(4)——Dockerfile的更多相关文章

  1. Docker学习笔记三 Dockerfile 指令 定制镜像

    本文地址:https://www.cnblogs.com/veinyin/p/10412079.html  镜像是分层存储的,每一层都是独立存在的,修改当前层并不会修改其依赖的上一层,删除某一层也只是 ...

  2. Docker学习笔记之Dockerfile

    Dockerfile的编写格式为<命令><形式参数>,命令不区分大小写,但一般使用大写字母.Docker会依据Dockerfile文件中编写的命令顺序依次执行命令.Docker ...

  3. docker学习笔记1 -- 安装和配置

    技术资料 docker中文官网:http://www.docker.org.cn/ 中文入门课程:http://www.docker.org.cn/book/docker.html docker学习笔 ...

  4. docker~学习笔记索引

    回到占占推荐博客索引 使用docker也有段时间了,写了不少文章与总结,下面把它整理个目录出来,方便大家去学习与检索! docker~学习笔记索引 docker~linux下的部署和基本命令(2017 ...

  5. Docker学习笔记总结

    Docker学习笔记 https://yeasy.gitbooks.io/docker_practice/content/   一 环境搭建 Ubuntu安装 .添加软件源的GPG密钥 curl -f ...

  6. Docker学习笔记之-部署.Net Core 3.1项目到Docker容器,并使用Nginx反向代理(CentOS7)(一)

    上一节演示如何安装Docker,链接:Docker学习笔记之-在CentOS中安装Docker 本节演示 将.net core 3.1 部署到docker容器当中,并使用 Nginx反向代理,部署平台 ...

  7. Docker学习笔记之-在CentOS中安装Docker

    上一节演示了如何 通过Xshell连接CentOS服务,链接:Docker学习笔记之-通过Xshell连接 CentOS服务 本节将演示 如何在CentOS中安装 Docker 第一步:更新系统包到最 ...

  8. docker学习笔记(3)- 镜像

    简介 在docker学习笔记(1)- 架构概述一节中可以看到镜像是docker三大组件之一,可以将Docker镜像类比为虚拟机的模版. 镜像由多个层组成,每层叠加之后从外部看就像一个独立的对象,镜像的 ...

  9. Docker学习笔记 — 配置国内免费registry mirror

    Docker学习笔记 — 配置国内免费registry mirror Docker学习笔记 — 配置国内免费registry mirror

  10. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

随机推荐

  1. 如何使用c#编写单片机程序

    ​ 因为个人喜爱想研究单片机,但是不太会c,然后再找资料研究有没有其他的方法发现国外的c# nanoframework 框架可以编写单片机程序,本文我将会用自己踩过的坑来总结一些c#编写单片机的一些经 ...

  2. db2日志模式、备份归档、恢复解析

    DB2的日志分为两种模式,日志循环与归档日志,也就是非归档和归档模式.下面就具体介绍一下这两种方式以及和备份归档设置的关系. 一.日志循环 这是默认方式,也就是非归档模式,这种模式只支持(backup ...

  3. ApacheCN C/C++ 译文集 20211201 更新

    笨办法学C 中文版 前言 导言:C的笛卡尔之梦 练习0:准备 练习1:启用编译器 练习2:用Make来代替Python 练习3:格式化输出 练习4:Valgrind 介绍 练习5:一个C程序的结构 练 ...

  4. 「NOI十联测」黑暗

    「NOI十联测」黑暗 \(n\) 个点的无向图,每条边都可能存在,一个图的权值是连通块个数的 \(m\) 次方,求所有可能的图的权值和.(n≤30000,m≤15) 令\(ans[n][m]\)为n个 ...

  5. 布局TabBar

    布局TabBar中的items Tabbar中应该有5个Item 主页/消息/发布按钮/发现/我 布局TabBar中的Items可以通过下面的方式 通过自定义TabBar的方式 多添加一个控制器,让中 ...

  6. Git 保存和恢复工作进度(stash)

    感谢原文作者:滑稽的命运 原文链接:https://www.jianshu.com/p/1e65e938f93c 作用: 封存工作区与暂存区已经被Git版本控制,但没有提交(Commit)版本库的文件 ...

  7. SpringBeanUtils的部分方法类

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/12060553.html SpringBeanUtils的部分方法类: import java. ...

  8. 如何按规定的格式向mysql中导入数据

    1.首先我们拿到数据,数据必须按照一定的格式书写的.如用|区分字段,换行区分row 12107 | 心情1 | 今天的心情很不好啊. 12108 | 天气 | 今天天气还行. 12109 | 臭美 | ...

  9. 直播流媒体EasyDSS

    访问官方 http://www.easydss.com/ 点击试用下载 根据不同需求 选择不同版本 (我选择的右边) 下载完解压 双击 start.bat 看见如下图则成功 网页输入 http://i ...

  10. nvidia-smi

    内容转自:https://blog.csdn.net/handsome_bear/article/details/80903477 nvidia-smi 显示 说明 Fan 风扇转速(0%--100% ...