(六)Dokcerfile

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 一 、 指令 下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档。 FROM指定 base 镜像。 MAINTAINER设置镜像的作者,可以是任意字符串。 COPY将文件从 build context 复制到镜像。

一 、 指令

下面列出了 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我构建的一些常用的镜像

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
数据安全/隐私保护 Docker 容器
阿里云Docker仓库操作
阿里云Docker仓库操作
62456 3
阿里云Docker仓库操作
protobuf实战-----之Mac 安装篇
因为项目的需要,所以,要在mac上安装配置protobuf。其中走了不少弯路。
1510 0
|
5月前
|
Java Spring
关于Ribbon在SpringCloudAlibaba2021.1版本中,找不到服务实例
pringCloud 2020版本还是已经默认移除了ribbon.
161 0
|
6月前
|
Java Linux 开发工具
Linux安装Java
Linux安装Java
145 0
|
6月前
|
运维 Linux Docker
Linux运维工程师必须要掌握的Docker命令,我给你整理好了!
Linux运维工程师必须要掌握的Docker命令,我给你整理好了!
456 2
|
6月前
|
缓存 Java 应用服务中间件
Docker 镜像构建的最佳做法
Docker 镜像构建的最佳做法
148 1
|
6月前
|
存储 弹性计算 Linux
阿里云ECS(CentOS镜像)安装docker
阿里云ECS(CentOS镜像)安装docker
973 0
|
NoSQL Java 测试技术
Springboot2.x集成lettuce连接redis集群报超时异常Command timed out after 6 second(s)
最近在对一新开发Springboot系统做压测,发现刚开始压测时,可以正常对redis集群进行数据存取,但是暂停几分钟后,接着继续用jmeter进行压测时,发现redis就开始突然疯狂爆出异常提示:Command timed out after 6 second(s)......
395 0
|
XML Java 编译器
【Protobuf】Protobuf快速使用 Java版、Python版
 Protocol Buffers(简称为ProtoBuf)是一种用于序列化、结构化数据的语言无关、平台无关、可扩展的机制。它由Google开发并于2008年开源发布。
391 0