久闻docker大名,一直没用过
这次在阿里云的一台centOS7上要搭一下环境
正好学习一下,记录一下此过程

首先是安装Docker

yum -y install docker

安装完成后,启动docker服务

systemctl start docker.service

测试运行hello-world

docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。

还可以运行docker info命令,出现相关信息说明安装成功。

使用阿里云docker镜像加速器

登录阿里云 - 开发者平台:https://dev.aliyun.com/ 进入管理中心->Docker Hub
镜像站点->您的专属加速器地址 就可以看到加速器地址

当你下载安装的Docker Version不低于1.10时,建议直接通过daemon config进行配置。 使用配置文件
/etc/docker/daemon.json(没有时新建该文件)

{
    "registry-mirrors": ["<your accelerate address>"]
}

重启Docker Daemon就可以了。

sudo systemctl daemon-reload
sudo systemctl restart docker

本步骤未配置成功,pull镜像时,显示还是从docker.io下载

通过Dockerfile安装Apache+PHP

到 Docker Hub 找到PHP的镜像
https://hub.docker.com/_/php/

选择需要的Dockerfile
笔者选择的是7.0-apache版的Dockerfile
内容为:

FROM php:7.0-apache
COPY src/ /var/www/html/

FROM php:7.0-apache
表示从php:7.0-apache的镜像构建,而php:7.0-apache的Dockerfile详细内容
https://github.com/docker-library/php/blob/2630167f7e69394bdd91f240443a0a521fd7872d/7.0/apache/Dockerfile

回到自己的服务器
新建my-php-app目录作为项目根目录
进入my-php-app目录并新建src目录存放php代码
将7.0-apache版的Dockerfile
将写好的Dockerfile文件放到此apache-php文件夹内
构建

docker build -t my-php-app .

(注意最后有个点用来表示当前目录,初次构建速度会比较慢,需要多等一会。)
出现如下信息,说明构建成功

Successfully built e669e1432638

然后就可以

运行容器

docker run -p 80:80 --name my-running-app -v $PWD/my-php-app/src:/var/www/html -d my-php-app

-p 80:80 绑定宿主的80端口
--name 容器名称
-v 宿主的目录$PWD/my-php-app/src绑定到容器的/var/www/html目录
-d 后台运行容器
my-php-app镜像名称

在src目录下,新建index.php

<?php
echo "hello world";
?>

访问http://服务器IP/可以看到输出了令人激动的hello world

这样,一个基于docker的php+apache的环境,就算初步建成了

安装mariaDB

新建/home/mariadb/data目录,用来存放数据
将/home/mariadb/data挂载到容器的存放数据的路径
便于保存,否则容器重启之后,数据库数据就没了
对了,要先在宿主主机上把SElinux关闭,否则可能出问题

docker search mariadb
docker pull mariadb
docker run -v /home/mariadb/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name my-mariadb -d mariadb:latest

-e MYSQL_ROOT_PASSWORD 设置root密码

PHP连接mariadb

编辑index.php,连接数据库,报错
因为php没有装相应的mysql扩展
于是安装pdo

编辑Dockerfile

FROM php:7.0-apache
COPY src/ /var/www/html/
RUN docker-php-ext-install pdo_mysql\
    && docker-php-ext-install mysqli

停止my-running-app容器并删除该容器

docker stop my-running-app
docker rm my-running-app 

然后重新build镜像,再从新的镜像运行新容器

docker build -t my-php-app . 
docker run -p 80:80 --name my-running-app -v /home/php/src:/var/www/html -d my-php-app

通过phpinfo发现pdo扩展已经安装上。
编辑index.php

$dsn = 'mysql:dbname=mysql;host=宿主主机IP';
$user = 'root';
$password = 'root';

try {
    $dbh = new PDO($dsn, $user, $password);
    if($dbh) {
        echo "success";
    }
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

打印出success,说明连接数据库成功。