Dockerfile常用指令介绍
指令 | 描述 |
---|---|
FROM | 构建的新镜像是基于哪个镜像。例如:FROM centos:6 |
MAINTAINER | 镜像维护者姓名或邮箱地址。例如:MAINTAINER Mr.chen |
RUN | 构建镜像时运行的Shell命令。例如:RUN ["yum","install","httpd"] |
或者RUN yum install httpd | |
CMD | 运行容器时执行的Shell命令(可以被运行时传递的参数覆盖)。例如:CMD ["-c","/start.sh"] |
或者CMD ["/usr/sbin/sshd","-D"]或者CMD /usr/sbin/sshd -D | |
EXPOSE | 声明容器运行的服务端口。例如:EXPOSE 80 443 |
ENV | 设置容器内环境变量。例如:ENV MYSQL_ROOT_PASSWORD 123456 |
ADD | 拷贝文件或目录到镜像(可以自动解压缩或者下载) |
例如:ADD ["src","dest"]或者ADD https://xxx.com/html.tar.gz /var/www/html | |
或者:ADD html.tar.gz /var/www/html | |
COPY | 拷贝文件或目录到镜像(不能自动解压缩)。例如:COPY ./start.sh /start.sh |
ENTRYPOINT | 运行容器时执行的Shell命令(不能被运行时传递的参数覆盖)。例如:ENTRYPOINT ["/bin/bash","-c","/start.sh"] |
或者ENTRYPOINT /bin/bash -c "/start.sh" | |
VOLUME | 指定容器挂载点到宿主机自动生成的目录或其他容器 |
例如:VOLUME ["/var/lib/mysql"] | |
USER | 为RUN,CMD和ENTRYPOINT执行命令指定运行用户 |
例如:USER Mr_chen | |
WORKDIR | 为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。 |
例如:WORKDIR /data | |
HEALTHCHECK | 健康检查。例如:HEALTHCHECK --interval=5m --timeout=3s --retries=3 |
CMD curl -f http://localhost/ || exit 1 | |
ARG | 在构建镜像时指定一些参数。例如:ARG user |
利用Dockerfile编写简单的nginxWeb镜像
#首先开启ipv4转发 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p net.ipv4.ip_forward = 1 #创建nginx的镜像目录 mkdir -p dockerfile/lib/centos/nginx cd dockerfile/lib/centos/nginx #准备Dockerfile文件 vim Dockerfile FROM centos:7 #构建的新镜像是基于哪个镜像(构建的nginx是基于centos7构建的,依赖centos7的系统支持,如果没有镜像自动下载) MAINTAINER wk #镜像制作人 RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel #构建镜像时运行shell命令,yum安装nginx的依赖包 ADD nginx-1.12.1.tar.gz /tmp #拷贝文件或目录到镜像下,遇到压缩文件自动解压缩 RUN cd /tmp/nginx-1.12.1 && \ #运行shell命令编译安装nginx,make -j 给与2个线程编译 ./configure --prefix=/usr/local/nginx && \ make -j 2 && \ make install RUN rm -rf /tmp/nginx-1.12.1* && yum clean all #删除nginx源码包和清空yum缓存,使容器最轻量化 COPY nginx.conf /usr/local/nginx/conf #拷贝文件或目录到镜像 WORKDIR /usr/local/nginx #为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。 EXPOSE 80 #声明容器的端口号 CMD ["./sbin/nginx", "-g", "daemon off;"] #运行容器时执行的shell命令 -g daemon off 不以守护进程的方式开启nginx,即不以后台运行的方式开启nginx
#将事先准备好的nginx-1.12.1.tar.gz和nginx.conf配置文件拷贝到当前目录下 ls Dockerfile nginx-1.12.1.tar.gz nginx.conf #build基于nginx的docker镜像 docker build -t nginx:1 .
#nginx主配置文件
cat conf/nginx.conf user root; worker_processes auto; error_log logs/error.log info; pid logs/nginx.pid; events { use epoll; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; root html; index index.html index.php; location ~ \.php$ { root html; fastcgi_pass lnmp_php:9000; #lnmp_ph为php容器主机名,对应的就是php的IP地址 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } }
构建PHP网站平台镜像
#创建php的镜像目录 mkdir -p /root/dockerfile/lib/centos/php cd /root/dockerfile/lib/centos/php #准备Dockerfile文件 vim Dockerfile FROM centos:7 #新镜像基于centos7镜像 MAINTAINER wk #新镜像制作人 RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel #运行shell安装依赖 ADD php-5.6.31.tar.gz /tmp/ #将安装包考到 /tmp下并自动解压缩 RUN cd /tmp/php-5.6.31 && \ #编译安装php,复制php启动文件.并修改启动文件的配置 ./configure --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php/etc \ --with-mysql --with-mysqli \ --with-openssl --with-zlib --with-curl --with-gd \ --with-jpeg-dir --with-png-dir --with-iconv \ --enable-fpm --enable-zip --enable-mbstring && \ make -j 4 && \ make install && \ cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \ sed -i "s/127.0.0.1/0.0.0.0/" /usr/local/php/etc/php-fpm.conf && \ sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf COPY php.ini /usr/local/php/etc #将php主配置文件拷贝进去 RUN rm -rf /tmp/php-5.6.31* && yum clean all #删除不用的文件,清空yum缓存使容器最轻量化 WORKDIR /usr/local/php #进入容器的位置,也是php程序的位置 EXPOSE 9000 #开启端口9000 CMD ["./sbin/php-fpm", "-c", "/usr/local/php/etc/php-fpm.conf"] #开启php -c 指定主配置文件 #将事先准备好的php.ini文件及php-5.6.31.tar.gz拷贝到当前目录下 ls Dockerfile php-5.6.31.tar.gz php.ini #build基于php的docker镜像 docker build -t php:1 .
创建nginx-php网络环境,并启动容器
#创建一个叫做lnmp的网络 docker network create lnmp dad428646d8f8278f36b80b3b960493aee8be1960bb1f505bfeebc97022b6385 docker network ls NETWORK ID NAME DRIVER SCOPE 0604a9338e1b bridge bridge local b68e9da0b1e6 host host local dad428646d8f lnmp bridge local cf4b2d0b4394 none null local #创建nginx-php网页挂载目录 mkdir -p /www #启动php容器 docker run -dit --name lnmp-php --net lnmp --mount type=bind,src=/www,dst=/usr/local/nginx/html php:1 5b49fc160f9e42364238a937149bbb475036b8a28feddf0fe05c1e70b414a151 #启动nginx容器 docker run -dit --name lnmp-nginx --net lnmp -p 8888:80 --mount type=bind,src=/www,dst=/usr/local/nginx/html nginx:1 7ce4d14cf756859e814186090a12b770916f150ed2a5fab2f0dc6ba8c347aab8 docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7ce4d14cf756 nginx:1 "./sbin/nginx -g 'da…" 16 seconds ago Up 15 seconds 0.0.0.0:8888->80/tcp lnmp-nginx 5b49fc160f9e php:1 "./sbin/php-fpm -c /…" 6 minutes ago Up 6 minutes 9000/tcp lnmp-php #创建测试页面php.info echo "<?php phpinfo();?>" > /www/index.php
通过浏览器进行访问测试