Dockerfile源码分离部署LNMP(Centos7)

网友投稿 232 2022-10-31

Dockerfile源码分离部署LNMP(Centos7)

Dockerfile常用指令:

9、ENTRYPOINT:运行容器是执行的shell命令例如:ENTRYPOINT ["/bin/bash","-c","/start.sh"]ENTRYPOINT /bin/bash -c '/start.sh'10、VOLUME:指定容器挂载点到宿主机自动生成的目录或其他容器例如:VOLUME ["/var/lib/mysql"]11、USER :为RUN、CMD、和ENTRYPOINT执行命令指定运行用户USER [:] OR USER [:]例如:USER sunpengjun12、WORKDIR:为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录例如:WORKDIR /data13、HEALTHCHECK:健康检查14、ARG:构建时指定一些参数例如:FROM centosARG userUSER $user

注意1、RUN在building时运行,可以写多条2、CMD和ENTRYPOINT在运行container时运行,只能写一条,如果写多条,最后一条生效。3、CMD在run时可以被COMMAND覆盖,ENTRYPOINT不会被COMMAND覆盖,但可以指定--entrypoint覆盖。

Docker缓存特性:

如果在相同层中,需要用到之前缓存过的镜像,就无需重新下载。但如果此镜像层上层发生变化,即使是在相同层,也用不了缓存。如果非要不使用缓存可以加上--no-cache参数。

Dockerfile 中每一个指令都会创建一个镜像层,上层是依赖于下层的。无论什么时候,只要某一层发生变化,其上面所有层的缓存都会失效。也就是说,如果我们改变 Dockerfile 指令的执行顺序,或者修改或添加指令,都会使缓存失效。

Dockerfile的优势:

通过dockerfile制作镜像,能够很明显的看到镜像每一层的操作,安全性高,并且可移植操作性强。

Dockerfile分离部署LNMP(二进制安装):

准备部署工作:

1,解决容器固定ip地址问题:保证容器重启后,ip地址不会改变,且方便管理和操作。

1)自定义网络: [root@sqm-docker01 nginx]# docker network create -d bridge --subnet 172.16.10.0/24 --gateway 172.16.10.1 mynet1

2,创建挂载目录:网页根目录:/nginx]# mkdir /wwwroot [root@sqm-docker01 nginx]# mkdir /docker_conf

部署nginx:

[root@sqm-docker01 ~]# vim Dockerfile 代码如下:

FROM centos:7 ADD nginx-1.8.0.tar.gz / ADD nginx-sticky-module.zip / ADD ngx_cache_purge-2.3.tar.gz / RUN yum -y install gcc* pcre-devel openssl-devel zlib-devel unzip make vim net-tools elinks tree \ && groupadd nginx \ && useradd nginx -g nginx -s /sbin/nologin WORKDIR nginx-1.8.0/ RUN ./configure --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-\ --with-\ --with-\ --with-\ --\ --\ --\ --with-pcre \ --add-module=../ngx_cache_purge-2.3 \ --with-\ && make && make install \ && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ \ && mkdir -p /var/tmp/nginx/client/ \ && chown -R nginx /var/tmp/nginx/client/ \ && sed -i -e 's/nobody/nginx/' -e '2s/^#//' /usr/local/nginx/conf/nginx.conf EXPOSE 80 CMD ["nginx","-g","daemon off;"]

//构建nginx镜像:[root@sqm-docker01 nginx]# docker build -t nginx .

注意:名称不能有大写及特殊字符,最后的.表示在当前目录下的dockerfile文件,且一个目录下只能存在一个dockerfile。

//运行nginx容器: [root@sqm-docker01 mysql]# docker run -itd --name nginx1.8.0 --network mynet1 --ip 172.16.10.10 --restart=always -p 80:80 nginx

部署php-fpm:

[root@sqm-docker01 php]# vim Dockerfile 代码如下:

FROM centos:7 ADD libmcrypt-2.5.7.tar.gz / ADD php-5.6.27.tar.gz / RUN yum -y install gcc* pcre-devel zlib-devel tree unzip make vim net-tools elinks libxml2-devel libcurl-devel openssl-devel bzip2-devel WORKDIR /libmcrypt-2.5.7/ RUN ./configure --prefix=/usr/local/libmcrypt && make && make install \ && 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 \ && cp php.ini-production /etc/php.ini \ && cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm \ && chmod +x /etc/init.d/php-fpm \ && chkconfig --add php-fpm \ && chkconfig php-fpm on \ && cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf \ && sed -i -e 's/;daemonize = yes/daemonize = no/g' -e 's/127.0.0.1/0.0.0.0/g' /usr/local/php5.6/etc/php-fpm.conf EXPOSE 9000 CMD ["/usr/local/php5.6/sbin/php-fpm","-c","/usr/local/php5.6/etc/php-fpm.conf"]

//运行php容器: [root@sqm-docker01 mysql]# docker run -itd --name php-fpm --network mynet1 --ip 172.16.10.20 --restart=always -p 9000:9000 php-fpm

部署mysql5.7.28:

[root@sqm-docker01 mysql]# vim Dockerfile 代码如下:

FROM centos:7 RUN yum -y install gcc* zlib-devel make vim net-tools cmake bison ncurses-devel gcc gcc-c++ pcre pcre-devel openssl openssl-devel libaio initscripts ADD boost_1_59_0.tar.gz /opt ADD mysql-5.7.28.tar.gz /opt WORKDIR /opt/mysql-5.7.28 RUN cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.28 \ -DWITH_BOOST=/opt/boost_1_59_0 \ -DMYSQL_UNIX_ADDR=/data/mysql/tmp/mysql.sock \ -DMYSQL_DATADIR=/data/mysql \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DWITH_INNODB_MEMCACHED=1 \ -DWITH_DEBUG=OFF \ -DWITH_ZLIB=bundled \ -DENABLED_LOCAL_INFILE=1 \ -DENABLED_PROFILING=ON \ -DMYSQL_MAINTAINER_MODE=OFF \ -DMYSQL_TCP_PORT=3306 \ && make && make install RUN ln -s /usr/local/mysql-5.7.28 /usr/local/mysql \ && echo "export PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile \ && echo "export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH" >> /etc/profile \ && source /etc/profile \ && mkdir -p /data/mysql/{data,tmp,logs,pids,share} \ && touch /data/mysql/logs/mysqld.log \ && touch /data/mysql/pids/mysqld.pid \ && useradd -s /sbin/nologin -M mysql \ && chown -R mysql:mysql /data/mysql COPY my.cnf /etc/my.cnf RUN cd /usr/local/mysql \ && cp support-files/mysql.server /etc/init.d/mysqld \ && chmod a+x /etc/init.d/mysqld \ && chkconfig --add mysqld \ && chkconfig mysqld on \ && ln -s /usr/local/mysql/bin/* /usr/local/bin \ && mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data COPY mysql-start.sh /opt COPY user.sh /opt RUN chmod a+x /opt/mysql-start.sh \ && chmod a+x /opt/user.sh EXPOSE 3306 CMD ["/opt/mysql-start.sh"]

##dockerfile中的脚本代码如下:

[root@sqm-docker01 mysql]# cat my.cnf [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci datadir=/data/mysql/data socket=/data/mysql/tmp/mysql.sock [mysqld_safe] log-error=/data/mysql/logs/mysqld.log pid-file=/data/mysql/pids/mysqld.pid [client] default-character-set=utf8mb4

[root@sqm-docker01 mysql]# cat mysql-start.sh #!/bin/bash chown -R mysql:mysql /data/mysql /sbin/service mysqld start /bin/bash #保留一个终端,防止容器自动退出

//修改数据库密码并授权用户: [root@sqm-docker01 mysql]# cat user.sh #!/bin/bash mysqlpwd=` grep password /data/mysql/logs/mysqld.log | awk -F 'root@localhost: ' '{print $2}'` mysql -uroot -p${mysqlpwd} -e 'alter user root@localhost identified by"pwd@123"' --connect-expired-password mysql -u root -ppwd@123 <

//运行mysql容器:[root@sqm-docker01 mysql]# docker run -itd --name mysql5.7.28 --network mynet1 --ip 172.16.10.30 --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd@123 mysql

//测试登陆mysql数据库:用user1用户进行测试,因为root用户我只设置了允许mysql服务器本机登陆,其他主机没有权限。(需要在dockerhost上下载mysql客户端)

[root@sqm-docker01 mysql]# yum -y install mysql [root@sqm-docker01 mysql]# mysql -u user1 -p123.com -h 127.0.0.1 -P 3306

配置nginx-php-mysql相互解析:

1)修改nginx配置文件:

将nginx存放配置文件的目录copy到dockerhost: [root@sqm-docker01 ~]# docker cp nginx1.8.0:/usr/local/nginx/conf /docker_conf/

[root@sqm-docker01 conf]# vim nginx.conf

2)创建测试解析php的网页:

同样将nginx的网页目录拷贝到主机: [root@sqm-docker01 ~]# docker cp nginx1.8.0:/usr/local/nginx/html /wwwroot/ [root@sqm-docker01 ~]# cd /wwwroot/html/ [root@sqm-docker01 html]# cat > test.php < phpinfo(); > ?> > EOF

3)将dockerhost上的目录挂载到容器内://我们需要将nginx和php容器删除掉,重新运行并且挂载,其实在上边构建完服务,不用先运行服务,可以现在运行,我是为了测试是否安装成功。当然你也可以从一开始就可以编写好网页文件,直接挂载。

[root@sqm-docker01 html]# docker rm -f nginx1.8.0 [root@sqm-docker01 html]# docker run -itd --name nginx1.8.0 --network mynet1 \ > --ip 172.16.10.10 --restart=always -p 80:80 \ > -v /docker_conf/conf/:/usr/local/nginx/conf/ -v / nginx

[root@sqm-docker01 ~]# docker rm -f php-fpm [root@sqm-docker01 ~]# docker run -itd --name php-fpm --network mynet1 \ > --ip 172.16.10.20 --restart=always -p 9000:9000 \ > -v /php-fpm

测试访问nginx和php解析页面:

搭建wordpress测试lnmp环境:

1)下载wordpress安装包到网页根目录下:

[root@sqm-docker01 ~]# cd /wwwroot/html/ [root@sqm-docker01 html]# wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz //下载完,将安装包进行解压: [root@sqm-docker01 html]# tar zxf wordpress-4.7.4-zh_CN.tar.gz

2)浏览器测试访问:

登陆成功,lnmp搭建完毕。。。。。。。。

———————— 本文至此结束,感谢阅读 ————————

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java设计模式之工厂模式案例详解
下一篇:ESD原理及典型接口选型应用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~