从上一篇文章中我们可以了解到, 镜像的定制实际上就是定制每一层所添加的配置, 文件等信息, 但是命令毕竟只是命令, 每次定制都得去重复执行这个命令, 而且还不够直观, 如果我们可以把每一层修改, 安装, 构建, 操作的命令都写入一个脚本, 用这个脚本来构建, 定制镜像, 那么这些问题不就都可以解决了吗? 对的, 这个脚本就是我们说的 Dockerfile
介绍
Dockerfile 是一个文本文件, 其内包含了一条条的指令 (Instruction), 每一条指令构建一层, 因此每一条指令的内容, 就是描述该层应当如何构建.
这里以定制 tomcat 镜像为例, 这次我们使用 Dockerfile 来定制. 在一个空白目录中, 建立一个文本文件, 并命名为 Dockerfile:
- [[email protected] mydocker]# cat Dockerfile
- FROM jdk:latest
- ADD apache-tomcat-9.0.27.tar.gz /data/soft
- RUN rm -rf apache-tomcat-9.0.27.tar.gz
- WORKDIR /data/soft/
- ENTRYPOINT /data/soft/apache-tomcat-9.0.27/bin/startup.sh && tail -f /dev/null
- [[email protected] mydocker]# docker build -t tomcat:test .
- Sending build context to Docker daemon 500.2MB
- Step 1/5 : FROM jdk:latest
- ---> d8252cab0866
- Step 2/5 : ADD apache-tomcat-9.0.27.tar.gz /data/soft
- ---> d0f4873733b8
- Step 3/5 : RUN rm -rf apache-tomcat-9.0.27.tar.gz
- ---> Running in 7d54b3ccd7ca
- Removing intermediate container 7d54b3ccd7ca
- ---> 1f07735cd7da
- Step 4/5 : WORKDIR /data/soft/
- ---> Running in 90dfd42c6134
- Removing intermediate container 90dfd42c6134
- ---> 5704cc83ebb3
- Step 5/5 : ENTRYPOINT /data/soft/apache-tomcat-9.0.27/bin/startup.sh && tail -f /dev/null
- ---> Running in 5dd6eef5777e
- Removing intermediate container 5dd6eef5777e
- ---> d97a77aa1533
- Successfully built d97a77aa1533
- Successfully tagged tomcat:test
- [[email protected] mydocker]# docker run --name webserver -d -p 8080:8080 tomcat:test /bin/bash
- e13e5b4d7807b5dbeec0eb55192602ed60cb289b95d82a455cdb340581aba150
- [[email protected] mydocker]# netstat -lntp
- Active Internet connections (only servers)
- Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
- tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1093/sshd
- tcp6 0 0 :::8080 :::* LISTEN 48659/docker-proxy
- tcp6 0 0 :::22 :::* LISTEN 1093/sshd
通过浏览器访问
常用指令
注意问题
COPY ADD 使用问题会设计到权限的问题如何解决权限
可以使用 COPY --chown= 或者 ADD --chown= 去解决
在使用过程中 如 ADD 使用了. tar.gz 自动解压的功能, build 执行后, 包里面的权限是不会变化的. 然后 COPY 直接使用权限会直接更改为 root.
USER 的使用, 影响哪些使用
影响后面的 RUN CMD ENTRYPOINT 命令的执行身份, 注意的是 而 COPY 命令却不服从
WORKDIR 的使用
切换目录
一个事例
- RUN cd /test
- RUN echo "test">test.txt
请问最后镜像有 / test/test.txt 吗? 答: NO
解释: docker 里边有层的概念, 每个命令都是生成一个层, 每个层都是独立的空间. 所以第二个 RUN 时, 工作目录并不会切换到 / test 下面 .
最后用一张图解释常用指令的意义 ^-^
来源: http://www.bubuko.com/infodetail-3274236.html