docker比直接在服务器上安装环境有很多好处,自己百度
先安装docker(官方文档要求Linux kernel至少3.8以上,且docker只能运行在64位的系统中。由于RHEL6和CentOS6的内核版本为2.6,最好使用centos7以上)
可以先用uname -r查看系统是否符合要求
setenforce 0
yum -y install docker-io //开始安装
service docker start //启动docker
docker run hello-world // 如果报错有可能是版本问题(一定要运行这个)
docker version //查看版本
如果出现版本那么docker安装完成,如果中途报错自己百度,docker安装很简单的
*****现在拉取镜像(后面会制作自己的镜像,这里的镜像作为基础镜像)*****
这里先介绍几个常见的docker命令
#docker ps 查看所有正在运行的容器
#docker ps -a 查看所有容器包括停止掉的
#docker stop [容器id|容器别名] 停止容器
#docker rm [容器id|容器别名] 删除停止容器(这里是删除容器不是删除镜像,容器只有先停止才能删除)
#docker restart [容器id|容器别名] 重启容器
#docker start [容器id|容器别名] 启动停掉的容器
#docker stop $(docker ps -a -q) 停止所有容器
#docker rm $(docker ps -a -q) 删除所有停止的容器
#docker pull imageName 拉取镜像
#docker images 查看镜像
#docker exec -it [容器id|容器别名] bash 进入对应镜像的终端
#docker inspect [容器id|容器别名] 查看容器的信息(比如挂载路径)
#docker exec myphp php /usr/share/nginx/html/index.php 这样子可以执行脚本 定时器也可以这样子写
docker pull nginx:1
docker pull php:7-fpm
docker pull mysql:5
拉取完成使用如下命令查看是否存在
docker images
//输出
//REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
//nginx 1 7b27d9ade773 6 days ago 109.1 MB
//php 7-fpm 5a94ee0038db 2 weeks ago 367 MB
//mysql 5 3cc8ec7719ab 2 weeks ago 372.1 MB
//REPOSITORY(镜像名字) TAG(镜像标签) IMAGE ID(镜像ID)后面两个不用解释了
*****接下来运行镜像******
# mysql
docker run -e MYSQL_ROOT_PASSWORD=xutao -p 3306:3306 -d --name mymysql mysql:5
# php
docker run -p 127.0.0.1:9000:9000 -d --name myphp php:7-fpm
# nginx
docker run -d -p 80:80 --name mynginx nginx:1
#-p是映射端口 -d是后台运行 --name是别名(--name mymysql说明把这个容器命名为mymysql后面停止、重启、删除容器都可以用这个别名) 具体参数解释参见(http://www.runoob.com/docker/docker-install-nginx.html)
使用如下命令查看镜像是否运行起来,如果其中某个没有运行起来可以去掉-d参数再次运行查看错误
docker ps
//输出
//CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
//0c7e0eeedfa8 nginx:1 "nginx -g 'daemon of 7 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp mynginx
//a83f0ca62adf php:7-fpm "docker-php-entrypoi 7 minutes ago Up 7 minutes 127.0.0.1:9000->9000/tcp myphp
//d08b39cec2c0 mysql:5 "docker-entrypoint.s 7 minutes ago Up 7 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mymysql
// CONTAINER ID(容器id,停止 删除 重启都可以用这个) IMAGE(镜像信息) NAMES(容器别名,功能和容器id差不多)其他几个不用解释了
*****上面是基本启动,为了方便需要文件挂载,和不同容器之间的数据交换,所以运行命令需要多个参数*****
生成配置文件和测试文件
# 保存到/tmp/conf.d/default.conf ()
server {
listen 80;
# server_name test.phpindex.win;
root /usr/share/nginx/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
fastcgi_pass php-fpm:9000;
}
}
*⚠️fastcgi_pass php-fpm:9000; 这里需要注意 不然可能出现503 php-fpm可以用你的php容器的ip或者用容器名字都行
# 保存到/tmp/html/index.php
<?php
phpinfo();
#接下来给mysql挂载文件,防止数据被还原
mkdir /docker
mkdir /docker/mysql
mkdir /docker/mysql/conf
mkdir /docker/mysql/data
创建my.cnf配置文件
touch /docker/mysql/conf/my.cnf
my.cnf添加如下内容:
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
//这一步是为了挂载文件提前生成几个文件(比如数据库不挂载文件,那么停止,重启,运行原mysql容器建立的数据库都会被还原)
#再次运行容器(这里最好先停止,删除对应容器,再运行,别名不能重复)
#这里是停止,删除所有容器,正式最好停止单个,防止影响别的容器
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
#比如停止php容器
#docker stop myphp
#docker rm myphp
docker run -d -p 3306:3306 --privileged=true -v /docker/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xutao --name mymysql mysql:5
docker run -p 9000:9000 -v /tmp/html:/usr/share/nginx/html --name myphp -d php:7-fpm
docker run -d -p 80:80 -v /tmp/conf.d:/etc/nginx/conf.d --volumes-from myphp --link myphp:php-fpm --name mynginx nginx:1
#docker exec -it mynginx bash 我们进入nginx容器终端可以看见/usr/share/nginx/html是存放目录的文件 /etc/nginx/conf.d是配置文件的路径,其他需要挂载其他方法一样
#挂载完成我们操作主机的对应文件 那么容器对应的文件也会跟着改变,反之亦然,使用exit可以退出镜像终端
#-v挂载文件 --link和别的容器进行关联,具体查看这里(# --volumes-from用了这个nginx才能访问php的代码
#
docker ps #查看是否容器运行
#每次修改完nginx配置文件都要重启nginx容器才能起作用,操作基本和直接在linux搭建的一样
#php连接数据库不能使用127.0.0.1来连接 直接用主机ip
****接下来测试利用php连接mysql*****
docker exec -it myphp bash #进入php终端查看是否有对应的模块
php -m #查看php安装了哪些模块,这时候发现并没有mysqli和pdo_mysql常用模块 我们先安装
cd /usr/local/bin
docker-php-ext-install pdo_mysql
docker-php-ext-install mysqli
php -m #再次查看已经安装完毕
重启php和nginx
docker restart myphp #这里myphp和mynginx是容器的别名
docker restart mynginx
在/tmp/html/index.php 写入如下代码
<?php
//echo phpinfo();
$mysqli = new mysqli("XX.XXX.XXX.XXX", "root", "xutao","test");
if(!$mysqli) {
echo"database error\n";
}else{
echo"php env successful\n";
}
$result = $mysqli->query( 'select * from yyy' );
$row = $result->fetch_row();
echo $row[0];
$mysqli->close();
?>
使用命令测试是否有问题
curl 127.0.0.1
到这里基本就安装完毕了,可是如果你停止(docker stop myphp)、删除(docker rm myphp),重新运行容器(docker run -p 9000:9000 -v /tmp/html:/usr/share/nginx/html --name myphp -d php:7-fpm)
刚才安装的pdo_mysql、mysqli又会没有了(回到了镜像的最初状态,我们可以使用commit来生成新镜像也可以使用dockerfile来构建)
*commit比较简单可以参考(https://www.cnblogs.com/waterlufei/p/6682345.html)