简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。他和vm的区别就是完全虚拟化,一个是操作系统层虚拟化。
docker由三部分组成
- 仓库(Repository)
- 镜像(Image)
- 容器(Container)
仓库就相当于存放镜像的地方。如果把镜像比作类,容器就是镜像的实例化。
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-1127.13.1.el7.x86_64 #1 SMP Tue Jun 23 15:46:38 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
2.更新yum包,并修改yum源到阿里云
[root@localhost ~]# yum update
[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.安装依赖包,查看docker版本并选择一个安装
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@localhost ~]# yum list docker-ce --showduplicates | sort -r
[root@localhost ~]# yum install docker-ce-18.06.1.ce
4.启动docker并加入开机启动
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
使用docker version 可查看docker版本,表示安装成功。
1.获取mysql镜像,可以先拉出镜像列表
docker search mysql
找一个星星最多的使用,这里我使用的是mysql5.7版本
docker pull mysql:5.7
2.创建mysql容器。其实我们可以仅仅使用docker run命令就行了。docker run会先去pull,然后再create。
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql5.7 mysql:5.7
参数说明:
# -d 让容器在后台运行
# -p 添加主机到容器的端口映射,主机端口3307映射到容器mysql3306端口
# -e 设置环境变量,这里是设置mysql的root用户的初始密码,这个必须设置
# --name 容器的名字,随便取,但是必须唯一,这里mysql5.7 就是我起的名字
此处我想让我本地navicate能管理此数据库。
进入mysql5.7的终端
docker exec -it mysql5.7 /bin/bash
参数说明:
# -t 在容器里生产一个伪终端
# -i 对容器内的标准输入 (STDIN) 进行交互
进入终端后要对用户进行授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
此时便可使用navicate连接数据库。
使用 docker ps -a 便可看见刚刚创建的mysql容器。
docker pull php:5.6-fpm
2.创建php容器,并且在容器中使用mysql
docker run -d -v /docker/php/conf:/usr/local/etc/php -p 9000:9000 --link mysql5.7:mysql5.7 --name php-mysql php:5.6-fpm
参数说明:
# -d 让容器在后台运行
# -p 添加主机到容器的端口映射
# -v 添加目录映射,即主机上的/docker/php/conf和容器中/usr/local/etc/php目录是同步的
# –name 容器的名字
# –link 与另外一个容器建立起联系,这样我们就可以在当前容器中去使用另一个容器里的服务。mysql5.7:mysql5.7 表示与mysql5.7建立联系,并在自己的容器中它被命名为mysql5.7
此处 -v 做目录映射是为了我们修改配置文件比较方便。
如过没做目录映射,我们可以直接进容器修改配置文件,然后重启容器即可。
docker exec -it php-mysql /bin/bash
cd /usr/local/etc/php
docker restart php-mysql
注意:
这里需要先去docker目录中建立好映射目录和映射文件,否则会报错
cd /docker
mkdir php
cd php
mkdir conf
这里如果不指定–link参数其实也是可以得,因为容易本身也是有ip的且唯一,所以我们也可以直接利用ip去访问容器。
安装php扩展
默认php镜像中提供的扩展比较少,缺少诸如mysql、gd2等常用的扩展,这样我们就需要自己安装并启用扩展。
首先进入到php容器,用php -m命令查看本地有什么扩展。
可以使用docker-php-ext-install命令来安装扩展。
docker-php-ext-install mysqli
扩展安装好之后就可以在php.ini中启用。我们从phpinfo中可以看到,容器环境下默认的php.ini没有启用,可以从/usr/local/etc/php下将php.ini-development拷贝为php.ini。通过修改php.ini中配置,启用自己需要的扩展。下面是几个扩展安装的命令,供大家参考。
docker-php-ext-source 在容器中创建一个/usr/src/php目录
docker-php-ext-enable启用PHP扩展,省去我们手工编辑php.ini的过程
docker-php-ext-install安装并启用PHP扩展
docker-php-ext-configure经常与docker-php-ext-install搭配,在需要自定义扩展的配置时使用
docker pull nginx
2.创建nginx容器,并在容器中使用php和mysql
docker run -d -p 80:80 --name nginx-php-mysql -v /docker/www:/var/www/html -v /docker/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v /docker/nginx/logs:/var/log/nginx --link php-mysql --privileged=true nginx
注意:此处同样需要先去创建目录和文件,不然会报错。先运行一个nginx容器,
docker run -d -p 80:80 --name nginx000 nginx
这里我将文件直接拷贝到/docker/nginx/conf.d/default.conf来覆盖容器的nginx配置。
docker cp nginx000:/etc/nginx/conf.d/default.conf /docker/nginx/conf.d/default.conf
然后删除此容器
docker rm nginx
再次运行上面的创建容器代码即可。
需要修改default.conf文件
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass php-mysql:9000; # 很重要, 这里需要改到链接的php-fpm的印射名字或者端口
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; # $document_root 可能不生效,手动改下
include fastcgi_params;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
在nginx工作目录下,新建文件test.php
//phpinfo();
header("Content-type:text/html;charset=utf-8");
$dbms="mysql"; //数据库类型
$host="mysql5.7"; //数据库主机名,此处写mysql 容器的名字
$dbport = "3306";
$dbName="test"; //使用的数据库
$user="root"; //数据库连接用户名
$pass="123456"; //对应的密码
$dsn="$dbms:host=$host;port=$dbport;dbname=$dbName;charset=utf8";
try {
$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
echo "successful
";
//你还可以进行一次搜索操作
foreach ($dbh->query("SELECT * from test") as $row) {
print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
}
$dbh = null;
} catch (PDOException $e) {
die ("Error!: " . $e->getMessage() . "
");
}
?>
使用 ifconfig 查看vm的ip
我此处为 http://192.168.37.130/test.php
出现phpinfo和连接成功success信息即可。