前言
本篇博客为使用dockerfile搭建lnmp并部署workpress
1. 安装docker
#关闭防火墙 systemctl disable --now firewalld setenforce 0 #安装docker并启动 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install -y docker-ce systemctl enable --now docker #修改网络转发功能(如果不修改,可能造成容器连不上外网,没办法下载环境) vim /etc/sysctl.conf net.ipv4.ip_forward=1 sysctl -p #注:若是后面在线源下载还是报错,则考虑清除/重新加载在线源,或者更新在线源 #从官网获取centos:7的镜像源 docker pull centos:7
2. 创建nginx容器
mkdir -p /data/nginx cd /data/nginx #获取nginx-1.12.0.tar.gz wordpress-4.9.4-zh_CN.tar.gz源码包 #编写Dockerfile配置文件(尽可能把命令放在一行,减少镜像层数,缩小镜像内存) vim Dockerfile FROM centos:7 MAINTAINER this is nginx image <lnmp> RUN yum install -y pcre-devel zlib-devel gcc gcc-c++ make;useradd -M -s /sbin/nologin nginx ADD nginx-1.12.0.tar.gz /usr/local/src/ WORKDIR /usr/local/src/nginx-1.12.0 RUN ./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_stub_status_module;make -j 2 && make install ENV PATH /usr/local/nginx/sbin:$PATH ADD nginx.conf /usr/local/nginx/conf/ ADD wordpress-4.9.4-zh_CN.tar.gz /usr/local/nginx/html RUN chmod 777 -R /usr/local/nginx/html/ EXPOSE 80 VOLUME [ "/usr/local/nginx/html/" ] CMD [ "/usr/local/nginx/sbin/nginx","-g","daemon off;" ] #创建nginx配置文件 vim nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; charset utf-8; location / { root html; index index.html index.php; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location ~ \.php$ { root html; fastcgi_pass 172.13.0.30:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; include fastcgi_params; } } } #创建nginx镜像(注意最后有个点,不可省略) docker build -t nginx:lnmp . docker images #通过镜像为nginx创建docker1容器,并制定网段为172.13.0.0/16 docker network create --subnet=172.13.0.0/16 --opt "com.docker.network.bridge.name"="docker1" lnmp #查看现有的容器网络模式 docker network ls #启动nginx容器并且为容器指定IP地址 docker run -d --name nginx -p 80:80 -m 500m --memory-swap 1g --net lnmp --ip 172.13.0.10 nginx:lnmp #验证nginx容器是否搭建成功 curl 192.168.109.133:80
3. 创建mysql容器
#创建mysql容器 mkdir -p /data/mysql #下载mysql源码包,wget,直接拖入都可 #编写Dockerfile配置文件 vim Dockerfile FROM centos:7 MAINTAINER this is mysql image <lnmp> RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make;useradd -M -s /sbin/nologin mysql ADD mysql-boost-5.7.20.tar.gz /usr/local/src/ WORKDIR /usr/local/src/mysql-5.7.20/ RUN cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \ -DSYSCONFDIR=/etc \ -DSYSTEMD_PID_DIR=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DWITH_BOOST=boost \ -DWITH_SYSTEMD=1;make -j 2;make install ADD my.cnf /etc/my.cnf EXPOSE 3306 RUN chown -R mysql:mysql /usr/local/mysql/;chown mysql:mysql /etc/my.cnf WORKDIR /usr/local/mysql/bin/ RUN ./mysqld \ --initialize-insecure \ --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/usr/local/mysql/data;cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/;systemctl enable mysqld ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH VOLUME [ "/usr/local/mysql" ] CMD ["/usr/sbin/init"] #编写mysql配置文件 vim my.cnf [client] port = 3306 socket=/usr/local/mysql/mysql.sock [mysqld] user = mysql basedir=/usr/local/mysql datadir=/usr/local/mysql/data port = 3306 character-set-server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket=/usr/local/mysql/mysql.sock bind-address = 0.0.0.0 skip-name-resolve max_connections=2048 default-storage-engine=INNODB max_allowed_packet=16M server-id = 1 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 #生成mysql镜像文件并启动镜像容器(需要在对应目录中完成) docker build -t mysql:lnmp . docker run --name=mysql -d --privileged --device-write-bps /dev/sda:10M -v /usr/local/mysql --net lnmp --ip 172.13.0.20 mysql:lnmp
4. 搭建php容器
mkdir /data/php cd /data/php vim Dockerfile FROM centos:7 MAINTAINER this is php image <lnmp> RUN yum install -y gd \ libjpeg libjpeg-devel \ libpng libpng-devel \ freetype freetype-devel \ libxml2 libxml2-devel \ zlib zlib-devel \ curl curl-devel \ openssl openssl-devel \ gcc gcc-c++ make pcre-devel;useradd -M -s /sbin/nologin nginx ADD php-7.1.10.tar.bz2 /usr/local/src/ WORKDIR /usr/local/src/php-7.1.10 RUN ./configure \ --prefix=/usr/local/php \ --with-mysql-sock=/usr/local/mysql/mysql.sock \ --with-mysqli \ --with-zlib \ --with-curl \ --with-gd \ --with-jpeg-dir \ --with-png-dir \ --with-freetype-dir \ --with-openssl \ --enable-fpm \ --enable-mbstring \ --enable-xml \ --enable-session \ --enable-ftp \ --enable-pdo \ --enable-tokenizer \ --enable-zip ; make -j 2 ; make install ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH ADD php.ini /usr/local/php/lib/ ADD php-fpm.conf /usr/local/php/etc/ ADD www.conf /usr/local/php/etc/php-fpm.d/ EXPOSE 9000 CMD /usr/local/php/sbin/php-fpm -F #可以从别的电脑安装配置文件后靠复制过来,只需要修改939行时区,1170行mysql路径指向 939行:date.timezone = Asia/Shanghai 1170行:mysqli.default_socket = /usr/local/mysql/mysql.sock vim php.ini [PHP] engine = On short_open_tag = Off precision = 14 output_buffering = 4096 zlib.output_compression = Off implicit_flush = Off unserialize_callback_func = serialize_precision = -1 disable_functions = disable_classes = zend.enable_gc = On expose_php = On max_execution_time = 30 max_input_time = 60 memory_limit = 128M error_reporting = E_ALL display_errors = On display_startup_errors = On log_errors = On log_errors_max_len = 1024 ignore_repeated_errors = Off ignore_repeated_source = Off report_memleaks = On track_errors = On html_errors = On variables_order = "GPCS" request_order = "GP" register_argc_argv = Off auto_globals_jit = On post_max_size = 8M auto_prepend_file = auto_append_file = default_mimetype = "text/html" default_charset = "UTF-8" doc_root = user_dir = enable_dl = Off file_uploads = On upload_max_filesize = 2M max_file_uploads = 20 allow_url_fopen = On allow_url_include = Off default_socket_timeout = 60 [CLI Server] cli_server.color = On [Date] date.timezone = Asia/Shanghai [filter] [iconv] [intl] [sqlite3] [Pcre] [Pdo] [Pdo_mysql] pdo_mysql.cache_size = 2000 pdo_mysql.default_socket= [Phar] [mail function] SMTP = localhost smtp_port = 25 mail.add_x_header = On [SQL] sql.safe_mode = Off [ODBC] odbc.allow_persistent = On odbc.check_persistent = On odbc.max_persistent = -1 odbc.max_links = -1 odbc.defaultlrl = 4096 odbc.defaultbinmode = 1 [Interbase] ibase.allow_persistent = 1 ibase.max_persistent = -1 ibase.max_links = -1 ibase.timestampformat = "%Y-%m-%d %H:%M:%S" ibase.dateformat = "%Y-%m-%d" ibase.timeformat = "%H:%M:%S" [MySQLi] mysqli.max_persistent = -1 mysqli.allow_persistent = On mysqli.max_links = -1 mysqli.cache_size = 2000 mysqli.default_port = 3306 mysqli.default_socket = /usr/local/mysql/mysql.sock mysqli.default_host = mysqli.default_user = mysqli.default_pw = mysqli.reconnect = Off [mysqlnd] mysqlnd.collect_statistics = On mysqlnd.collect_memory_statistics = On [OCI8] [PostgreSQL] pgsql.allow_persistent = On pgsql.auto_reset_persistent = Off pgsql.max_persistent = -1 pgsql.max_links = -1 pgsql.ignore_notice = 0 pgsql.log_notice = 0 [bcmath] bcmath.scale = 0 [browscap] [Session] session.save_handler = files session.use_strict_mode = 0 session.use_cookies = 1 session.use_only_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.cookie_domain = session.cookie_httponly = session.serialize_handler = php session.gc_probability = 1 session.gc_divisor = 1000 session.gc_maxlifetime = 1440 session.referer_check = session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 session.sid_length = 26 session.trans_sid_tags = "a=href,area=href,frame=src,form=" session.sid_bits_per_character = 5 [Assertion] zend.assertions = 1 [COM] [mbstring] [gd] [exif] [Tidy] tidy.clean_output = Off [soap] soap.wsdl_cache_enabled=1 soap.wsdl_cache_dir="/tmp" soap.wsdl_cache_ttl=86400 soap.wsdl_cache_limit = 5 [sysvshm] [ldap] ldap.max_links = -1 [mcrypt] [dba] [opcache] [curl] [openssl] vim php-fpm.conf [global] pid = run/php-fpm.pid include=/usr/local/php/etc/php-fpm.d/*.conf vim www.conf [www] user = nginx group = nginx listen = 172.13.0.30:9000 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 #构建php容器镜像 docker build -t php:lnmp . docker images [root@localhost php]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE php lnmp 7fcad4c73f4c 17 seconds ago 1.26GB mysql lnmp c0f7fae76717 14 minutes ago 10GB nginx lnmp db3674764b56 37 minutes ago 550MB centos 7 eeb6ee3f44bd 9 months ago 204MB
#根据php镜像创建容器并启动 docker run -itd --name php --net lnmp --ip 172.13.0.30 -p 9000:9000 --volumes-from nginx --volumes-from mysql php:lnmp docker ps -a [root@localhost php]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5044c42835c1 php:lnmp "/bin/sh -c '/usr/lo…" 4 seconds ago Up 3 seconds 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp php e79ea9c76f41 mysql:lnmp "/usr/sbin/init" 12 minutes ago Up 12 minutes 3306/tcp mysql 7284dd29014d nginx:lnmp "/usr/local/nginx/sb…" 36 minutes ago Up 36 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp nginx
进入mysql容器进行授权
mysql -u root -p create database wordpress; grant all privileges on wordpress.* to 'wordpress'@'%' identified by 'abc123'; grant all privileges on *.* to 'root'@'%' identified by 'abc123'; flush privileges;
访问:http://192.168.109.133/wordpress/index.php