docker部署lnmp环境

430 阅读5分钟

本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!

关闭防火墙、关闭selinux

[root@docker-server ~]# setenforce 0
[root@docker-server ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g'  /etc/selinux/config   //永久关闭selinux
[root@docker-server ~]# systemctl stop firewalld
[root@docker-server ~]# systemctl disable firewalld    //开机不启动防火墙

获取 MySQL 镜像

[root@docker-server ~]# docker pull mysql  //拉取最新版本//启动容器
[root@docker-server ~]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=***** --name my_mysql mysql:latest

报错:

/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint my_mysql (081b3190954fe7630862d408c19c4758f4e7ad0ccac073cd0c3f7686185ec914): Error starting userland proxy: listen tcp 0.0.0.0:3306: bind: address already in use.

netstat -nap 查看程序运行的 pid , 发现3306端口确实被占用

netstat -nap | grep 3306

可以 kill PID,杀死该进程后,重新启动容器

​
[root@VM-0-7-centos ~]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=wucs@123 --name my_mysql mysql:l               atest

又报错 :

Error response from daemon: Conflict. The container name "/my_mysql" is already i n use by container 278ba9681117783b217d8c41c3f4045cec8d23124277ac571d6abee852430311. You have to remove (o r rename) that container to be able to reuse that name..

查看所有容器 docker ps -a

[root@VM-0-7-centos ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS P ORTS NAMES 278ba9681117 mysql:latest "docker-entrypoint..." 10 minutes ago Created my_mysql

原来启动容器虽然报错,但是也启动了

//我们先删除my_mysql 容器,再次启动一遍
[root@VM-0-7-centos ~]# docker rm -f 278ba9681117
[root@VM-0-7-centos ~]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=wucs@123 --name my_mysql mysql:latest

成功!

参数说明:

-d 让容器在后台运行 -p 添加主机到容器的端口映射 -e 设置环境变量,这里设置mysql的root用户的初始密码 -name 容器的名称、只要求唯一性

修改 mysql 配置文件

[root@VM-0-7-centos ~]# docker cp my_mysql:/etc/mysql/my.cnf /opt/
​
编辑 /etc/mysql/my.cnf
    
//修改完毕导入配置文件到 mysql 容器里面
[root@VM-0-7-centos ~]# docker cp /opt/my.cnf my_mysql:/etc/mysql/

获取 php 7.2 镜像

[root@VM-0-7-centos ~]# docker pull php:7.2-fpm
//启动容器
[root@VM-0-7-centos ~]# docker run -d -v /var/nginx/www/html:/var/www/html -p 9000:9000 --link my_mysql:mysql --name my_phpfpm php:7.2-fpm

参数说明: -d 让容器在后台运行 -p 添加主机到容器的端口映射 -v 添加目录映射,主机上的/var/nginx/www/html映射到容器里面 的/var/www/html,如果主机没有这个目录就创建这个目录,或者映射别的目录,但是后面路径要统一 -name 容器的名字 -link 容器与另外一个容器建立联系,这样就可以在当前的容器去使用另一个容器里的服务

测试目录映射

在主机/var/nginx/www/html 目录下创建php测试页面,会直接映射到容器里面

[root@VM-0-7-centos ~]# cat > /var/nginx/www/html/index.php 
<?
    phpinfo();
?>
//输入完成后敲Ctrl+D组合键[root@VM-0-7-centos ~]# docker exec -it 3e6139bb4d5b /bin/bash //进入容器内部
root@3e6139bb4d5b:/var/www/html# ls //ls 查看文件,发现index.php已经成功映射进来了
index.php//退出容器命令 exit 或者 Ctrl+P+Q
[root@VM-0-7-centos ~]# exit

cat 命令:

1.一次显示整个文件:catfilename2.从键盘创建一个文件: cat filename 2.从键盘创建一个文件: cat > filename 只能创建新文件,不能编辑已有文件,输入完成后敲Ctrl+D组合键。 3.将几个文件合并为一个文件: $cat file1 file2 > file 参数: -n 或 --number 由 1 开始对所有输出的行数编号 -b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号 -s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行 -v 或 --show-nonprinting

php 扩展安装

安装 php-redis

//上面我们 exit 退出容器了,再次进入PHP容器
[root@VM-0-7-centos ~]# docker exec -it 3e6139bb4d5b /bin/bash
pecl install redis && docker-php-ext-enable redis
​
//enable igbinary serializer support? [no] : no
//enable lzf compression support? [no] :   no
//enable zstd compression support? [no] : no
//.... 省略...安装完成
​
root@3e6139bb4d5b:/var/www/html# php -m  //查看安装了哪些
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
redis
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib
​
[Zend Modules]
​

修改PHP配置文件

[root@VM-0-7-centos ~]# docker cp 3e6139bb4d5b:/usr/local/etc/php/php.ini-development /opt/
​
编辑 /opt/php.ini-development 并重命名为 php.ini
    
//修改完毕导入配置文件到 php 容器里面
[root@VM-0-7-centos ~]# docker cp /opt/php.ini 3e6139bb4d5b:/usr/local/etc/php/

获取 nginx 镜像

[root@VM-0-7-centos ~]# docker pull nginx
//启动 nginx 容器
[root@VM-0-7-centos ~]# docker run -d -p 80:80 --name my_nginx -v /var/nginx/www/html:/var/www/html --link my_phpfpm:phpfpm --name my_nginx nginx:latest

参数说明 -d 让容器运行在后台 -p 添加主机到容器的端口映射 -v 添加目录映射,这里nginx容器的根目录最好写成和php容器中根目录一样。但是不一定非要一样,如果不一样在配置nginx的时候需要注意 -name 容器的名称 -link 容器之间建立起来联系

修改 nginx 配置 ,使其支持PHP

这里采取直接拷贝出配置文件修改后再导入进去的方式:

[root@VM-0-7-centos ~]# docker cp f998f1827420:/etc/nginx/conf.d/default.conf /opt/
[root@VM-0-7-centos ~]# vim /opt/default.conf
​
server {
    listen       80;
    server_name  localhost;
    location / {
        root   /var/www/html;                       // 修改这里默认的路径
        index  index.html index.htmi index.php;     //这里加入添加php的方式
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ .php$ {
        root           html;
        fastcgi_pass   3e6139bb4d5b:9000;        //这里可以用PHP容器ID,也可以用PHP容器IP,都具备唯一性
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;      //修改这里的路径
        include        fastcgi_params;
    }
}
​
//修改完毕导入配置文件到 nginx 容器里面
[root@VM-0-7-centos ~]# docker cp /opt/default.conf f998f1827420:/etc/nginx/conf.d/default.conf

进入到容器里,重新加载配置文件

[root@VM-0-7-centos ~]# docker exec -it f998f1827420 /bin/bash
root@f998f1827420:/# nginx -t  //检查nginx配置是否正确
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@f998f1827420:/# nginx -s reload
2021/06/25 09:08:12 [notice] 37#37: signal process started

参数说明

-t 在容器里面生产一个伪终端 -i 对容器内的标准输入(STDIN)进行交互

查看所有容器映射的端口

[root@VM-0-7-centos ~]# ss -anlt
State      Recv-Q Send-Q Local Address:Port    Peer Address:Port             
LISTEN     129    128              *:8000       *:*
LISTEN     0      50               *:3306       *:*
LISTEN     0      128              *:8080       *:*
LISTEN     0      128              *:80         *:*
LISTEN     0      128              *:22         *:*
LISTEN     0      100      127.0.0.1:25         *:*
LISTEN     0      128           [::]:9000       [::]:*
LISTEN     0      128           [::]:3306       [::]:*
LISTEN     0      128           [::]:8080       [::]:*
LISTEN     0      128           [::]:80         [::]:*
LISTEN     0      100          [::1]:25         [::]:*

访问测试页面 index.php

浏览器输入服务器 ip ,如果能看到phpinfo() 信息,说明部署成功了!

撒花~~✿✿ヽ(°▽°)ノ✿✿✿ヽ(°▽°)ノ✿

docker 基本命令

容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]

容器操作运维 — docker [ps|inspect|top|attach|events|logs|wait|export|port]

容器rootfs命令 — docker [commit|cp|diff]

镜像仓库 — docker [login|pull|push|search]

本地镜像管理 — docker [images|rmi|tag|build|history|save|import]

其他命令 — docker [info|version]

firewall-cmd --zone=public --add-port=3307/tcp --permanent # 开放3307端口

firewall-cmd --reload # 配置立即生效

firewall-cmd --zone=public --list-ports