本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,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.一次显示整个文件: 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