(六)Dokcerfile

一 、 指令

下面列出了 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 https://a.b.c/c.tar.gz /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.6

MAINTAINER shuchao <hexincloud@gmail.com>
##保证服务器与容器有相同的时间
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  
##安装yum源以及软件
RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
RUN rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
RUN yum install -y php70w libmemcached10
RUN 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-soap
RUN sed -E -i "s/^error_log = \/var\/log\/php-fpm\/error.log/error_log = \/data\/logs\/php\/fpm-error.log/" /etc/php-fpm.conf
RUN 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.conf
RUN 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.conf
RUN sed -E -i "s/^post_max_size =.+?$/post_max_size = 100M/" /etc/php.ini
RUN sed -E -i "s/^upload_max_filesize =.+?$/upload_max_filesize = 100M/" /etc/php.ini
RUN sed -E -i "s/^display_errors .+?$/display_errors = On/" /etc/php.ini
RUN sed -E -i "s/^error_reporting .+?$/error_reporting = E_ALL\ \&\ \~E_DEPRECATED\ \&\ \~E_STRICT\ \&\ \~E_NOTICE/" /etc/php.ini
RUN 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/www
RUN 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-cron
RUN chkconfig crond on
RUN sed -E -i "s/account    required   pam_loginuid.so/account    optional   pam_loginuid.so/" /etc/pam.d/crond 

#对外暴露的端口
EXPOSE 9000

CMD ["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 9000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

这个时候这个容器就可以作为即用即销的php-fpm容器 9000端口就可以用来处理php脚本了。在大型的集成项目中 php集装箱就做好了,下一次就可以和其他容器堆叠在一起组成一个庞大的底层。

Nginx的构建

FROM centos:6.6

MAINTAINER hexin
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
RUN yum install -y nginx

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN mkdir -p /data/www /etc/nginx/includes && chown -R nginx:nginx /data/www
RUN sed -E -i '/include \/etc\/nginx\/conf\.d\/\*\.conf/ a\    include\ \/etc\/nginx\/sites-enabled\/*\.conf;' /etc/nginx/nginx.conf
RUN sed -E -i 's/worker_processes  1;/worker_processes  4;/' /etc/nginx/nginx.conf
RUN mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.save

EXPOSE 80 443 8000

CMD ["nginx"]
网站的目录使用nginx挂载的方法实现 

Mysql建议使用官方镜像 用参数实现mysql密码 建库的传递

https://github.com/kobe2112240/DockerFile我构建的一些常用的镜像

上一篇:浙江理工大学-阿里云“数据工程训练营”成功举行


下一篇:让OutLook不再收到Lync呼叫日志邮件