FROM centos:latest
指定维护者信息
MAINTAINER "changhf"@163.com>
复制本地主机的 src到容器中的 dest ,src必须在上下文中,一般情况下,将本地主机的一个包含Dockerfile的目录中的所有内容作为上下文,如docker/install。当使用本地目录为源目录时,推荐使用 COPY 。
COPY docker/install /install
ADD jdk-8u91-linux-x64.tar.gz /opt
与 COPY 类似,从上下文复制文件到镜像, 宿主机路径可以是Dockerfile所在目录的一个相对路径,第二个参数必须是绝对路径,如果是压缩文件会被解压提取。
RUN ln -s /opt/jdk1.8.0_91 /opt/jdk
RUN /bin/bash /install/build.sh cms
RUN /bin/bash /install/downLib.sh
RUN /bin/bash /install/container_setting.sh
当命令较长时可以使用 \ 来换行。
每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。经验告诉我们,多条命令可以使用 \ 来合并成一条,这样将减小所构建的镜像的体积,原因是在镜像中每执行一条命令都会产生一个中间镜像,我们需要尽可能的减少中间镜像。
另一种写法:
RUN["/bin/bash", "-c", "echo hello"]
支持三种格式
CMD[“executable”,”param1”,”param2”] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD [“param1”,”param2”] 提供给 ENTRYPOINT 的默认参数;
CMD /opt/jdk/bin/java -version
每个Dockerfile最多只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器通过dcoker run
命令,将会覆盖掉 CMD 指定的命令。
Dockerfile中还有一个与CMD指令功能类似的ENTRYPOINT
指令,只是后者所执行的指令不能被docker run命令覆盖。
docker run -i -t changhf/centosWithJava /bin/bash //覆盖CMD中的命令 执行/bin/bash
指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
ENV JAVA_HOME /opt/jdk1.8.0_91/java/bin
设置进入容器时的工作目录。
可以使用多个 WORKDIR 指令,后面参数是相对路径,基于前面命令指定的路径。
WORKDIR /home
WORKDIR admin
RUN pwd
则最终路径为 /home/admin
指定Docker容器暴露的端口号,用于端口映射。容器内部只需对外暴露相应的端口,并映射到宿主机的端口上,外界就能随时访问容器内部的应用程序。这也正式Docker的强项:使用容器技术封装应用程序,让外界无需关注应用程序的运行环境。
docker run -d -p 50000:5000 -v ~/docker-registry:/tmp/registry registry
-p
表示对容器中应用程序暴露的端口进行端口映射,左边的50000为宿主机的端口,5000为容器内部需要暴露的端口。执行该命令表示启动一个Docker Registry,可以通过127.0.0.1:50000
查看是否启动成功。
EXPOSE 80
格式为 VOLUME [“/data”] 。设置可被挂载的数据卷。
创建一个可以从挂载宿主机文件或目录到容器的挂载点,一般用来存放数据库和需要保持的数据等。通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
docker run --name data -it -v /opt/data --privileged=true docker.io/ubuntu /bin/bash
目录映射
-v
后面的映射关系是宿主机路径:容器路径
,可以理解为目录映射
,这样就可以让所有的容器共享宿主机数据,从而只需要改变宿主机的数据源就能够影响到所有的容器数据。宿主机上的文件/目录是要提前存在的,容器里对应的文件/目录会自动创建。
数据卷权限:
–privileged=true用于开放权限,有时映射的容器路径无法访问,只需启动时加上该设置即可。
参考:Dockerfile 常用指令
数据卷的使用