Docker学习——DockerFile

一、初识DockerFile

DockerFile就是原来构建docker镜像的构建文件!命令脚本!

1、创建镜像构建命令

(1)/home目录下新建目录docker_test_volume

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

(2)编辑构建命令脚本

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "......end......"
CMD /bin/bash

这里的每个命令就是镜像的一层

(3)执行构建脚本

docker build -f /home/docker_test_volumn/dockerfile1 -t andy/centos:1.0 .

(4)查看镜像是否构建完成

(5)启动自己构建的镜像

构建时的创建挂载目录用的是匿名挂载,查看是否挂载成功

查看卷挂载的路径

(6)测试一下刚才的文件是否同步出去了

cd /var/lib/docker/volumes/b48b9904540b12a8b61ae996aff78dcb34376061b09ccab24c99ce5828311639/_data

这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!

假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径

二、数据卷容器

1、多个mysql数据同步

(1)先启动docker01

docker run  -it --name docker01 andy/centos:1.0 

(2)启动docker02引用docker01的卷

docker run -it --name docker02  --volumes-from docker01 andy/centos:1.0

(3)再进入docker01容器内在卷下创建文件abc.txt

(4)进入docker02查看在docker01中创建的卷是否会同步到docker02中

可以看出,在docker01容器中volume01目录下添加的abc.txt在docker02中volume01目录下已经同步成功

注:
    a 通过--volumes-from来实现容器间的挂载就类似于JAVA中的子类继承父类的概念
    b 只要通过--volumes-from就能实现容器间的数据共享

(5)启动docker03引用docker01的卷

docker run -it --name docker03  --volumes-from docker01 andy/centos:1.0

(6) 在docker03容器中的/volume01目录下创建efg.txt文件,再进入docker01发现文件已经同步创建

(7) 删除docker01,查看docker02和docker03是否还可以访问挂载文件

依旧可以访问,说明删除初始化的父容器,通过--volume-from的子容器中的文件不受影响

拓展:

多个mysql实现数据共享

docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

结论:

(1)容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
(2)但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的

 

三、DockerFile构建过程

dockerfile是用来构建镜像的文件

1、dockerfile的构建步骤

  (1) 编写一个docfile文件
  (2) docker build 构建成为一个镜像
  (3) docker run 运行镜像
  (4) docker push 发布镜像(Docker Hub、阿里云镜像仓库)

官方的做法:

很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像

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

 

构建过程:

#创建一个DocFile文件,名字可以随机,建议DocFile
#文件中的内容 指令(大写) 和 参数     

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "......end......"
CMD /bin/bash

dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为了企业交付的标准,必须要掌握!

步骤:开发,部署,运维
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过dockerFile构建生成的镜像,最终发布和运行的产品,原来是jar,war
Docker容器:容器就是镜像运行起来提供服务器

四、DockerFile指令

1 命令解释

FROM         #基础镜像,一切从这里开始构建
MAINTAINER     #镜像是谁写的,姓名+邮箱
RUN        #镜像构建的时候需要运行的命令
ADD         #步骤,tomcat镜像,这个tomcat压缩包!就是添加内容
WORKDIR          #镜像的工作目录
VOLUME        #挂载的目录
EXPOSE         #暴露端口
CMD         #指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT    #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD        #当构建一个被继承Dockerfile这个时候就会运行onbuild的指令,触发指令
COPY        #类似ADD命令,将我们的文件拷贝到镜像中
ENV         #构建的时候设置环境变量  

2 图示

 

五、实战测试

Docker hub中99%的镜像都是从基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行的

官网DockerFile的构建过程:

创建一个自己的centos:

1 编写DOCKERFILE的文件
FROM centos
MAINTAINER andy<1196653502@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

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


2 通过文件构建自己的镜像
dockerfile目录下新建mydockerfile2-centos

docker build -f mydockerfile-centos -t mycentos:0.2 .

3 测试运行

对比之前原生的centos

进入我们自己构建的docker镜像mycentos:0.2,工作目录是我们之前配置的路径

我们可以列出本地镜像的变更历史

查看mysql镜像的生成过程

查看nginx的构建过程

从上述过程可以清除的看到镜像暴露端口,生成目录,设置环境变量的具体过程

六、CMD和ENTRYPOINT区别

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

1 测试CMD

(1) 编写dockerFile文件

(2) 构建镜像

(3)run运行

发现我们的ls -a 生效了

(4)想追加一个命令 -l ls -al

结果报错

(5)报错原因

CMD的清理下,替换了["ls","-a"]命令,而-l不是命令,所以报错!

2 测试ENTRYPOINT

(1) 编写dockerFile文件

(2) 构建镜像

(3) 运行镜像

这里和CMD生成的镜像看不出任何的区别

(4) 追加命令-l再次运行镜像

但是,这里添加的-l不会像之前CMD那样报错,说明这是在原来的基础上追加命令,而不是替换命令,我们的追加命令是直接拼接在我们的ENTRYPOINT后面的

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值