博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(六)Dokcerfile
阅读量:5773 次
发布时间:2019-06-18

本文共 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/html
ADD html.tar.gz /var/www/html

ENV

设置环境变量,环境变量可被后面的指令使用。例如:
...

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 -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a4293f10e010 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 9000
LISTEN 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/

你可能感兴趣的文章
服务器代理(proxy)
查看>>
以太网
查看>>
Linux下PHP Oracle客户端扩展(OCI8)安装
查看>>
MySQL主从配置
查看>>
windows环境中python3.5下安装paramiko
查看>>
群集技术全接触
查看>>
基于RTSP的实现多媒体文件下载
查看>>
epoll的一点总结
查看>>
grub密码
查看>>
PDF怎么裁剪页面,PDF裁剪页面的方法
查看>>
Java常用小笔记
查看>>
oracle技术之oracle CLUVFY工具(一)
查看>>
AIX 进程管理
查看>>
一个简单的生产消费者示例
查看>>
MySQL备份脚本V2(添加日志功能及备份后检查)
查看>>
cookie小应用
查看>>
我的友情链接
查看>>
冲刺第七天
查看>>
Windows server 2008 搭建×××服务
查看>>
Python重启深信服设备
查看>>