千家信息网

Dockerfile源码分离部署LNMP(Centos7)

发表于:2025-02-10 作者:千家信息网编辑
千家信息网最后更新 2025年02月10日,Dockerfile常用指令:1、FROM:构建镜像基于哪个镜像例如:FROM centos2、MAINTAINER:镜像维护者姓名或邮箱地址例如:MAINTAINER Sun qiu ming3、R
千家信息网最后更新 2025年02月10日Dockerfile源码分离部署LNMP(Centos7)

Dockerfile常用指令:

1、FROM:构建镜像基于哪个镜像
例如:FROM centos
2、MAINTAINER:镜像维护者姓名或邮箱地址
例如:MAINTAINER Sun qiu ming
3、RUN:构建镜像时运行的shell命令
例如:
RUN [ "yum","install","httpd"]
RUN yum -y install httpd
4、CMD:运行容器时执行的shell命令
例如:
CMD ["/bin/bash"]
5、EXPOSE声明容器的服务端口
例如:EXPOSE 80 443
EXPOSE 声明端口
格式为 EXPOSE <端口1> [<端口2>...]。
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
6、ENV : 设置容器环境变量
例如:ENV MYSQL_ROOT_PASSWORD 123.com
7、ADD:拷贝文件或目录到镜像,如果是URL或压缩包会自动下载或自动解压
ADD <源文件> ...<目的目录>
ADD ["源文件"..."目的目录"]
例如:
ADD https://xxx.com/html.tar.gz /var/www/html
ADD html.tar.gz /var/www/html
8、COPY :拷贝文件或目录到镜像容器内,跟ADD类似,但不具备自动下载或解压功能
例如:COPY ./start.sh /start.sh

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 sunpengjun
12、WORKDIR:为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
例如:
WORKDIR /data
13、HEALTHCHECK:健康检查
14、ARG:构建时指定一些参数
例如:
FROM centos
ARG user
USER $user

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

Docker缓存特性:

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

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

Dockerfile的优势:

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

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

提示:需要事先将nginx,php,mysql所需的安装包下载到本地(结构目录如下)

准备部署工作:

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,创建挂载目录:
网页根目录:/wwwroot
配置文件目录:/docker_conf

[root@sqm-docker01 nginx]# mkdir /wwwroot[root@sqm-docker01 nginx]# mkdir /docker_conf

部署nginx:

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

FROM centos:7ADD 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/nologinWORKDIR nginx-1.8.0/RUN ./configure --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_stub_status_module \ --with-http_realip_module \ --with-http_ssl_module \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/tmp/nginx/client \ --http-proxy-temp-path=/var/tmp/nginx/proxy \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi \ --with-pcre \  --add-module=../ngx_cache_purge-2.3  \  --with-http_flv_module \  && 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 80CMD ["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:7ADD 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-develWORKDIR /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 9000CMD ["/usr/local/php5.6/sbin/php-fpm","-c","/usr/local/php5.6/etc/php-fpm.conf"]

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

//运行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:7RUN yum -y install gcc*  zlib-devel make vim net-tools  cmake bison  ncurses-devel gcc gcc-c++ pcre pcre-devel openssl openssl-devel libaio initscriptsADD boost_1_59_0.tar.gz /optADD  mysql-5.7.28.tar.gz /optWORKDIR /opt/mysql-5.7.28RUN 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.cnfRUN 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/dataCOPY mysql-start.sh /optCOPY user.sh /optRUN chmod a+x /opt/mysql-start.sh \ && chmod a+x /opt/user.shEXPOSE 3306CMD ["/opt/mysql-start.sh"]

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

[root@sqm-docker01 mysql]# cat my.cnf [mysqld]character-set-server=utf8mb4collation-server=utf8mb4_general_cidatadir=/data/mysql/datasocket=/data/mysql/tmp/mysql.sock[mysqld_safe]log-error=/data/mysql/logs/mysqld.logpid-file=/data/mysql/pids/mysqld.pid[client]default-character-set=utf8mb4
[root@sqm-docker01 mysql]# cat mysql-start.sh #!/bin/bashchown -R mysql:mysql /data/mysql/sbin/service mysqld start /bin/bash       #保留一个终端,防止容器自动退出
//修改数据库密码并授权用户:[root@sqm-docker01 mysql]# cat user.sh #!/bin/bashmysqlpwd=` 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-passwordmysql -u root -ppwd@123 <

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

//运行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

//执行容器中的脚本(修改数据库密码)
[root@sqm-docker01 mysql]# docker exec mysql5.7.28 sh /opt/user.sh

//测试登陆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 /wwwroot/html/:/usr/local/nginx/html  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 /wwwroot/html/:/usr/local/nginx/html/ 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)浏览器测试访问:

URL:http://容器宿主机IP/wordpress


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

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

容器 运行 镜像 目录 端口 服务 文件 测试 缓存 指令 网页 配置 代码 命令 宿主 用户 地址 拷贝 数据 数据库 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 泉州聊天软件开发难点 软件开发需要跑业务吗 海康威视门禁数据库资料更新频率 计算机系网络技术专业学业规划 软件定义网络和网络安全 宜宾游戏软件开发 报考网络技术前景好吗 中专毕业可以学软件开发 计算机网络安全与加密 华夏人生手机版如何进入服务器 网络安全的标语11条 上海代理服务器 mysql数据库开发实例 交易方为支付宝中国网络技术公司 v6和v5机架服务器区别 2022雄安新区招聘软件开发 武汉靠谱的软件开发方案 多线程同步数据库demo 河南潮流软件开发以客为尊 网络安全并重 数据库中的常用函数 中国无线网络技术标准 怎么关闭软件开发者模式 数据库创建两个文件组命令 三级网络技术技术真题 流媒体和传统服务器区别 工业软件开发需要学习什么 黄浦区服务器精密空调安装 卫生局网络安全应急演练方案 浪潮英信服务器说明书
0