一、概述
Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。
1、FROM 镜像:Tag
构建指令,必须指定且需要在Dockerfile文件中其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库。
2、MAINTAINER 作者信息
构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。
-
RUN 命令
构建指令,RUN可以运行任何被基础image支持的命令并提交到新的镜像中。如基础image选择ubuntu,那么软件管理部分只能使用ubuntu的命令。
-
CMD [“要运行的程序” , ”参数1” , ”参数2”]
设置指令,用于container(容器)启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次(最后一行),如果有多个CMD命令,则只执行最后一条。
5、ENTRYPOINT(设置container启动时执行的操作)
设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。
6、USER 用户名/UID
设置指令,设置启动容器的用户,默认是root用户。
7、EXPOSE 端口
设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不使用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。
8、ENV 环境变量 变量值
构建指令,在image中设置一个环境变量。
设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:ENV JAVA_HOME /usr/local/java
9、ADD 源文件 目标文件
构建指令,ADD命令相对于COPY命令,可以解压缩文件并把它们添加到镜像中的功能,如果我们有一个压缩文件包,并且需要把这个压缩包中的文件添加到镜像中。需不需要先解开压缩包然后执行 COPY 命令呢?当然不需要!我们可以通过 ADD 命令一次搞定。
同时ADD还可以从 url 拷贝文件到镜像中,但官方不推荐这样使用,官方建议我们当需要从远程复制文件时,最好使用 curl 或 wget 命令来代替 ADD 命令。原因是,当使用 ADD 命令时,会创建更多的镜像层,当然镜像的 size 也会更大,所以ADD命令官方推荐只有在解压缩文件并把它们添加到镜像中时才需要。
10、COPY 源文件 目标文件
COPY命令用于将于Dockerfile所在目录中的文件在镜像构建阶段从宿主机拷贝到镜像中,对于文件而言可以直接将文件复制到镜像中,对于目录而言,该命令只复制目录中的内容而不包含目录自身
11、VOLUME [“目录”]
设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。
12、WORKDIR 目录
设置指令相当于cd命令,为后续RUN,CMD,ENTRYPOINT指定工作目录。
13、ONBUILD 命令
指定所生产的镜像作为一个基础镜像时所要运行的命令
14、HEALTHCHECK
健康检查
在编写 Dockerfile 时,有严格的格式需要遵循:第一行必须使用 FROM 指令指明所基于的镜像名称;之后使用 MAINTAINER 指令说明维护该镜像的用户信息;然后是镜像操作相关指令,如 RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。最后使用 CMD 指令指定启动容器时要运行的命令操作。
二、部署sshd(基于本地)
基于Dockerfile制作镜像时首先需要建立工作目录,作为生成镜像的工作目录,然后分别创建并编写 Dockerfile文件、需要运行的脚本文件以及要复制到容器中的文件。
vim /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
search localdomain
vim /etc/sysconfig/network-scripts/ifcfg-ens33
添加
DNS1=8.8.8.8
systemctl restart network
systemctl restart docker
cat centos-7-x86_64.tar.gz | docker import - centos:7
mkdir sshd
ssh-keygen
cp .ssh/id_rsa.pub sshd/
cd sshd
vim Dockerfile
#基于的基础镜像
FROM centos:7
#镜像作者信息
MAINTAINER Crushlinux <syh@163.com>
#镜像执行的命令
RUN yum -y install openssh-server net-tools openssh-devel lsof telnet
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
ADD id_rsa.pub /root/.ssh/authorized_keys
#定义时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#开启 22 端口
EXPOSE 22
#启动容器时执行指令
CMD ["/usr/sbin/sshd" , "-D"]
docker build -t sshd:new . 运行Dockerfile
docker images sshd:new 查看镜像
测试
docker run -d -p 2222:22 --name sshd-test --restart=always sshd:new
ssh localhost -p 2222
三、部署httpd(yum安装)
ssh localhost -p 2222
mkdir httpd
cd httpd
vim Dockerfile
FROM centos:7
MAINTAINER Crushlinux <syh@163.com>
RUN yum -y install httpd
RUN echo "syh.123" >/var/www/html/index.html
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
EXPOSE 80
CMD ["httpd","-DFOREGROUND"]
docker build -t httpd:new .
docker images httpd
测试
四、部署nginx(源码安装)
mkdir nginx
cd nginx/
编写启动脚本
vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
vim Dockerfile
#基于的基础镜像
FROM centos:7
#镜像作者信息
MAINTAINER Crushlinux <syh@163.com>
#安装相关依赖包
RUN yum install -y wget proc-devel net-tools gcc zlib zlib-devel make openssl-devel
#下载并解压nginx源码包
RUN wget http://nginx.org/download/nginx-1.19.0.tar.gz && tar zxf nginx-1.19.0.tar.gz
#编译安装nginx
RUN cd nginx-1.19.0 && ./configure --prefix=/usr/local/nginx && make && make install
#开启 80
EXPOSE 80
#修改 Nginx 配置文件,以非 daemon 方式启动
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
#定义时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#复制服务启动脚本并设置权限
ADD run.sh /run.sh
RUN chmod 775 /run.sh
#启动容器时执行脚本
CMD ["/run.sh"]
docker build -t nginx:new .
docker images nginx:new
docker run -d -p 8000:80 --name nginx-test --restart=always nginx:new