Docker之Dockerfile使用

1.  Dockerfile常用命令

    

2.  常用命令详解

    1.  FROM

        FROM <imagesName:tag>

        指定基础镜像,必须是Dockerfile文件的第一个非注释行

    2.  MAINTAINER

        MAINTAINER Name <Email>

        指定维护者的信息

    3.  RUN

        1.  shell格式

            指定在容器中运行的命令,经常用于安装软件包等操作。当执行RUN指令时,会生成一个新的镜像层来保存这些内容。为了减少镜像体积,可以用&& 将多个命令放到单个RUN指令中执行。使用反斜杠\将单个RUN命令跨到下一行。

        2.  exec格式

            RUN ["程序名","参数1","参数2"]

    4.  ENV

        ENV <key> <value> 或者 ENV <key>=<value>

        指定设置的环境变量,可以在后续任何RUN命令中使用,并在容器运行时保持.

        这些环境变量可以通过docker run -e参数来进行修改

    5.  ARG

        定义变量,只能在构建时有效;效果和docker build --build-arg <key>=<value>一样

    6.  COPY

        格式为:COPY <src> <dest>

        用于复制本机的文件或目录到容器中,<src>指定源文件路径,<dest>指定目的路径。

        注意:

        1.  如果src是目录,其内部文件或者子目录将被递归复制,但是它本身不会被复制

        2.  如果指定多个src,或者在src中使用了通配符,则dest必须是一个目录,且必须以/结尾

        3.  如果dest事先不存在,它将会被自动创建,这包括其父目录路径

    7.  ADD  

        用法:add <src> <dest>

        注意:

        1.  如果src是压缩包,则解压;如果是url的压缩包,不会解压。

        2.  如果src是url,dest如果带有/,则最终的结果为dest的子目录;如果dest没有带/,在替换dest本身。

    8.  CMD

        配置容器启动后默认运行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条,则只有最后一条被执行。CMD可以在docker run 启动容器时被替换。  

    9.  ENTRYPOINT

        ENTRYPOINT["executable","param1","param2"]

        ENTRYPOINT command param1 param2 

        配置容器启动后运行的命令,与CMD指令相似,但区别在于ENTRYPOINT指令无法被覆盖。       

    10.  EXPOSE

        用于声明容器内服务的监控端口,该指令只是起到声明作用,并不会自动完成端口映射。如果要映射端口,需要在启动容器时使用-p 参数指定。

    11.  VOLUME

        设置容器内的目录,与宿主机上的/var/lib/docker/volumes目录进行映射。

    12.  WORKDIR

        指定容器的工作目录,在它后面执行的指令将以 <workdir>做为当前工作目录。

    13.  ONBUILD

        在构建镜像的时候不执行,而是在它的子镜像中执行

        1.  父镜像            

FROM centos  # 初始镜像
RUN yum install -y curl  # 执行安装curl命令
ENTRYPOINT ["curl", "-s", "http://ip.cn"] # 容器启动后执行的命令

# 如果有谁继承了我,则触发下面命令
ONBUILD RUN echo "father---image---onbuild====886"

        2.  构建父镜像

docker build -f /home/mydockerfile/Dockerfile_onbuild -t onbuild/father:1.0 .

        3.  子镜像

FROM onbuild/father:1.0  # 注意这里一定要加TAG版本,不然无法找到该镜像。 
RUN yum install -y curl  # 执行安装curl命令
CMD /bin/bash

        4.  构建子镜像

[root@192 mydockerfile]# docker build -f /home/mydockerfile/Dockerfile_onbuild_son -t onbuild/son:1.0 .
Sending build context to Docker daemon  6.144kB
Step 1/3 : FROM onbuild/father:1.0
# Executing 1 build trigger       # 看这三行,就是ONBUILD指令的效果
 ---> Running in 0a165ca6352c     # Executing 1 build trigger 执行1个构建触发器
father---image---onbuild====886   # 数据了父镜像ONBUILD指令执行的内容   
Removing intermediate container 0a165ca6352c
 ---> f9313959d1ae
Step 2/3 : RUN yum install -y curl
 ---> Running in 0485b0d9d031
Last metadata expiration check: 0:09:32 ago on Sat Mar 20 14:46:45 2021.
Package curl-7.61.1-14.el8_3.1.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
Removing intermediate container 0485b0d9d031
 ---> 0718c9a2d99a
Step 3/3 : CMD /bin/bash
 ---> Running in e102da5c1b5e
Removing intermediate container e102da5c1b5e
 ---> 46ed53584363
Successfully built 46ed53584363
Successfully tagged onbuild/son:1.0

    14.  LABEL

        添加元数据到镜像。每一个标签会生成一个layer,所以尽量使用一个LABEL标签          

    15.  HEALTHCHECK

        健康检查命令,用来检查容器启动运行时是否正常,若正常则返回healthy,否则返回unhealthy  

        HEALTHCHECK [OPTIONS] CMD command

        HEALTHCHECK --interval=5m --timeout=3s \

          CMD curl -f http://localhost/  || exit 1   

3.  书写Dockerfile需要注意的几个问题

    1.  镜像要轻量化,减少镜像的大小要从根本入手,基础镜像尽量选择简单而且稳定的发行版。减少软件依赖,仅安装需要的软件包,最后要记得清理缓存

    2.  使用.dockerignore排除无关文件

    3.  一个容器只做一件事,甚至一个容器只运行一个进程

    4.  减少构建命令

    5.  使用反斜杠\连接跨行的命令,提高Dockerfile易读性          

4.  使用Dockerfile构建镜像

    1.  nginx

        创建一个目录,mkdir -p /opt/dockerfile/nginx,在这个目录下创建一个文件Dockerfile。

        在文件的里面写入内容,如下:

        yum安装nginx        

[root@nfs-server nginx]# cat Dockerfile 
# This Dockerfile
#Base image
FROM centos

#Maintainer
MAINTAINER yangjianbo yangjianbo@cmr.net.cn

#Command
RUN yum install epel-release -y
RUN yum install nginx -y
RUN echo "daemon off;" >>/etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx"]

        编译安装nginx         

FROM docker.io/centos
MAINTAINER yangjianbo
 
#install nginx
RUN yum install -y pcre pcre-devel openssl openssl-devel gcc gcc+ wget vim net-tools
RUN useradd www -M -s /sbin/nologin
RUN cd /usr/local/src && wget http://nginx.org/download/nginx-1.8.0.tar.gz && tar -zxvf nginx-1.8.0.tar.gz
RUN cd /usr/local/src/nginx-1.8.0 && ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module && make && make install
 
ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /usr/local/nginx/logs/access.log              

        构建镜像

          docker build -t nginx:v1 -f /opt/dockerfile/nginx/Dockerfile .          

    2.  tomcat

        1.  构建JAVA环境

            1.  下载基础镜像

                docker pull docker.io/ansible/centos7-ansible

            2.  准备jdk和tomcat包,放到指定目录下

                mkdir -p /data/docker/system/tomcat            

            3.  构建tomcat镜像

                cd /data/docker/system/tomcat

                创建一个名为Dockerfile的文件,内容如下:

# This my first nginx Dockerfile
# Version 1.0

# Base images 基础镜像
FROM docker.io/ansible/centos7-ansible

#MAINTAINER 维护者信息
MAINTAINER yangjianbo

#ADD  文件放在当前目录下,拷过去会自动解压
ADD jdk-8u212-linux-x64.rpm /tmp/
ENV JAVA_HOME=/usr/java/jdk1.8.0_212-amd64 
ADD apache-tomcat-8.5.43.tar.gz /usr/local
COPY server.xml /usr/local/apache-tomcat-8.5.43/conf
#RUN 执行以下命令 
RUN rpm -ivh /tmp/jdk-8u212-linux-x64.rpm

    #设置时区
     RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

WORKDIR /usr/local/apache-tomcat-8.5.43
#EXPOSE 映射端口
EXPOSE 8080
ENTRYPOINT ["./bin/catalina.sh","run"]

                在当前目录下,执行下面的命令

                docker build -t tomcat:v1 -f /data/docker/system/tomcat/Dockerfile .

            4.  查看一下镜像

                docker images

            5.  利用创建的镜像,启动docker.

                docker run -itd --name=tomcat -p 8080:8080 -v /app/webapps:/usr/local/apache-tomcat-8.5.43/webapps -v /app/logs:/usr/local/apache-tomcat-8.5.43/logs tomcat:v1              

                注意:提前创建好/app/webapps和/app/logs两个目录,一个是war包目录,一个是日志目录。                         

posted @ 2023-05-22 11:07  奋斗史  阅读(1058)  评论(0)    收藏  举报