初入Docker殿堂,记录一下自己学习过程中的点滴,望大神指点迷津。
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
docker镜像:类似操作系统中的基础文件以及软件运行环境,包含程序、库、资源、配置等文件,以及一些为运行时准备的配置参数(如匿名卷、环境变量、用户等)。
docker容器:运行起来的镜像。
由于本次学习主要内容为Dockerfile,所以容器与镜像的细节学习可以参考【10张图带你深入理解Docker容器和镜像】
Dockerfile其实就是安装docker镜像的步骤。如果使用Linux系统较多的同学就知道,当安装一个空白的Linux服务器的时候,需要安装各种软件以及配置各种参数,这个服务器才可以运行PHP或者Java,而这个Dockerfile其实就是将平时一个服务器安装和配置的步骤写到该文件中,然后执行,docker就会自动按照这些步骤去配置好对应的docker镜像。
关于Dockerfile中的语法可以参考如下文档:【如何写Dockerfile,Dockerfile 参考文档】
以下是我自己学习过程中第一次编写的Dockerfile文件,主要作用是服务器在docker中运行在Centos+PHP+Nginx的环境
# 获取centos最新版本作为基础镜像,此时我们相当于拥有了一个最基本的centos系统,
# 如果使用ubuntu系统作为基础,则后续安装命令使用ubuntu下的命令即可
FROM centos:latest
# 设置生成的images的作者
MAINTAINER destinylord [email protected]
# ENV指令有两种形式。
# 第一种形式,ENV ,将单个变量设置为一个值。
# 第一个空格后面的整个字符串将被视为 - 包括空格和引号等字符。
# 第二种形式,ENV = ...,允许一次设置多个变量。
# 注意,第二种形式在语法中使用等号(=),而第一种形式不使用。与命令行解析类似,引号和反斜杠可用于在值内包含空格。
# nginx版本号
ENV NGINX_VERSION 1.15.0
# php版本号
ENV PHP_VERSION 7.2.7
# RUN指令将在当前image之上的新层中执行任何命令,并提交结果。生成的已提交image将用于Dockerfile中的下一步。
# RUN有2种形式:
# RUN (*shell*形式,命令在shell中运行,Linux上为/bin/sh -c,Windows上为cmd /S/C)
# RUN ["executable","param1","param2"](exec 形式)
RUN localedef -i en_US -f UTF-8 en_US.UTF-8
# 更换yum源
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \
&& curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 安装基础工具
RUN yum install vim wget git net-tools -y
# 安装supervisor
RUN yum install python-setuptools -y && easy_install supervisor
# ADD指令从复制新文件,目录或远程文件URL,并将它们添加到容器的文件系统,路径。
# 配置supervisord
ADD ./etc/supervisord.conf /etc/
# 添加www用户
RUN mkdir -p /data/www \
&& useradd -r -s /sbin/nologin -d /data/www -m -k no www
# 安装必要组件
RUN yum install epel-release -y && yum update -y \
&& yum -y install pcre \
pcre-devel \
zlib \
zlib-devel \
openssl \
openssl-devel \
libxml2 \
libxml2-devel \
libjpeg \
libjpeg-devel \
libpng \
libpng-devel \
curl \
curl-devel \
libicu \
libicu-devel \
libmcrypt \
libmcrypt-devel \
freetype \
freetype-devel \
libmcrypt \
libmcrypt-devel \
autoconf \
gcc-c++
# 安装freetds
# 下载地址可以自行寻找,freetds0.91版本
WORKDIR /usr/src
RUN wget -O freetds.tar.gz #下载地址放这后请替换该备注 \
&& mkdir freetds && tar -xzvf freetds.tar.gz -C ./freetds --strip-components 1
WORKDIR freetds
RUN ./configure --prefix=/usr/local/freetds \
--with-tdsver=7.1 \
--enable-msdb \
&& make && make install \
&& mv /usr/local/freetds/etc/freetds.conf /usr/local/freetds/etc/freetds.conf.bak \
&& echo -e "[global] \n\
# TDS protocol version \n\
tds version = 8.0 \n\
# Whether to write a TDSDUMP file for diagnostic purposes \n\
# (setting this to /tmp is insecure on a multi-user system) \n\
; dump file = /tmp/freetds.log \n\
; debug flags = 0xffff \n\
# Command and connection timeouts \n\
; timeout = 10 \n\
; connect timeout = 10 \n\
# If you get out-of-memory errors, it may mean that your client \n\
# is trying to allocate a huge buffer for a TEXT field. \n\
# Try setting 'text size' to a more reasonable limit \n\
text size = 64512 \n\
# A typical Sybase server \n\
[egServer50] \n\
host = symachine.domain.com \n\
port = 5000 \n\
tds version = 5.0 \n\
# A typical Microsoft server \n\
[egServer70]Sybase \n\
host = ntmachine.domain.com \n\
port = 1433 \n\
tds version = 7.0 \n\
[mysqlserver] \n\
host = 127.0.0.1 \n\
port = 1433 \n\
tds version = 8.0 \n\
client charset=utf-8" >> /usr/local/freetds/etc/freetds.conf
# 安装php
WORKDIR /usr/src
RUN wget -O php.tar.gz "http://php.net/get/php-${PHP_VERSION}.tar.gz/from/this/mirror" \
&& mkdir php && tar -xzvf php.tar.gz -C ./php --strip-components 1
WORKDIR php
RUN ./configure --prefix=/usr/local/php \
--with-config-file-path=/etc/php \
--with-freetype-dir=/usr/include/freetype2/freetype \
--with-jpeg-dir=/usr/lib64 \
--with-fpm-user=www \
--with-fpm-group=www \
--with-gd \
--with-zlib \
--with-iconv \
--with-curl \
--with-mcrypt \
--with-openssl \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-pdo-dblib=/usr/local/freetds/ \
--enable-soap \
--enable-mbstring=all \
--enable-sockets \
--enable-fpm \
--enable-libxml \
--enable-xml \
--enable-intl \
--enable-zip \
--enable-pcntl \
--enable-bcmath \
--enable-maintainer-zts \
--disable-debug \
&& make && make install \
&& mkdir /etc/php \
&& cp /usr/src/php/php.ini-development /etc/php/php.ini \
&& cp /usr/src/php/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm && chmod +x /etc/init.d/php-fpm
WORKDIR /usr/local/php/etc
RUN cp php-fpm.conf.default php-fpm.conf \
&& sed -i "s/;daemonize = yes/daemonize = no/" php-fpm.conf \
&& cp ./php-fpm.d/www.conf.default ./php-fpm.d/www.conf \
&& sed -i "s/;clear_env = no/clear_env = no/" ./php-fpm.d/www.conf \
&& sed -i "s/export PATH/PATH=\/usr\/local\/php\/bin:\$PATH\nexport PATH/" /etc/profile \
&& sed -i "s/export PATH/PATH=\/etc\/init.d:\$PATH\nexport PATH/" /etc/profile
RUN ln -s /usr/local/php/bin/php /usr/bin/php
# 安装nginx
WORKDIR /usr/src
RUN wget -O nginx.tar.gz http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz \
&& mkdir nginx && tar -zxvf nginx.tar.gz -C ./nginx --strip-components 1
WORKDIR nginx
RUN ./configure --prefix=/usr/local/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=www \
--group=www \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/tmp/nginx/client/ \
--http-proxy-temp-path=/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/tmp/nginx/fcgi/ \
--with-pcre \
--with-http_dav_module \
&& make && make install \
&& mkdir -p -m 777 /tmp/nginx \
&& echo "#!/bin/sh" > /etc/init.d/nginx \
&& echo "#description: Nginx web server." >> /etc/init.d/nginx \
&& echo -e "case \$1 in \n\
restart): \n\
/usr/local/nginx/sbin/nginx -s reload \n\
;; \n\
stop): \n\
/usr/local/nginx/sbin/nginx -s stop \n\
;; \n\
*): \n\
/usr/local/nginx/sbin/nginx \n\
;; \n\
esac \n" >> /etc/init.d/nginx \
&& chmod +x /etc/init.d/nginx
# 更新nginx配置&&新增项目配置
ADD ./etc/nginx/nginx.conf /etc/nginx/
ADD ./etc/nginx/sites.d/*.conf /etc/nginx/sites.d/
# 安装必要的服务
RUN yum install vixie-cron crontabs -y \
&& cd /usr/src && /usr/local/php/bin/php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& /usr/local/php/bin/php composer-setup.php \
--install-dir=/usr/local/bin --filename=composer \
&& rm -rf composer-setup.php
RUN composer config -g repo.packagist composer https://packagist.laravel-china.org
# 更新pecl
RUN /usr/local/php/bin/pecl channel-update pear.php.net
# 安装php redis扩展
RUN /usr/local/php/bin/pecl install redis && echo "extension=redis.so" >> /etc/php/php.ini
# 安装php swoole扩展
#RUN /usr/local/php/bin/pecl install swoole && echo "extension=swoole.so" >> /etc/php/php.ini
# 安装php hprose扩展
#RUN /usr/local/php/bin/pecl install hprose && echo "extension=hprose.so" >> /etc/php/php.ini
# 清理
RUN yum clean all && /usr/local/php/bin/pecl clear-cache
# 创建文件夹
VOLUME ["/var/log/supervisord/"]
# 设置启动页查看phpinfo
ADD index.php /data/www/
# 配置生效
RUN source /etc/profile
# 开启端口
EXPOSE 80
# 运行supervisord
CMD ["/usr/bin/supervisord"]
完成该文件后,在同级目录执行以下命令,则可以拥有一个完整的Linux+Nginx+PHP的环境。
docker build -t lnp/lnp .
docker run -d -p 80:80 --name lnp lnp/lnp