本文共 4764 字,大约阅读时间需要 15 分钟。
下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档。
FROM
指定 base 镜像。MAINTAINER
设置镜像的作者,可以是任意字符串。COPY
将文件从 build context 复制到镜像。COPY 支持两种形式:COPY src dest
COPY ["src", "dest"]
注意:src 只能指定 build context 中的文件或目录。
ADD
与 COPY 类似,从 build context 复制文件到镜像。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。eg:ADD ADD /var/www/htmlADD html.tar.gz /var/www/htmlENV
设置环境变量,环境变量可被后面的指令使用。例如:...ENV MY_VERSION 1.3
RUN apt-get install -y mypackage=$MY_VERSION
...
EXPOSE
指定容器中的进程会监听某个端口,Docker 可以将该端口暴露出来。我们会在容器网络部分详细讨论。VOLUME
将文件或目录声明为 volume。我们会在容器存储部分详细讨论。WORKDIR
为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。RUN
在容器中运行指定的命令。CMD
容器启动时运行指定的命令。Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效。CMD 可以被 docker run 之后的参数替换。ENTRYPOINT
设置容器启动时运行的命令。Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效。CMD 或 docker run 之后的参数会被当做参数传递给 ENTRYPOINT。Q1:
RUN CMD ENTRYPOINT指令有什么区别1.run在building时可以写多条2.CM和ENTRYPOINT在运行container运行时只能写一条 如果写了多条只有最后一条才生效3.CMD在run时可以被command覆盖 entrypoint不会被command覆盖,蛋可以指定entrypoint覆盖构建命令:
docker buld -t name:tag . 指定名称 在当前目录寻找
-f 指定dockerfile位置 同样也可以指定url等PHP环境的构建
FROM centos:6.6MAINTAINER shuchao##保证服务器与容器有相同的时间RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ##安装yum源以及软件RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpmRUN rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpmRUN yum install -y php70w libmemcached10RUN yum install -y php70w-fpm php70w-mbstring php70w-gd php70w-dom php70w-xml php70w-pdo php70w-mysqlnd php70w-mcrypt php70w-process php70w-pear php70w-cli php70w-devel php70w-opcache php70w-soapRUN sed -E -i "s/^error_log = \/var\/log\/php-fpm\/error.log/error_log = \/data\/logs\/php\/fpm-error.log/" /etc/php-fpm.confRUN sed -E -i "s/^listen =.+?$/listen = 0.0.0.0:9000/" /etc/php-fpm.d/www.conf RUN sed -E -i "s/^listen.allowed_clients =.+?$/; listen.allowed_clients = 127\.0\.0\.1/" /etc/php-fpm.d/www.confRUN sed -E -i "s/^slowlog = \/var\/log\/php-fpm\/www-slow.log/slowlog = \/data\/logs\/php\/php-slow.log/" /etc/php-fpm.d/www.conf RUN sed -E -i "s/^php_admin_value\[error_log\] =.+?$/php_admin_value\[error_log\] = \/data\/logs\/php\/php-error.log/" /etc/php-fpm.d/www.conf RUN { \ echo "catch_workers_output = yes"; \} >> /etc/php-fpm.d/www.confRUN sed -E -i "s/^post_max_size =.+?$/post_max_size = 100M/" /etc/php.iniRUN sed -E -i "s/^upload_max_filesize =.+?$/upload_max_filesize = 100M/" /etc/php.iniRUN sed -E -i "s/^display_errors .+?$/display_errors = On/" /etc/php.iniRUN sed -E -i "s/^error_reporting .+?$/error_reporting = E_ALL\ \&\ \~E_DEPRECATED\ \&\ \~E_STRICT\ \&\ \~E_NOTICE/" /etc/php.iniRUN sed -E -i "s/^;error_log = php_errors.log/error_log = \/data\/logs\/php\/cli_error.log/" /etc/php.ini#创建php目录 这里是最后要挂载出来以便实现代码更新用的RUN mkdir -p /data/www && chmod 777 -R /data/wwwRUN mkdir -p /data/logs/php && chmod 777 -R /data/logs##添加扩展库 比如mysql memcache这些的 ADD ./ext/*.ini /etc/php.d/ADD ./ext/*.so /usr/lib64/php/modules/#crontab 以便于php一些定时脚本能跑起来RUN yum install -y vixie-cronRUN chkconfig crond onRUN sed -E -i "s/account required pam_loginuid.so/account optional pam_loginuid.so/" /etc/pam.d/crond #对外暴露的端口EXPOSE 9000CMD ["php-fpm", "-F"]
然后执行docker build -t php7:latest . 就可以把镜像构建出来了
测试:
[root@docker php7]# docker run -it --name php -p 9000:9000 php7:latest[07-Nov-2017 17:02:56] NOTICE: fpm is running, pid 1[07-Nov-2017 17:02:56] NOTICE: ready to handle connections```
测一波:
在真机上Chain DOCKER (1 references)target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:9000另外[root@docker php7]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa4293f10e010 php7:latest "php-fpm -F" 29 minutes ago Up 29 minutes 0.0.0.0:9000->9000/tcp php然后[root@docker php7]# ss -tpln | grep 9000LISTEN 0 128 :::9000 :::* users:(("docker-proxy-cu",pid=8485,fd=4))[root@docker php7]# telnet 127.0.0.1 9000Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.
这个时候这个容器就可以作为即用即销的php-fpm容器 9000端口就可以用来处理php脚本了。在大型的集成项目中 php集装箱就做好了,下一次就可以和其他容器堆叠在一起组成一个庞大的底层。
Nginx的构建
FROM centos:6.6MAINTAINER hexinRUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpmRUN yum install -y nginxRUN echo "daemon off;" >> /etc/nginx/nginx.confRUN mkdir -p /data/www /etc/nginx/includes && chown -R nginx:nginx /data/wwwRUN sed -E -i '/include \/etc\/nginx\/conf\.d\/\*\.conf/ a\ include\ \/etc\/nginx\/sites-enabled\/*\.conf;' /etc/nginx/nginx.confRUN sed -E -i 's/worker_processes 1;/worker_processes 4;/' /etc/nginx/nginx.confRUN mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.saveEXPOSE 80 443 8000CMD ["nginx"]网站的目录使用nginx挂载的方法实现
Mysql建议使用官方镜像 用参数实现mysql密码 建库的传递
我构建的一些常用的镜像
转载地址:http://oyoux.baihongyu.com/