文章目录

  • 一、DockerFile
  • 1.DockerFile简介
  • 2.常用DockerFile指令
  • 3.DockerFile简单使用
  • 4.DockerFile构建一个CentOS
  • 5.CMD和ENTRYPOINT命令的区别
  • 二、Docker容器数据卷
  • 1.容器与宿主机数据同步
  • (1)指定路径挂载
  • (2)具名挂载(使用较多)和匿名挂载
  • 2.容器间数据同步


一、DockerFile

1.DockerFile简介

  • DockerFile文件是用于构建Docker镜像一个脚本,通过DockerFile生成镜像。
  • 每个指令都是大写字母
  • 指令从上至下执行
  • #为注释
  • 每个指令会创建一个镜像层
  • DockerFile面向开发,发布项目时通过DockerFile制作镜像。

2.常用DockerFile指令

FROM # 指定基础镜像
MAINTAINER # 镜像的作者
RUN # 镜像构建的时候需要运行的命令
ADD # 拷贝文件,会自动解压,例如拷贝tomcat安装文件
WORKDIR # 镜像的工作目录,是运行镜像进入时的默认目录
VOLUME # 挂载的目录
EXPOSE # 暴露对外的端口
CMD # 指定容器启动时运行的命令,一个DockerFile有多个CMD,只有最后一个会生效,可被替代
ENTRYPOINT # 指定容器启动时运行的命令,可以追加命令
ONBUILD # 当构建的镜像被继承时会运行
COPY # 类似ADD,将文件拷贝到镜像中
ENV # 构建镜像时设置环境变量

3.DockerFile简单使用

测试一下使用DockerFile自动构建镜像:
先创建一个DockerFile文件,文件中内容如下,目的是匿名挂载volume01和volume02两个目录。(关于匿名挂载在下面第二点中)

FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "---end---"
CMD /bin/bash
docker build -f DockerFile -t wzh/centos:1.0 .

构建过程如下:

VOLUME docker volume dockerfile_VOLUME docker

docker run -it d5c4d9a91aad /bin/bash # 用刚才生成的镜像启动容器,启动的容器自动挂载volume1和volume2目录
# 这个卷的目录通过匿名挂载,挂载到宿主机中的某个目录

4.DockerFile构建一个CentOS

  • 编写DockerFile文件
FROM centos
MAINTAINER wzh<aaa@qq.com>
ENV MYPATH /usr.local
WORKDIR $MYPATH
RUN yum -y install vim # 安装vim
RUN yum -y install net-tools # 安装net-tools

EXPOSE 80
CMD echo $MYPATH
CMD echo "----build finished------"
cmd /bin/bash
  • 通过DockerFile构建镜像
docker build -f DockerFile -t mycentos:0.1 .
  • 运行镜像到容器
docker run -it mycentos:0.1

5.CMD和ENTRYPOINT命令的区别

使用以下DockerFile构建一个centos镜像:

FROM centos
CMD ["ls", "-a"]

构建镜像完成后,运行容器后会直接执行ls -a命令。

如果想在ls -a后面追加命令参数,例如追加-l参数,则执行docker run [镜像id] -l即可。此时报错。因为使用CMD时会直接使用-l替换原有的ls -a。如果将CMD替换为ENTRYPOINT,则此时可以执行,不会报错。

二、Docker容器数据卷

如果数据都存放在容器中,删除容器后数据将丢失。如何使容器中的数据更加安全?比如将mysql容器中的数据库数据保存在容器外。这里就将使用到容器数据卷技术,用于容器之间进行数据共享,或者容器与容器外进行数据共享,将容器中产生的数据实时同步到其他目录下。这就是卷技术,将容器中的目录挂载到宿主机的目录下。

1.容器与宿主机数据同步

(1)指定路径挂载

运行容器时使用可选参数-v挂载容器内目录

docker run -it -v [主目录]:[容器内目录]
docker run -it -v /root/test:/home centos /bin/bash

容器启动后,通过docker inspect [容器id]可以查看到挂载卷的信息:

VOLUME docker volume dockerfile_centos_02


此时在容器内的/home目录下进行文件操作,都将同步到宿主机的/root/test目录下。同样地,在宿主机/root/test下新建文件都将同步到容器中的/home目录下。

用mysql测试一下数据同步:

首先安装mysql5.7,-d指定在后台运行,-p绑定端口,-e添加额外配置root账户的密码为123456,-v挂载卷:

docker run -d -p 3310:3306 -v /root/mysql/conf.d:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWD=123456  --name testmysql mysql:5.7

此时容器创建成功,通过DataGrip连接一下数据库,连接成功:

VOLUME docker volume dockerfile_centos_03


在mysql中对数据库进行建表等操作,数据都将同步到宿主机中。删除容器后宿主机中的文件不会删除。

(2)具名挂载(使用较多)和匿名挂载

  • 具名挂载:通过-v [卷名]:[容器内路径]挂载
docler volume inspect [卷名] # 可以查到挂载卷的信息

docker中没有指定挂载目录的卷都挂载在宿主机的/var/lib/docker/volumes/[卷名]中。

  • 匿名挂载:只指定容器内目录。
-v [容器内路径]

对应宿主机的挂载目录是在/var/lib/docker/volumes/[随机名]

2.容器间数据同步

  • 首先使用上面【一、DockerFile使用-1.DockerFile简单使用】中创建的镜像,新建一个容器docker01:
docker run -it --name docker01 wzh/centos:1.0
  • 然后ctrl+p+q返回但不退出容器,再创建容器docker02,这里使用-volumes-from [镜像名]来指定继承卷挂载的容器为docker01:
docker run -it --name docker02 --volumes-from docker01 wzh/centos:1.0

此时在docker01容器中的volume01目录下创建文件,则在docker02的volume01目录下中可以同步到此文件。

如果删除docker01容器删除,则docker02中的文件依旧存在。

通过容器数据卷,可以实现多个mysql之间数据共享。