文章目录
- 一、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 .
构建过程如下:
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]
可以查看到挂载卷的信息:
此时在容器内的/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连接一下数据库,连接成功:
在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之间数据共享。