0


基于Dockerfile搭建LNMP

一、基础环境准备

(1)公司在实际的生产环境中,需要使用Docker 技术在一台主机上创建LNMP服务并运行Wordpress网站平台。然后对此服务进行相关的性能调优和管理工作。

(2)环境描述
容器系统IP地址软件nginxcentos 7.5172.18.0.10wordpress-6.0.2-zh_CN.tar.gz、nginx-1.12.2.tar.gzmysqlcentos 7.5172.18.0.20mysql-boost-5.7.25.tar.gphpcentos 7.5172.18.0.30php-7.1.24.tar.gz
(3)任务需求

(1)使用Docker构建LNMP环境并运行Wordpress网站平台。

(2)限制Nginx容器最多使用500Mb的内存和1G的Swap。

(3)限制Mysql容器写 /dev/sda 的速率为 10 MB/s。

(4)将所有容器进行快照,然后将Docker镜像打包成tar包备份到本地。

1、环境前期准备

  1. systemctl stop firewalld
  2. systemctl disable firewalld
  3. setenforce 0
  4. #关闭防火墙和核心防护
  5. docker pull centos:7
  6. #从docker Hub公共仓库下载基础镜像
  7. docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
  8. #设置自定义网络模式,模式为bridge模式,docker1的ip地址为172.18.0.1,显示的网络名称mynetwork。
  9. docker network ls
  10. #查看使用的网络模式
  11. ifconfig

二、部署nginx(容器IP 为 172.18.0.10)

1、配置Dockerfile文件

  1. mkdir /opt/nginx
  2. cd /opt/nginx
  3. #此目录上传nginx包
  4. vim Dockerfile
  5. #编写dockerfile文件
  6. FROM centos:7
  7. #指定基础镜像
  8. MAINTAINER ydq
  9. #指定维护者信息
  10. RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
  11. #安装依赖包,安装环境
  12. RUN useradd -M -s /sbin/nologin nginx
  13. #创建nginx用户
  14. ADD nginx-1.12.2.tar.gz /opt
  15. #将本地安装包上传到指定目录(自动解压)
  16. WORKDIR /opt/nginx-1.12.2
  17. #进入到/opt/nginx-1.12.2目录中
  18. RUN ./configure \
  19. --prefix=/usr/local/nginx \
  20. --user=nginx \
  21. --group=nginx \
  22. --with-http_stub_status_module && make && make install
  23. #开始编译安装,加上&&符号,只有前面执行完成,后面才会执行
  24. ENV PATH=/usr/local/nginx/sbin:$PATH
  25. #将nginx执行命令放入到环境变量中
  26. ADD nginx.conf /usr/local/nginx/conf/nginx.conf
  27. #在宿主机写好配置文件,然就将配置文件复制到容器中
  28. ADD wordpress-6.0.2-zh_CN.tar.gz /usr/local/nginx/html
  29. #上传论坛的包
  30. RUN chmod 777 -R /usr/local/nginx/html
  31. #给html文件所有权限
  32. EXPOSE 80
  33. #开放80端口
  34. VOLUME ["/usr/local/nginx/html/"]
  35. #挂载目录(相当于将/usr/local/nginx/html目录共享,会在宿主机上自动生成共享目录,主要目的是为了让容器之间共享这个文件)
  36. CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
  37. #执行启动nginx命令,并且关闭nginx的后台启动,因为需要它占用前台,让docker不关闭。

2、配置nginx.conf文件

  1. worker_processes 1;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. include mime.types;
  7. default_type application/octet-stream;
  8. sendfile on;
  9. keepalive_timeout 65;
  10. server {
  11. listen 80;
  12. server_name localhost;
  13. charset utf-8;
  14. location / {
  15. root html;
  16. index index.html index.php;
  17. }
  18. error_page 500 502 503 504 /50x.html;
  19. location = /50x.html {
  20. root html;
  21. }
  22. location ~ \.php$ { #当访问以.php结尾的URL时,会连接到172.18.0.30的ip地址上
  23. root html;
  24. fastcgi_pass 172.18.0.30:9000;
  25. fastcgi_index index.php;
  26. fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
  27. include fastcgi_params;
  28. }
  29. }
  30. }

3、构建镜像、启动镜像

在构建镜像前,确保一下文件压缩包都在。

  1. docker build -t nginx:lnmp .
  2. #构建nginx镜像(别忘记最后的点)
  3. docker images
  4. #查看镜像
  5. docker run -d --name nginx -p 80:80 -m 500m --memory-swap 1g --net mynetwork --ip 172.18.0.10 nginx:lnmp
  6. #启动容器
  7. ----------------------------
  8. -m 500: #表示该容器内存最大为500MB
  9. --memory-swap: #表示内存+swap总共1G,那swap也是500MB
  10. //相当于是限制了内存的使用量,避免所占资源太多
  11. ----------------------
  12. docker ps -a
  13. #查看容器
  14. curl 20.0.0.55

三、部署mysql

1、配置Dockerfile文件

  1. mkdir /opt/mysql
  2. cd /opt/mysql
  3. #上传mysql包到此目录下
  4. vim Dockerfile
  5. FROM centos:7
  6. #基础镜像
  7. MAINTAINER ydq
  8. #维护人信息
  9. RUN yum -y install ncurses ncurses-devel bison cmake pcre-devel zlib-devel gcc gcc-c++ make
  10. #安装环境
  11. RUN useradd -M -s /sbin/nologin mysql
  12. #创建mysql用户
  13. ADD mysql-boost-5.7.25.tar.gz /opt
  14. #将mysql安装包上传(自带boost)
  15. WORKDIR /opt/mysql-5.7.25
  16. #切换到mysql解压后的目录
  17. RUN cmake \
  18. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
  19. -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
  20. -DSYSCONFDIR=/etc \
  21. -DSYSTEMD_PID_DIR=/usr/local/mysql \
  22. -DDEFAULT_CHARSET=utf8 \
  23. -DDEFAULT_COLLATION=utf8_general_ci \
  24. -DWITH_EXTRA_CHARSETS=all \
  25. -DWITH_INNOBASE_STORAGE_ENGINE=1 \
  26. -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
  27. -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
  28. -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
  29. -DMYSQL_DATADIR=/usr/local/mysql/data \
  30. -DWITH_BOOST=boost \
  31. -DWITH_SYSTEMD=1 && make -j4 && make install
  32. #编译安装
  33. EXPOSE 3306
  34. #开放端口
  35. RUN chown -R mysql:mysql /usr/local/mysql/;chown mysql:mysql /etc/my.cnf
  36. #设置权限
  37. ENV PATH /usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
  38. #设置环境变量
  39. WORKDIR /usr/local/mysql/bin
  40. #切换目录
  41. RUN ./mysql \
  42. --initialize-insecure \
  43. --user=mysql \
  44. --basedir=/usr/local/mysql \
  45. --datadir=/usr/local/mysql/data
  46. #初始化mysql
  47. RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
  48. #复制mysql服务程序到启动文件中
  49. VOLUME ["/usr/local/mysql"]
  50. #设置共享目录
  51. CMD ["/usr/sbin/init"]
  52. #启动容器之后,可以使用systemctl工具(并且占用前台,保持容器不断)

2、配置my.conf文件

  1. vim /opt/my.cnf
  2. [client]
  3. port = 3306
  4. default-character-set=utf8
  5. socket=/usr/local/mysql/mysql.sock
  6. [mysql]
  7. port = 3306
  8. default-character-set=utf8
  9. socket=/usr/local/mysql/mysql.sock
  10. auto-rehash
  11. [mysqld]
  12. user = mysql
  13. basedir=/usr/local/mysql
  14. datadir=/usr/local/mysql/data
  15. port = 3306
  16. character-set-server=utf8
  17. pid-file = /usr/local/mysql/mysqld.pid
  18. socket=/usr/local/mysql/mysql.sock
  19. bind-address = 0.0.0.0
  20. skip-name-resolve
  21. max_connections=2048
  22. default-storage-engine=INNODB
  23. max_allowed_packet=16M
  24. server-id = 1
  25. sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

3、构建镜像、启动镜像

  1. docker build -t mysql:lnmp .
  2. #生成镜像
  3. docker images
  4. #查看镜像

  1. docker run --name mysql -d --privileged --device-write-bps /dev/sda:10M -v /usr/local/mysql --net mynetwork --ip 172.18.0.20 mysql:lnmp
  2. #生成容器
  3. -----------------------------------------
  4. --privileged: #让容器内拥有root权限
  5. --device-write-bps: #限制写入到/dev/sda中每秒最大10M的速度。
  6. -v /usr/local/mysql: #共享这个目录,其它容器可以使用--volumes-from 指定读取本容器的共享目录。然后也会生成一样的目录。
  7. --net mynetwork: #指定--net网络模式,mynetwork为自定义网络模式。
  8. --ip 172.18.0.20: #指定ip地址,自定义网络模式也可以指定ip地址。
  9. -----------------------------------------
  10. docker ps -a
  11. #查看容器

5、验证mysql

  1. docker exec -it mysql bash
  2. #登录该容器
  3. systemctl status mysqld
  4. #查看mysql状态

四、PHP部署

1、配置Dockerfile

  1. mkdir /opt/php
  2. cd /opt/php
  3. #将php包上传到该目录
  4. vim Dockerfile
  5. FROM centos:7
  6. MAINTAINER ydq3
  7. RUN yum install -y gd \
  8. libjpeg libjpeg-devel \
  9. libpng libpng-devel \
  10. freetype freetype-devel \
  11. libxml2 libxml2-devel \
  12. zlib zlib-devel \
  13. curl curl-devel \
  14. openssl openssl-devel \
  15. gcc gcc-c++ make pcre-devel;useradd -M -s /sbin/nologin nginx
  16. #下载环境,以及创建nginx用户。
  17. ADD php-7.1.24.tar.gz /opt
  18. #上传php包到/opt目录下
  19. WORKDIR /opt/php-7.1.24
  20. #进入到指定目录
  21. RUN ./configure \
  22. --prefix=/usr/local/php \
  23. --with-mysql-sock=/usr/local/mysql/mysql.sock \
  24. --with-mysqli \
  25. --with-zlib \
  26. --with-curl \
  27. --with-gd \
  28. --with-jpeg-dir \
  29. --with-png-dir \
  30. --with-freetype-dir \
  31. --with-openssl \
  32. --enable-fpm \
  33. --enable-mbstring \
  34. --enable-xml \
  35. --enable-session \
  36. --enable-ftp \
  37. --enable-pdo \
  38. --enable-tokenizer \
  39. --enable-zip && make -j 4 && make install
  40. #编译安装
  41. ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
  42. #设置环境变量
  43. ADD php.ini /usr/local/php/lib
  44. ADD php-fpm.conf /usr/local/php/etc
  45. ADD www.conf /usr/local/php/etc/php-fpm.d/
  46. #上传配置文件到指定目录
  47. EXPOSE 9000
  48. #暴露端口
  49. CMD /usr/local/php/sbin/php-fpm -F
  50. #启动一个进程,占用前台。

2、配置相关文件

2.1 配置php.ini文件

  1. vim /opt/php/php.ini
  2. [PHP]
  3. engine = On
  4. short_open_tag = Off
  5. precision = 14
  6. output_buffering = 4096
  7. zlib.output_compression = Off
  8. implicit_flush = Off
  9. unserialize_callback_func =
  10. serialize_precision = -1
  11. disable_functions =
  12. disable_classes =
  13. zend.enable_gc = On
  14. expose_php = On
  15. max_execution_time = 30
  16. max_input_time = 60
  17. memory_limit = 128M
  18. error_reporting = E_ALL
  19. display_errors = On
  20. display_startup_errors = On
  21. log_errors = On
  22. log_errors_max_len = 1024
  23. ignore_repeated_errors = Off
  24. ignore_repeated_source = Off
  25. report_memleaks = On
  26. track_errors = On
  27. html_errors = On
  28. variables_order = "GPCS"
  29. request_order = "GP"
  30. register_argc_argv = Off
  31. auto_globals_jit = On
  32. post_max_size = 8M
  33. auto_prepend_file =
  34. auto_append_file =
  35. default_mimetype = "text/html"
  36. default_charset = "UTF-8"
  37. doc_root =
  38. user_dir =
  39. enable_dl = Off
  40. file_uploads = On
  41. upload_max_filesize = 2M
  42. max_file_uploads = 20
  43. allow_url_fopen = On
  44. allow_url_include = Off
  45. default_socket_timeout = 60
  46. [CLI Server]
  47. cli_server.color = On
  48. [Date]
  49. date.timezone = Asia/Shanghai
  50. [filter]
  51. [iconv]
  52. [intl]
  53. [sqlite3]
  54. [Pcre]
  55. [Pdo]
  56. [Pdo_mysql]
  57. pdo_mysql.cache_size = 2000
  58. pdo_mysql.default_socket=
  59. [Phar]
  60. [mail function]
  61. SMTP = localhost
  62. smtp_port = 25
  63. mail.add_x_header = On
  64. [SQL]
  65. sql.safe_mode = Off
  66. [ODBC]
  67. odbc.allow_persistent = On
  68. odbc.check_persistent = On
  69. odbc.max_persistent = -1
  70. odbc.max_links = -1
  71. odbc.defaultlrl = 4096
  72. odbc.defaultbinmode = 1
  73. [Interbase]
  74. ibase.allow_persistent = 1
  75. ibase.max_persistent = -1
  76. ibase.max_links = -1
  77. ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
  78. ibase.dateformat = "%Y-%m-%d"
  79. ibase.timeformat = "%H:%M:%S"
  80. [MySQLi]
  81. mysqli.max_persistent = -1
  82. mysqli.allow_persistent = On
  83. mysqli.max_links = -1
  84. mysqli.cache_size = 2000
  85. mysqli.default_port = 3306
  86. mysqli.default_socket = /usr/local/mysql/mysql.sock
  87. mysqli.default_host =
  88. mysqli.default_user =
  89. mysqli.default_pw =
  90. mysqli.reconnect = Off
  91. [mysqlnd]
  92. mysqlnd.collect_statistics = On
  93. mysqlnd.collect_memory_statistics = On
  94. [OCI8]
  95. [PostgreSQL]
  96. pgsql.allow_persistent = On
  97. pgsql.auto_reset_persistent = Off
  98. pgsql.max_persistent = -1
  99. pgsql.max_links = -1
  100. pgsql.ignore_notice = 0
  101. pgsql.log_notice = 0
  102. [bcmath]
  103. bcmath.scale = 0
  104. [browscap]
  105. [Session]
  106. session.save_handler = files
  107. session.use_strict_mode = 0
  108. session.use_cookies = 1
  109. session.use_only_cookies = 1
  110. session.name = PHPSESSID
  111. session.auto_start = 0
  112. session.cookie_lifetime = 0
  113. session.cookie_path = /
  114. session.cookie_domain =
  115. session.cookie_httponly =
  116. session.serialize_handler = php
  117. session.gc_probability = 1
  118. session.gc_divisor = 1000
  119. session.gc_maxlifetime = 1440
  120. session.referer_check =
  121. session.cache_limiter = nocache
  122. session.cache_expire = 180
  123. session.use_trans_sid = 0
  124. session.sid_length = 26
  125. session.trans_sid_tags = "a=href,area=href,frame=src,form="
  126. session.sid_bits_per_character = 5
  127. [Assertion]
  128. zend.assertions = 1
  129. [COM]
  130. [mbstring]
  131. [gd]
  132. [exif]
  133. [Tidy]
  134. tidy.clean_output = Off
  135. [soap]
  136. soap.wsdl_cache_enabled=1
  137. soap.wsdl_cache_dir="/tmp"
  138. soap.wsdl_cache_ttl=86400
  139. soap.wsdl_cache_limit = 5
  140. [sysvshm]
  141. [ldap]
  142. ldap.max_links = -1
  143. [mcrypt]
  144. [dba]
  145. [opcache]
  146. [curl]
  147. [openssl]

2.2 配置php-fpm.conf文件

  1. vim /opt/php/php-fpm.conf
  2. [global]
  3. pid = run/php-fpm.pid
  4. include=/usr/local/php/etc/php-fpm.d/*.conf

2.3 配置www.conf文件

  1. vim /opt/php/www.conf
  2. [www]
  3. user = nginx
  4. group = nginx
  5. listen = 172.18.0.30:9000
  6. pm = dynamic
  7. pm.max_children = 5
  8. pm.start_servers = 2
  9. pm.min_spare_servers = 1
  10. pm.max_spare_servers = 3

3、构建镜像、启动镜像

  1. docker build -t php:lnmp .
  2. #构建镜像
  3. docker images
  4. #查看

  1. docker run -itd --name php --net mynetwork --ip 172.18.0.30 -p 9000:9000 --volumes-from nginx --volumes-from mysql php:lnmp
  2. #启动容器
  3. -----------------------------------------------
  4. --volumes-from nginx: #表示读取nginx容器的共享信息
  5. --volumes-from mysql: #表示读取mysql容器的共享信息
  6. -----------------------------------------------
  7. docker ps -a
  8. #查看容器

五、启动wordpress服务

1、登录到mysql容器中,授权

  1. docker exec -it mysql bash
  2. #登录到mysql容器
  3. mysql
  4. #登录到容器中
  5. create database wordpress;
  6. #创建一个数据库
  7. grant all privileges on wordpress.* to 'wordpress'@'%' identified by 'abc123';
  8. grant all privileges on *.* to 'root'@'%' identified by 'abc123';
  9. flush privileges;

2、网页访问:http://20.0.0.55/wordpress/wp-admin/setup-config.php

标签: docker 容器 运维

本文转载自: https://blog.csdn.net/weixin_46254171/article/details/133653291
版权归原作者 @_Orange— 所有, 如有侵权,请联系我们删除。

“基于Dockerfile搭建LNMP”的评论:

还没有评论