FROM # 指定基础镜像
MAINTAINER # 镜像的作者
RUN # 镜像构建的时候需要运行的命令
ADD # 拷贝文件,会自动解压,例如拷贝tomcat安装文件
WORKDIR # 镜像的工作目录,是运行镜像进入时的默认目录
VOLUME # 挂载的目录
EXPOSE # 暴露对外的端口
CMD # 指定容器启动时运行的命令,一个DockerFile有多个CMD,只有最后一个会生效,可被替代
ENTRYPOINT # 指定容器启动时运行的命令,可以追加命令
ONBUILD # 当构建的镜像被继承时会运行
COPY # 类似ADD,将文件拷贝到镜像中
ENV # 构建镜像时设置环境变量
测试一下使用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目录
# 这个卷的目录通过匿名挂载,挂载到宿主机中的某个目录
FROM centos
MAINTAINER wzh<[email protected]>
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
docker build -f DockerFile -t mycentos:0.1 .
docker run -it mycentos:0.1
使用以下DockerFile构建一个centos镜像:
FROM centos
CMD ["ls", "-a"]
构建镜像完成后,运行容器后会直接执行ls -a
命令。
如果想在ls -a后面追加命令参数,例如追加-l
参数,则执行docker run [镜像id] -l
即可。此时报错。因为使用CMD时会直接使用-l
替换原有的ls -a
。如果将CMD替换为ENTRYPOINT,则此时可以执行,不会报错。
如果数据都存放在容器中,删除容器后数据将丢失。如何使容器中的数据更加安全?比如将mysql容器中的数据库数据保存在容器外。这里就将使用到容器数据卷技术,用于容器之间进行数据共享,或者容器与容器外进行数据共享,将容器中产生的数据实时同步到其他目录下。这就是卷技术,将容器中的目录挂载到宿主机的目录下。
运行容器时使用可选参数-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中对数据库进行建表等操作,数据都将同步到宿主机中。删除容器后宿主机中的文件不会删除。
docler volume inspect [卷名] # 可以查到挂载卷的信息
docker中没有指定挂载目录的卷都挂载在宿主机的/var/lib/docker/volumes/[卷名]
中。
-v [容器内路径]
对应宿主机的挂载目录是在/var/lib/docker/volumes/[随机名]
docker run -it --name docker01 wzh/centos:1.0
-volumes-from [镜像名]
来指定继承卷挂载的容器为docker01:docker run -it --name docker02 --volumes-from docker01 wzh/centos:1.0
此时在docker01容器中的volume01目录下创建文件,则在docker02的volume01目录下中可以同步到此文件。
如果删除docker01容器删除,则docker02中的文件依旧存在。
通过容器数据卷,可以实现多个mysql之间数据共享。