什么是Docker镜像
docker镜像使用分层的存储方式编写,包含操作系统基础文件和软件运行环境,而容器就是将docker镜像运行并使用。
什么是Dockerfile
Dockfile是编写docker镜像生成过程的文件,有其特定的语法。我们可以通过在一个文件夹中,创建Dockfile的文件,安装dockerfile语法编写docker镜像,然后在这个文件夹路径下执行命令构建一个镜像:
docker build <container_name> .
这里要注意,点代表在当前路径下进行搜索Dockerfile文件,如果当前目录下没有Dockerfile镜像构成是失败的。
Dockerfile语法
最常用
FROM
第一个指令必须是FROM,用来指定一个构建镜像的基础源镜像,如果本地没有就会从docker镜像库中下载。
MAINTAINER
描述镜像的创建者和维护者信息 ,告诉正在使用这个镜像的人,你才是这个镜像的创建者。
RUN
RUN命令是最常用的命令,执行完成一个RUN命令之后会成为一个新的镜像,这里也是指镜像的分层构建。一句RUN就是一层,也相当于一个版本。我们知道docker是镜像层是只读的,所以你如果第一句安装了软件,用完在后面一句删除是不可能的。所以为了能够精简镜像我们往往在一个RUN中实现更多的操作。
基础
CMD
CMD在Dockerfile中只能出现一次,因为无论有多少个,只有最后一个会生效。它的作用是在启动容器的时候执行一条特定的命令,例如执行开机启动脚本。如果创建容器的时候 docker run 追加了其他命令,会覆盖掉镜像中CMD命令。
EXPOSE
设置容器默认的对外映射的容器端口号,当docker run -p 启动容器的时候,会自动开放容器对外映射的端口号。
ENV
设置容器的环境变量,容器运行的时候这个环境变量也会保留。
ADD
复制本机文件或目录或远程文件,添加到指定的容器目录,如果该文件是压缩文件还会进行解压 。个人建议不使用,因为在RUN命令中你可以实现文件的复制,在尽量减小docker镜像大小的思路下,不使用ADD命令是明智之举。
COPY
COPY也是复制文件但是不会自动解压复制的压缩文件,也不能复制网络文件。
ENTRYPOINT
和CMD几乎一样,但是docker run追加了其他命令,追加的命令不会生效。
VOLUME
在主机上创建一个挂载,挂载到容器的指定路径。 在容器启动的时候,可以用-v代替此功能,所以一般没必要使用这个命令。
USER
说白了就是指定运行RUN、CMD、ENTRYPOINT命令是以什么用户运行。
WORKDIR
说白了就是指定在运行RUN、CMD、ENTRYPOINT命令时是在什么路径下运行的。
Dockerfile实例
```
[root@cgls ~]# mkdir -p dockerfile/mysql
[root@cgls ~]# cd dockerfile/mysql
[root@cgls ~]# touch Dockerfile
[root@cgls ~]# vim Dockerfile
```
FROM centos7.5
MAINTAINER from cgls
RUN cd /usr/local/src/ && \
yum -y install wget && \
wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm && \
rpm -ivh mysql57-community-release-el7-8.noarch.rpm && \
yum -y install mysql-server && \
cd /root && \
wget http://172.16.1.150/es/start.sh
EXPOSE 3306
ENV JAVA_HOME /opt/jdk
CMD ["/root/start.sh","run"]
```
[root@cgls ~]# cd dockerfile/mysql
[root@cgls ~]# docker build -t mysql_v1.0 .
```