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包目录,一个是日志目录。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号