Docker 学习(十一)编写Dockerfile

目录

    • 1.常用指令讲解
    • 2.制作Hello World的Dockerfile
    • 3.制作.jar包的Dockerfile

1.常用指令讲解

FROM [镜像:版本]:指定所依赖的基础镜像

RUN <命令行命令>:等同于在终端执行的shell命令

RUN ["可执行文件", "参数1", "参数2"]:等同于在终端shell中执行 ./可执行文件

COPY <源文件> <目标文件> :将Dockerfile同目录下的文件拷贝到容器里面

ADD <源文件> <目标文件>:类似于COPY,区别在于如果文件是*.tar、*.gzip、*.bzip2等文件,会自动解压缩(注意:支持解压tar、gzip和bzip2文件,但不会自动解压zip文件)

  • 复制某个目录及子目录下的文件:ADD 和 COPY 都无法实现
  • 只复制某个目录下的文件,不复制子目录:ADD mydir/* /mydir/
  • 解压zip文件示例:
ADD my.zip /opt/webapps/my.zip
RUN unzip -d /opt/webapps/my /opt/webapps/my.zip

CMD <命令行命令>:类似于RUN,区别在于:

  • RUN 是在 docker build 时运行
  • CMD 是在 docker run 时运行
  • 存在多个 CMD 指令,仅最后一个生效
  • CMD 会被 docker run 的命令行参数指定的--entrypoint 选项所覆盖

ENTRYPOINT ["<可执行命令>", "<参数1>", "<参数22>"]:类似于CMD,存在多个 ENTRYPOINT 指令,仅最后一个生效,区别在于:

  • ENTRYPOINT 不会被 docker run 的命令行参数指定的指令所覆盖

  • ENTRYPOINT 可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,比如:

    FROM nginx
    
    ENTRYPOINT ["nginx", "-c"] # 定参
    CMD ["/etc/nginx/nginx.conf"] # 变参 
    
    • 不传参:

      $ docker run nginx:test
      

      容器内会执行如下命令:

      $ nginx -c /etc/nginx/nginx.conf
      
    • 传参:

      $ docker run nginx:test -c /etc/nginx/new.conf
      

      容器内会执行如下命令:

      $ nginx -c /etc/nginx/new.conf
      

ENV:设置环境变量,示例:

ENV NODE_VERSION 7.2.0

RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

ARG:类似于ENV,区别在于 ARG 只在 docker build 过程中有效,build 好之后,镜像内不存在设定的环境变量。

VOLUME:定义挂载数据卷,一般为/tmp,作用是避免容器内数据因为重启而丢失。

EXPOSE:声明暴露端口,docker run -P 时会自动映射EXPOSE指定的端口,-p 会覆盖声明的端口。

WORKDIR:指定工作目录,指定的工作目录,会在构建的镜像的每一层都在。(WORKDIR 指定的工作目录,必须是提前创建好的)。docker build 过程中,每一个RUN命令都是新建的一层,只有通过 WORKDIR 创建的目录会一直存在。

LABEL:给镜像添加标签,以键值对的形式存在,比如添加镜像的作者:

LABEL org.opencontainers.image.authors="acgkaka"

注意: Dockerfile 的每一行指令都会在docker上新建一层,为了避免镜像过大,尽量将命令写在同一行,例如:

FROM centos
RUN yum -y install **wget**
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"

合并为:

FROM centos
RUN yum -y install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

参考:Dockerfile|菜鸟教程


2.制作Hello World的Dockerfile

1)创建一个空白目录

2)在空白目录中新建一个Dockerfile文本文件:

FROM centos
# 只是单纯的打印"hello world"
RUN echo "hello world"

3)用命令行打开当前目录,输入如下内容

docker build -t hello_world .(最后有一个点)

Docker 学习(十一)编写Dockerfile_第1张图片

4)查看docker镜像

docker images

Docker 学习(十一)编写Dockerfile_第2张图片

5)创建容器

docker run -d --name=hello_world hello_world

请添加图片描述

6)启动容器

docker start hello_world

Docker 学习(十一)编写Dockerfile_第3张图片

7)补充

删除容器:docker rm -f hello_world

删除镜像:docker rmi hello_world

3.制作.jar包的Dockerfile

1)在main路径下创建Dockerfile

Docker 学习(十一)编写Dockerfile_第4张图片

2)在Dockerfile中填写如下内容:

# 依赖于oracle官方JDK8
FROM openjdk:8-jdk-alpine
# 将本地路径/tmp挂载到容器
VOLUME /tmp
# 拷贝jar包 eureka-server.jar为目标jar包,重命名为app.jar
COPY eureka-server.jar app.jar
# 运行jar包
ENTRYPOINT [ "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar" ]

3)将jar包复制到docker文件夹下

Docker 学习(十一)编写Dockerfile_第5张图片

4)用命令行打开当前目录,执行如下命令

docker build -t eureka-server:0.0.1 .(最后有一个点)

Docker 学习(十一)编写Dockerfile_第6张图片

5)查看镜像

Docker 学习(十一)编写Dockerfile_第7张图片

6)制作并启动容器

docker run -d --name=eureka-server -p 1001:6001 eureka-server:0.0.1(注:宿主机端口:容器端口)

Docker 学习(十一)编写Dockerfile_第8张图片

7)查看容器日志

docker logs -f --tail=20 eureka-server

Docker 学习(十一)编写Dockerfile_第9张图片

8)访问eureka页面

Docker 学习(十一)编写Dockerfile_第10张图片

整理完毕,完结撒花~

你可能感兴趣的:(Docker,docker)