dockerfile是一种被docker程序解释的脚本,dockerfile是由一条条的指令组成的,每一条指令对应linux下面的一条命令docker程序将这些dockerfile指令翻译成真正的linux命令。dockerfile有自己的书写格式和支持的命令。docker程序解决这些命令之间的依赖关系,就类似于makefile docker程序将读取的dockerfile,根据指令生成定制的images,它明确的表明images是怎么产生的。有了dockerfile,在我们需要定制自己额外的需求时,只需要在dockerfile上添加或者修改指令就好了,重新生成image就可了,完全省去了敲命令的麻烦。
dockerfile由一条条的语句组成,并且支持#开头的为注释行
dockerfile的指令是忽略大小写的,建议使用大写,每一行只支持一条指令,每条指令都可以携带多个参数
dockerfile的指令根据作用可以分为两种,构建指令和设置指令,构建指令用于构建image,指定的操作不会在运行image容器上执行。设置指令用于设置images的属性,指定的操作将在运行image的容器中执行
一般的dockerfile分为四个部分:基础镜像信息,维护者信息,镜像操作指令和容器起哦的那个时执行的指令
本次测试环境OS:Centos7.2x86_64 本次采用基础image为Centos7
一、安装docker
[root@docker-yankerp docker]# yum install docker -y [root@docker-yankerp docker]# systemctl start docker
1)安装完docker后我们创建三个目录存放各自服务的dockerfile如下:
[root@docker-yankerp docker]# tree -L 2 --charset ASCII . |-- mysql | |-- Dockerfile | `-- my.cnf |-- nginx | |-- Dockerfile | `-- wordpress `-- php |-- Dockerfile `-- wordpress
wordpress就是我们的php源码
2)构建Nginx-dockerfile如下:
FROM docker.io/centos:latest MAINTAINER from <ywyankerp@163.com> RUN yum install gcc gcc-c++ openssl-devel automake autoconf libtool zlib-devel make pcre-devel wget net-tools -y RUN groupadd -g 900 nginx && useradd nginx -g nginx -s /sbin/nologin RUN wget http://nginx.org/download/nginx-1.12.2.tar.gz && tar zxf nginx-1.12.2.tar.gz RUN cd /nginx-1.12.2/ && ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-http_ssl_module --with-http_gzip_static_module --user=nginx --group=nginx RUN cd /nginx-1.12.2/ && make && make install RUN ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ RUN mkdir /www && chown nginx:nginx /www ADD wordpress /www/wordpress RUN sed -i '1afastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' /usr/local/nginx/conf/fastcgi_params RUN sed -i 's/index index.html index.htm;/index index.php index.html index.htm;/g' /usr/local/nginx/conf/nginx.conf RUN sed -i 's*root html;*root /www;*g' /usr/local/nginx/conf/nginx.conf RUN sed -i 's*# root html;* root /www;*g' /usr/local/nginx/conf/nginx.conf RUN sed -i 's/# fastcgi_pass 127.0.0.1:9000;/ fastcgi_pass 172.17.0.3:9000;/g' /usr/local/nginx/conf/nginx.conf RUN sed -i 's/# fastcgi_index index.php;/ fastcgi_index index.php;/g' /usr/local/nginx/conf/nginx.conf RUN sed -i 's*# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;* fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;*g' /usr/local/nginx/conf/nginx.conf RUN sed -i 's/# include fastcgi_params;/ include fastcgi_params;/g' /usr/local/nginx/conf/nginx.conf RUN sed -i '71d' /usr/local/nginx/conf/nginx.conf && sed -i 'N;70a}' /usr/local/nginx/conf/nginx.conf RUN sed -i '65d' /usr/local/nginx/conf/nginx.conf && sed -i 'N;64alocation ~ \\.php$ {' /usr/local/nginx/conf/nginx.conf EXPOSE 80 CMD ["nginx"]
在以上dockerfile中我没有把nginx.conf文件用拷贝的方式去弄,而是直接使用了sed命令去修改!
3)运行Nginx-dockerfile
运行结束如下:
运行结束后查看images是否生成
二、构建PHP-Dockerfile
php的dockerfile如下
FROM docker.io/centos:latest MAINTAINER from <ywyankerp@163.com> RUN yum install gcc gcc-c++ libxml2-devel libcurl-devel openssl-devel bzip2-devel openssl-devel automake autoconf libtool zlib-devel make pcre-devel wget net-tools -y RUN wget ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/libmcrypt/libmcrypt-2.5.7.tar.gz && tar zxf libmcrypt-2.5.7.tar.gz RUN cd libmcrypt-2.5.7/ && ./configure --prefix=/usr/local/libmcrypt && make && make install ;cd RUN wget http://cn2.php.net/distributions/php-5.6.27.tar.gz && tar zxf php-5.6.27.tar.gz RUN cd php-5.6.27/ && ./configure --prefix=/usr/local/php5.6 --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt=/usr/local/libmcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts && make && make install RUN groupadd -g 1001 nginx && useradd -u 900 nginx -g nginx -s /sbin/nologin RUN mkdir /www && chown -R nginx:nginx /www ADD wordpress /www/wordpress RUN cd php-5.6.27 && cp php.ini-production /etc/php.ini RUN cd /php-5.6.27 && cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm RUN chmod +x /etc/init.d/php-fpm && chkconfig --add php-fpm && chkconfig php-fpm on RUN cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf RUN sed -i 's*;pid = run/php-fpm.pid*pid = run/php-fpm.pid*g' /usr/local/php5.6/etc/php-fpm.conf RUN sed -i 's/user = nobody/user = nginx/g' /usr/local/php5.6/etc/php-fpm.conf RUN sed -i 's/group = nobody/group = nginx/g' /usr/local/php5.6/etc/php-fpm.conf RUN sed -i 's/listen = 127.0.0.1:9000/listen = 172.17.0.3:9000/g' /usr/local/php5.6/etc/php-fpm.conf RUN sed -i 's/pm.max_children = 5/pm.max_children = 50/g' /usr/local/php5.6/etc/php-fpm.conf RUN sed -i 's/pm.start_servers = 2/pm.start_servers = 5/g' /usr/local/php5.6/etc/php-fpm.conf RUN sed -i 's/pm.min_spare_servers = 1/pm.min_spare_servers = 5/g' /usr/local/php5.6/etc/php-fpm.conf RUN sed -i 's/pm.max_spare_servers = 3/pm.max_spare_servers = 35/g' /usr/local/php5.6/etc/php-fpm.conf EXPOSE 9000
1)运行php-dockerfile
注意以上图的末尾的. 表示dockerfile在当前路径。
2)运行结束如下:
3)查看php-image是否构建成功
三、构建MySQL-Dockerfile
MySQL-Dockerfile如下:
FROM docker.io/centos:latest MAINTAINER from <ywyankerp@163.com> RUN yum install -y gcc gcc-c++ make wget libaio RUN wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz RUN tar zxf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz && mv mysql-5.7.18-linux-glibc2.5-x86_64 /usr/local/mysql WORKDIR /usr/local/mysql/ RUN echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile && source /etc/profile WORKDIR /usr/local/mysql/ RUN mkdir /usr/local/mysql/data && mkdir /usr/local/mysql/log RUN groupadd mysql && useradd -r -g mysql -s /bin/false mysql ADD my.cnf /etc/my.cnf WORKDIR /usr/local/mysql RUN chmod 750 /usr/local/mysql/data/ RUN chown -R mysql /usr/local/mysql RUN chgrp -R mysql /usr/local/mysql WORKDIR /usr/local/mysql RUN ln -s /usr/local/mysql/bin/mysql /usr/local/bin RUN bin/mysqld --initialize --user=mysql RUN cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld EXPOSE 3306
My.cnf文件内容如下:
[client] socket=/usr/local/mysql/mysql.sock [mysqld] basedir=/usr/local/mysql datadir=/usr/local/mysql/data pid-file=/usr/local/mysql/data/mysqld.pid socket=/usr/local/mysql/mysql.sock log_error=/usr/local/mysql/log/mysql.err
1)运行Mysql-dockerfile
[root@docker-yankerp ~]# cd /docker/mysql/ [root@docker-yankerp mysql]# docker build -t="centos:mysql" .
2)运行结束如下:
查看所以的镜像
四、启动容器映射主机端口如下:
[root@docker-yankerp ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos mysql 6a4bd7770f0f About an hour ago 11.24 GB centos php 84b26690a2de 3 hours ago 1.067 GB centos nginx 2961bd52b14e 3 hours ago 503.6 MB docker.io/centos latest 328edcd84f1b 5 months ago 192.5 MB [root@docker-yankerp ~]# docker run -dit -p 80:80 centos:nginx /bin/bash 73d1bbeb0d5c213e997523e36d467565ed3ad189fa5d0b1c47b32853038fbb14 [root@docker-yankerp ~]# docker run -dit -p 9000:9000 centos:php /bin/bash 01eaea6c5453d739a00a4605ba62d711741cce33f2f41f4c86e73140a9c18a68 [root@docker-yankerp ~]# docker run -dit -p 3306:3306 centos:mysql /bin/bash 2b0fa469425d164ea28a5dfde8cd4b78a043bab640c6334f6fdcf24b32d4bc41
查看容器运行状态
后台进入容器开启相关的服务,MySQL添加授权用户。访问测试
mysql> create database wordpress; Query OK, 1 row affected (0.00 sec) mysql> grant all on wordpress.* to yankerp@'%' identified by '123456'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)
进入后台 docker exec -it images /bin/bash
访问测试: