Docker构建LNMP部署WordPress

前言

使用容器化技术如 Docker 可以极大地简化应用程序的部署和管理过程,本文将介绍如何利用 Docker 构建 LNMP 环境,并通过部署 WordPress 来展示这一过程。

目录

一、环境准备

1. 项目需求

2. 安装包下载

3. 服务器环境

4. 规划工作目录 

5. 创建自定义网络 

二、Nginx 镜像创建

1. 建立工作目录

2. 编写 Dockerfile 文件

3. 准备 nginx.conf 配置文件

4. 生成镜像

5. 启动镜像容器 

6. 验证 nginx

三、Mysql 镜像创建

1. 进入工作目录 

2. 编写 Dockerfile 文件

3. 准备 my.cnf 文件

4. 生成镜像

5. 启动镜像容器

6. 验证 mysql

四、Php 镜像创建

1. 进入工作目录 

2. 编写 Dockerfile 文件

3. 准备 php.ini、php-fpm.conf、www.conf 配置文件

3.1 php.ini

3.2 php-fpm.conf

3.3 www.conf 

4. 生成镜像

5. 启动镜像容器 

6. 验证 php

7. 进入容器登录 mysql 授权

8. 创建一个新的配置文件 wp-config.php

9. 浏览器访问 wordpress

五、Docker 镜像打包

1. 基本信息

2. 容器导出  


一、环境准备

1. 项目需求

(1)使用 Docker 构建 LNMP 环境并运行 Wordpress 网站平台
(2)限制 Nginx 容器最多使用 512Mb 的内存和 1G 的 Swap
(3)限制 Mysql 容器写 /dev/sda 的速率为 10 MB/s
(4)将所有容器进行快照,然后将 Docker 镜像打包成 tar 包备份到本地

2. 安装包下载

wget https://cdn.mysql.com//archives/mysql-5.7/mysql-boost-5.7.20.tar.gz
wget http://nginx.org/download/nginx-1.12.0.tar.gz
wget https://www.php.net/distributions/php-7.1.10.tar.bz2
wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz

3. 服务器环境

容器名宿主机系统/配置IP地址Docker版本基于镜像安装软件
nginxCentos 7.4;4C/8G172.19.8.1020.10.17centos:7

Docker-Nginx

Docker-Wordpress

mysqlCentos 7.4;4C/8G172.19.8.2020.10.17centos:7Docker-Mysql
phpCentos 7.4;4C/8G172.19.8.3020.10.17centos:7Docker-php

安装 docker-ce-20.10.17: 

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 安装所需的依赖
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 添加Docker官方仓库,正常后面还是用国内阿里源更合适
sudo yum makecache fast
# 更新Yum缓存
sudo yum install docker-ce-20.10.17 docker-ce-cli-20.10.17 containerd.io
# 安装Docker CE 20.10.17
sudo systemctl start docker
sudo systemctl enable docker
# 启动并启用Docker服务
docker --version
# 验证安装

4. 规划工作目录 

[root@localhost ~]# tree /lnmp/ -L 2
/lnmp/
├── images
│   ├── mysql_image.tar
│   ├── nginx_image.tar
│   └── php_image.tar
├── mysql
│   ├── Dockerfile
│   ├── my.cnf
│   └── mysql-boost-5.7.20.tar.gz
├── nginx
│   ├── Dockerfile
│   ├── html
│   ├── nginx-1.12.0.tar.gz
│   ├── nginx.conf
│   └── wordpress-4.9.4-zh_CN.tar.gz
└── php
    ├── Dockerfile
    ├── php-7.1.10.tar.bz2
    ├── php-fpm.conf
    ├── php.ini
    └── www.conf

5. 创建自定义网络 

创建了一个名为 mynetwork 的自定义 Docker 网络,子网为 172.19.0.0/16,并指定了桥接名称为 docker1。

[root@localhost ~]# docker network create --subnet=172.19.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
d2b40d071ba33351aeb1d4a6a8d9738fb6fb7a01991bd26c8fdb7244fce3819f
[root@localhost ~]# docker network ls | grep mynetwork
d2b40d071ba3   mynetwork   bridge    local
[root@localhost ~]# docker inspect d2b40d071ba3 | grep -i subnet
                    "Subnet": "172.19.0.0/16"
# 可以看到网络的子网是172.19.0.0/16

二、Nginx 镜像创建

1. 建立工作目录

[root@localhost ~]# mkdir /lnmp/{nginx,mysql,php} -p
[root@localhost nginx]# ls
nginx-1.12.0.tar.gz  wordpress-4.9.4-zh_CN.tar.gz  # 准备安装包
[root@localhost nginx]# mkdir html/
[root@localhost nginx]# tar zxvf wordpress-4.9.4-zh_CN.tar.gz -C /lnmp/nginx/html
[root@localhost nginx]# cd html/;ls
wordpress
[root@localhost html]# cd wordpress/;ls
index.php        wp-admin              wp-content         wp-load.php      wp-signup.php
license.txt      wp-blog-header.php    wp-cron.php        wp-login.php     wp-trackback.php
readme.html      wp-comments-post.php  wp-includes        wp-mail.php      xmlrpc.php
wp-activate.php  wp-config-sample.php  wp-links-opml.php  wp-settings.php
# 准备 wordpress 网站文件

2. 编写 Dockerfile 文件

[root@localhost wordpress]# cd ../..     
[root@localhost nginx]# vim Dockerfile   
FROM centos:7                           # 基于centOS:7镜像作为基础镜像
MAINTAINER nginx image <fql>            # 指定镜像的维护者信息
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make # yum安装必要的软件包至镜像;
RUN useradd -M -s /sbin/nologin nginx   # 创建nginx的系统用户,且无法登录系统
ADD nginx-1.12.0.tar.gz /usr/local/src/ # 将nginx文件解压到/usr/local/src/目录下
WORKDIR /usr/local/src/nginx-1.12.0     # 工作目录切换
RUN ./configure \                       # 配置、编译并安装Nginx,指定安装路径、用户、用户组以及使用了 with-http_sub_status_module 模块
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make -j 4 && make instal
ENV PATH /usr/local/nginx/sbin:$PATH    # 将Nginx可执行文件路径添加到环境变量中
ADD nginx.conf /usr/local/nginx/conf/   # 将宿主机当前目录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                               # 暴露容器的80端口,http
EXPOSE 443                              # 暴露容器的443端口,https
VOLUME [ "/usr/local/nginx/html/" ]     # 在Docker内创建挂载点
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ] 
# 启动Nginx并以非守护进程方式运行

3. 准备 nginx.conf 配置文件

[root@localhost nginx]# egrep -v "^(.)*#(.)*$" nginx.conf | grep -v "^$"
# 从文件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$ {                  # 指定了匹配请求URI以.php结尾的条件,~表示使用正则表达式匹配
            root           html;             # 查找文件的根目录为html
            fastcgi_pass   172.19.0.30:9000; # Nginx将把.php文件发送到172.19.0.30上的FastCGI服务器的9000端口
            fastcgi_index  index.php;        # 当请求URI以/结尾时,Nginx应该使用的默认文件
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
# 这个参数告诉FastCGI服务器要执行的PHP脚本的路径。$fastcgi_script_name是一个FastCGI变量,代表请求的文件路径
            include        fastcgi_params;   # 包含了一个外部文件fastcgi_params
        }
    }
}
# 根据请求的URI找到对应的PHP文件,将请求发送给FastCGI服务器进行处理,并设置一些FastCGI参数。这样可以实现在Nginx服务器上运行PHP脚本的功能。

4. 生成镜像

[root@localhost nginx]# docker build -t nginx:lnmp .
[root@localhost nginx]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        lnmp      b0ab50b55dac   43 seconds ago   569MB
nginx        latest    7383c266ef25   4 days ago       188MB
centos       7         eeb6ee3f44bd   2 years ago      204MB

5. 启动镜像容器 

限制 Nginx 容器最多使用 512Mb 的内存和 1G 的 Swap:

[root@localhost nginx]# docker run -d --name nginx -p 80:80 -m 512M --memory-swap=1G -v /lnmp/nginx/html:/usr/local/nginx/html --net mynetwork --ip 172.19.0.10 nginx:lnmp
30bac7a9755929001177b15047c39680cc0a26ea8ddf17ea32fd31045b3c6aa1
[root@localhost nginx]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                                        NAMES
30bac7a97559   nginx:lnmp   "/usr/local/nginx/sb…"   50 seconds ago   Up 48 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp   nginx
[root@localhost nginx]# docker inspect nginx 
                    "Gateway": "172.19.0.1",
                    "IPAddress": "172.19.0.10",
[root@localhost nginx]# docker stats
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O   PIDS
30bac7a97559   nginx     0.00%     952KiB / 512MiB     0.18%     2.41kB / 0B   0B / 0B     2

6. 验证 nginx

在宿主机目录建立html文件:
[root@localhost nginx]# echo nginx welcome > html/index.html

三、Mysql 镜像创建

1. 进入工作目录 

[root@localhost nginx]# cd ../mysql/
[root@localhost mysql]# ls
mysql-boost-5.7.20.tar.gz    # 准备安装包

2. 编写 Dockerfile 文件

[root@localhost mysql]# vim Dockerfile
FROM centos:7
MAINTAINER mysql image <fql>
RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make
ADD mysql-boost-5.7.20.tar.gz /usr/local/src/ # 将MySQL源代码包解压缩到镜像/usr/local/src/目录下
WORKDIR /usr/local/src/mysql-5.7.20/          # 设置工作目录为MySQL源代码包的目录
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_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 4 && make install
ADD my.cnf /etc/
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH # 将MySQL的可执行文件路径添加到环境变量中
RUN useradd -M -s /sbin/nologin  mysql
RUN chown mysql:mysql /etc/my.cnf
RUN chown -R mysql:mysql /usr/local/mysql/
RUN /usr/local/mysql/bin/mysqld \    # 运行MySQL的初始化命令,初始化MySQL数据库
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
EXPOSE 3306
CMD ["/usr/local/mysql/bin/mysqld"]  # 启动MySQL数据库服务

3. 准备 my.cnf 文件

[root@localhost mysql]# cat my.cnf
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock

[mysql]
port = 3306
socket = /usr/local/mysql/mysql.sock
auto-rehash

[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

4. 生成镜像

Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=container error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum makecache
# 如果遇到类似dns问题,可修改dns、替换阿里源尝试解决

[root@localhost mysql]# docker build -t mysql:lnmp .
[root@localhost mysql]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
mysql        lnmp      2b328d4ecd04   About a minute ago   10.1GB
nginx        lnmp      b0ab50b55dac   2 hours ago          569MB

5. 启动镜像容器

限制 Mysql 容器写 /dev/sda 的速率为 10 MB/s:

[root@localhost mysql]# docker run --name=mysql -d --privileged --device-write-bps /dev/sda:10M -v /usr/local/mysql -P --net mynetwork --ip 172.19.0.20 mysql:lnmp
ddd452f38b116b7c01a85676837933d25cacb53e65e2a61f36e43e7725544bae
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED             STATUS          
7da2cc6a302c   nginx:lnmp   "/usr/local/nginx/sb…"   About an hour ago   Up 15 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp    nginx
817aedefb6f6   mysql:lnmp   "/usr/local/mysql/bi…"   About an hour ago   Up 14 minutes   0.0.0.0:49153->3306/tcp, :::49153->3306/tcp   mysql

测试IO:

[root@localhost mysql]# docker exec -it mysql /bin/bash
[root@ddd452f38b11 mysql-5.7.20]# dd if=/dev/zero of=test bs=20M count=5 oflag=direct
5+0 records in
5+0 records out
104857600 bytes (105 MB) copied, 9.97887 s, 10.5 MB/s
# 速率限制是近似值,并且在实际应用中可能会有一些波动

6. 验证 mysql

容器登录:
[root@localhost mysql]# docker exec -it mysql /bin/bash
[root@ddd452f38b11 mysql-5.7.20]# mysql -uroot -p   # 默认没有密码,直接回车
mysql>

远程登录:
[root@slave01 ~]# mysql -u root -h 192.168.190.108 -P 49153 -p'abc123'
mysql>

四、Php 镜像创建

1. 进入工作目录 

[root@localhost mysql]# cd ../php/
[root@localhost php]# ls
php-7.1.10.tar.bz2        # 准备安装包

2. 编写 Dockerfile 文件

[root@localhost php]# vim Dockerfile
FROM centos:7
MAINTAINER php image <fql>
RUN yum -y install 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
RUN useradd -M -s /sbin/nologin nginx
ADD php-7.1.10.tar.bz2 /usr/local/src/ # 将php文件解压并复制到/usr/local/src/目录下
WORKDIR /usr/local/src/php-7.1.10      # 设置工作目录
RUN ./configure \                      # 配置PHP编译选项
--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 4 && make install
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH # 将PHP可执行文件路径添加到系统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                                        # 暴露容器的9000端口,用于PHP-FPM服务
ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ] # 启动PHP-FPM服务并以守护进程方式运行

3. 准备 php.ini、php-fpm.conf、www.conf 配置文件

  • php.ini 用于配置 PHP 的运行时参数和特性
  • php-fpm.conf 用于配置 PHP-FPM 的全局行为和进程管理
  • www.conf 用于配置 PHP-FPM 的进程池参数,如进程数和管理方式
[root@localhost php]# ls
Dockerfile  php-7.1.10.tar.bz2  php-fpm.conf  php.ini  www.conf

3.1 php.ini

[root@localhost php]# vim php.ini
 939 date.timezone = Asia/Shanghai  # 取消注释,修改
1170 mysqli.default_socket = /usr/local/mysql/mysql.sock
# MySQL数据库的默认socket文件路径,用于PHP连接MySQL数据库时寻找MySQL服务器的通信端口
[root@localhost php]# egrep -v "^;" php.ini | egrep -v "^$"
# 显示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]

3.2 php-fpm.conf

[root@localhost php]# vim php-fpm.conf
 17 pid = run/php-fpm.pid        # 删除注释符号“;”
[root@localhost php]# egrep -v "^;" php-fpm.conf | egrep -v "^$"
[global]
pid = run/php-fpm.pid
include=/usr/local/php/etc/php-fpm.d/*.conf

3.3 www.conf 

[root@localhost php]# vim www.conf
 23 user = nginx
 24 group = nginx
 36 listen = 172.19.0.30:9000  # 修改监听IP和端口为容器IP:9000端口
[root@localhost php]# egrep -v "^;" www.conf | egrep -v "^$"
[www]
user = nginx
group = nginx
listen = 172.19.0.30:9000
listen.allowed_clients = 127.0.0.1,172.19.0.10
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

4. 生成镜像

[root@localhost php]# docker build -t php:lnmp .
[root@localhost php]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
php          lnmp      39e39b251e20   24 seconds ago   1.4GB
mysql        lnmp      2b328d4ecd04   44 minutes ago   10.1GB
nginx        lnmp      b0ab50b55dac   2 hours ago      569MB

5. 启动镜像容器 

[root@localhost php]# docker run --name=php -d -p 9000:9000 --volumes-from mysql --volumes-from nginx --net mynetwork --ip 172.19.0.30 php:lnmp
5e91e0162badda54ad70cb39240b3b7e633b5764ad12830edad17f6c152645d9
[root@localhost php]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS             PORTS                                        NAMES
5e91e0162bad   php:lnmp     "/usr/local/php/sbin…"   5 seconds ago    Up 3 seconds       0.0.0.0:9000->9000/tcp, :::9000->9000/tcp    php
ddd452f38b11   mysql:lnmp   "/usr/local/mysql/bi…"   43 minutes ago   Up 43 minutes      3306/tcp                                     mysql
30bac7a97559   nginx:lnmp   "/usr/local/nginx/sb…"   2 hours ago      Up About an hour   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp   nginx

6. 验证 php

[root@localhost php]# docker exec -it php /bin/bash
[root@5e91e0162bad php-7.1.10]# ps -aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.0 113028  7520 ?        Ss   09:39   0:00 php-fpm: master process (/usr/loc
nginx         8  0.0  0.0 113028  3768 ?        S    09:39   0:00 php-fpm: pool www
nginx         9  0.0  0.0 113028  3768 ?        S    09:39   0:00 php-fpm: pool www
root         10  1.5  0.0  11828  1880 pts/0    Ss   09:46   0:00 /bin/bash
root         24  0.0  0.0  51732  1724 pts/0    R+   09:46   0:00 ps -aux

7. 进入容器登录 mysql 授权

[root@localhost php]# docker exec -it mysql /bin/bash
[root@ddd452f38b11 mysql-5.7.20]# mysql 
mysql> create database wordpress;
mysql> grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';
mysql> grant all privileges on *.* to 'root'@'%' identified by 'abc123';
mysql> flush privileges;

8. 创建一个新的配置文件 wp-config.php

[root@localhost ~]# cd /lnmp/nginx/html/wordpress
[root@localhost wordpress]# cp wp-config-sample.php wp-config.php
[root@localhost wordpress]# vim wp-config.php
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress');
define('DB_PASSWORD', '123456');
# 修改WordPress数据库信息

9. 浏览器访问 wordpress

http://192.168.190.108/wordpress/index.php

五、Docker 镜像打包

1. 基本信息

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED             STATUS          PORTS                                         NAMES
b4d901f2bccc   php:lnmp     "/bin/sh -c '/usr/lo…"   30 minutes ago      Up 11 minutes   0.0.0.0:9000->9000/tcp, :::9000->9000/tcp     php
7da2cc6a302c   nginx:lnmp   "/usr/local/nginx/sb…"   About an hour ago   Up 12 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp    nginx
817aedefb6f6   mysql:lnmp   "/usr/local/mysql/bi…"   About an hour ago   Up 11 minutes   0.0.0.0:49153->3306/tcp, :::49153->3306/tcp   mysql
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
php          lnmp      d36e706ae5d6   31 minutes ago      1.4GB
nginx        lnmp      a6b0e83b8ff8   About an hour ago   569MB
mysql        lnmp      2b328d4ecd04   5 hours ago         10.1GB

2. 容器导出  

[root@localhost ~]# mkdir /lnmp/images
[root@localhost ~]# cd /lnmp/images/
[root@localhost images]# docker export nginx > nginx_image.tar
[root@localhost images]# docker export mysql > mysql_image.tar
[root@localhost images]# docker export php > php_image.tar
[root@localhost images]# ll -h
总用量 9.4G
-rw-r--r--. 1 root root 7.6G 4月  28 22:11 mysql_image.tar
-rw-r--r--. 1 root root 503M 4月  28 22:06 nginx_image.tar
-rw-r--r--. 1 root root 1.3G 4月  28 22:13 php_image.tar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/589620.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

excel怎么删除条件格式规则但保留格式?

这个问题的意思就是要将设置的条件格式&#xff0c;转换成单元格格式。除了使用VBA代码将格式转换外&#xff0c;还可以用excel自己的功能来完成这个任务。 一、将条件格式“留下来” 1.设置条件格式 选中数据&#xff0c;点击开始选项卡&#xff0c;设置条件格式&#xff0…

2024年 Java 面试八股文——SpringMVC篇

目录 1.简单介绍下你对springMVC的理解? 2.说一说SpringMVC的重要组件及其作用 3.SpringMVC的工作原理或流程 4.SpringMVC的优点 5.SpringMVC常用注解 6.SpringMVC和struts2的区别 7.怎么实现SpringMVC拦截器 8.SpringMvc的控制器是不是单例模式&#xff1f;如果是&am…

XUbuntu24.04之更换国内高速源(二百二十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

无人机+飞行汽车:低空经济新引擎,有望爆发式增长

无人机和飞行汽车作为低空经济的新引擎&#xff0c;正在引领一场全新的交通革命。随着技术的不断进步和政策的支持&#xff0c;低空经济有望成为未来经济发展的重要领域&#xff0c;实现爆发式增长。 首先&#xff0c;无人机和飞行汽车具有独特的优势和应用场景。无人机可以在…

confluence 设置https代理

使用nginx反待confluence并开启https后&#xff0c;登录confluence会一直提示&#xff1a;scheme、proxyName、proxyPort设置错误。 解决办法&#xff1a; find / -name server.xmlvi /opt/atlassian/confluence/conf/server.xml HTTP反代配置 HTTPS反代配置

ue引擎游戏开发笔记(28)——实现第三人称越肩视角

1.需求分析 实现一个第三人称越肩视角 2.操作实现 1.思路&#xff1a;建立一个弹簧臂和摄像机&#xff0c;调整两者位置达到越肩效果。 2.直接在蓝图操作&#xff1a;添加摄像机和弹簧臂&#xff1a; 3.对弹簧臂勾选使用pawn控制旋转&#xff0c;并适当调整摄像机和弹簧臂位置…

[NSSCTF]prize_p1

前言 之前做了p5 才知道还有p1到p4 遂来做一下 顺便复习一下反序列化 prize_p1 <META http-equiv"Content-Type" content"text/html; charsetutf-8" /><?phphighlight_file(__FILE__);class getflag{function __destruct(){echo getenv(&qu…

Vue 组件的三大组成部分

Vue 组件通常由三大组成部分构成&#xff1a;模板&#xff08;Template&#xff09;、脚本&#xff08;Script&#xff09;、样式&#xff08;Style&#xff09; 模板部分是组件的 HTML 结构&#xff0c;它定义了组件的外观和布局。Vue 使用基于 HTML 的模板语法来声明组件的模…

【算法入门教育赛1E】最长公共前缀 - 字符串哈希 | 二分 | C++题解与代码

题目链接&#xff1a;https://www.starrycoding.com/problem/163 题目描述 牢 e e e在 S t a r r y C o d i n g StarryCoding StarryCoding的入门教育赛报名单上遇到了许多名字 s 1 , s 2 , . . . , s n s_1, s_2,...,s_n s1​,s2​,...,sn​&#xff0c;他想知道由这些人的…

网络安全风险里的威胁建模

文章目录 前言一、威胁建模的必要性二、威胁建模的过程三、威胁建模框架及方法1、NIST威胁模型框架2、STRIDE Model框架3、DREAD框架4、PASTA流程5、LINDDUN框架6、TRIKE知识库7、安全决策树四、威胁建模应用实践前言 网络安全的本质是攻防双方的对抗与博弈。然而,由于多种攻…

python学习笔记B-20:序列实战--处理千年虫

将2位数表达的年份&#xff0c;转换为用4位数表达&#xff1a; print("将列表中的2位数年份转换为4位数年份") lst[88,89,90,00,99] print(lst) for index in range(len(lst)):if len(str(lst[index]))2:lst[index] 1900int(lst[index])elif len(str(lst[index]))1…

微信小程序demo-----制作文章专栏

前言&#xff1a;不管我们要做什么种类的小程序都涉及到宣传或者扩展其他业务&#xff0c;我们就可以制作一个文章专栏的页面&#xff0c;实现点击一个专栏跳转到相应的页面&#xff0c;页面可以有科普类的知识或者其他&#xff0c;然后页面下方可以自由发挥&#xff0c;添加联…

网盘——分享文件——逻辑设计

本文主要讲解关于网盘文件操作部分的分享文件的逻辑设计部分&#xff0c;主要步骤如下&#xff1a; 目录 1、实施步骤&#xff1a; 2、代码实现 2.1、添加分享文件协议 2.2、添加取消槽函数 2.3、关联取消选择的槽函数 2.4、添加取消槽函数的定义 2.5、添加全选函数槽函…

小程序地理位置接口权限直接抄作业

小程序地理位置接口有什么功能&#xff1f; 随着小程序生态的发展&#xff0c;越来越多的小程序开发者会通过官方提供的自带接口来给用户提供便捷的服务。但是当涉及到地理位置接口时&#xff0c;却经常遇到申请驳回的问题&#xff0c;反复修改也无法通过&#xff0c;给的理由也…

rabbitMq 0 到1

前言 工作中MQ的使用场景是数不胜数&#xff0c;每个公司的技术选型又不太一样&#xff0c;用的哪个MQ&#xff0c;我们必须要先玩起来&#xff0c;RabbitMQ在windows安装遇到很多问题&#xff0c;博客也是五花八门&#xff0c;算了还是自己搞吧&#xff0c;记录一下&#xff…

C#描述-计算机视觉OpenCV(3):重映射

C#描述-计算机视觉OpenCV&#xff08;3&#xff09;&#xff1a;重映射 前言色彩波形图像重映射 前言 C#描述-计算机视觉OpenCV&#xff08;1&#xff09;&#xff1a;基础操作 C#描述-计算机视觉OpenCV&#xff08;2&#xff09;&#xff1a;图像处理 在前文中&#xff0c;描…

2.2 Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue基本语法

文本渲染指令 文本渲染指令-v-html与v-text Vue使用了基于HTML的模板语法&#xff0c;允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue的模板都是 合法的HTML&#xff0c;所以能被遵循规范的浏览器和HTML解析器解析。 在前面&#xff0c;我们一直使用的是字符串插…

探索科技园区的创新应用架构

在当今科技快速发展的时代&#xff0c;科技园区已经成为了创新和技术发展的孵化器和聚集地。在这样的环境中&#xff0c;科技园区的应用架构扮演着至关重要的角色&#xff0c;它不仅需要支持各种创新型企业和科技项目的发展&#xff0c;还需要提供高效的技术基础设施和服务。下…

python 11Pandas数据可视化实验

实验目的&#xff1a; 学会使用Pandas操作数据集&#xff0c;并进行可视化。 数据集描述&#xff1a; 该数据集是CNKI中与“中药毒理反应”相关的文献信息&#xff0c;包含文章题目、作者、来源&#xff08;出版社&#xff09;、摘要、发表时间等信息。 实验要求&#xff1…

ubuntu外置网卡配置AP模式

外置网卡RTL8811CU设置 UBUNTU使用RTL8811CU网卡&#xff08;包含树莓派&#xff09; 外置网卡配置AP模式流程 1. 检查网卡支持情况&#xff08;是否支持AP模式&#xff09; iw list找到以上部分&#xff0c;发现支持AP 2. 安装依赖 sudo apt-get update sudo apt-get in…