听说docker 可以建立微服务,所以这几天就来学习搭建一下.
系统 : centos 7.1
1.从仓库拉取一个MySql的镜像
docker pull mysql:5.6
2.从仓库拉取一个php 镜像
docker pull php:7.0-fpm
3.从仓库拉取一个nginx 镜像
docker pull nginx:lastest
4.创建容器互联的网络 my-net(随便起名)
docker network create -d bridge my-net
-d 参数指定 Docker 网络类型,有 bridge overlay。其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。
5.1 创建mysql容器,别名xy_mysql 并加入网络my-net
docker run -d --name xy_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=xy123456 --network my-net mysql:5.6
5.2 先在linux里的usr/local/php 下面新建php.ini 文件,和conf.d 文件夹
php.ini的内容:
extension=php_curl.so
extension=php_gd2.so
extension=php_mysql.so
extension=php_mysqli.so
extension=php_pdo_mysql.so
extension=php_pdo_odbc.so
extension=php_pdo.so
php.ini中表示的是开启php的额外扩展,按需要添加,也可以不要.
5.2.1 运行php 容器,别名xy_phpfpm,并加入网络my-net
-v /var/nginx/www/html:/var/www/html 表示是本地 php 文件的存储目录映射到容器内的/var/www/html文件夹中,
-v /usr/local/php:/usr/local/php表示挂载文件
docker run -d --name xy_phpfpm \
-v /var/nginx/www/html:/var/www/html \
-v /usr/local/php:/usr/local/php \
-p 9000:9000 --network my-net php:7.0-fpm
5.2.2 进入 xy_phpfpm容器中
docker exec -ti xy_phpfpm /bin/bash
更新apt-get并安装vim
apt-get update
等待大概6分钟
apt-get install vim
5.2.4 docker 中php安装pdo_mysql 扩展
进入xy_phpfpm容器中不退出,接着安装扩展
docker-php-ext-install pdo pdo_mysql
参考:在容器内安装pdo_mysql扩展
5.2.5 退出xy_phpfpm 容器
exit;
5.3 nginx 部署
5.30 部署前 的准备:
思路:
因为我这里没有nginx 的配置文件,就从nginx 容器中复制一份到主机中
-
先开启一个容器,以便能复制容器中的配置文件到主机
docker run -d --name test_nginx -p 80:80 -d nginx:latest
-
复制容器中配置文件到主机的
/usr/nginx
文件夹中
得到test_nginx容器的id
docker ps -a
然后复制容器中 /etc/nginx
下的所有配置文件到到主机的 /usr/nginx
文件夹中
docker cp 423aebc1c6d4:/etc/nginx /usr/local
- 删除这个 名为 test_nginx 的容器
docker stop 423aebc1c6d4
docker rm 423aebc1c6d4
5.31 正式部署
运行nginx容器,别名xy_nginx 并加入到网络my-net
docker run -d --name xy_nginx \
-p 80:80 \
-v /var/nginx/www/html:/var/www/html \
-v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/nginx/conf.d:/etc/nginx/conf.d \
-v /usr/local/nginx/logs:/var/log/nginx \
--network my-net nginx:latest
'\'表示换行,但是命令不执行
这里有几个注意事项:
- (1)第一个“-v”,是项目位置,把系统的/var/nginx/www/html项目放到挂载到容器的/var/www/html目录下;
- (2)第二个“-v”,是挂载的主配置文件"nginx.conf",注意"nginx.conf"文件内有一行"include /etc/nginx/conf.d/*.conf;",这个include指向了子配置文件的路径,此处注意include后所跟的路径一定不要出错。
- (3)第三个“-v”,把docker内子配置文件的路径也挂载了出来,注意要与(2)中include指向路径一致
- (4)第四个“-v”,把docker内错误日志的路径也挂载了出来,注意要与/etc/nginx/nginx.conf 主配置的error_log指向路径
/var/log/nginx
一致 - (5)重点强调一下,nginx.conf是挂载了一个文件(docker是不推荐这样用的),conf.d挂载的是一个目录
思路:配置时一定要铆定一个思路:挂载出来的文件运行时是要加载到docker进程中去的!这样就不容易混淆。
5.3.1 修改nginx 的子配置文件
(nginx 的主配置文件 /usr/local/nginx/nginx.conf 加载*.conf,所以所有的以.conf结尾的 子配置文件相同位置的配置会按照拼音首字母先后优先级覆盖 )
只修改主机的 /usr/local/nginx/conf.d/default.conf 子配置的一小部分,其他的不变
原来的default.conf 内容:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/nginx/dacheng-wechat-web;
index index.html index.htm;
autoindex on;
try_files $uri /index/index/page.html;
#try_files $uri /index/map/page.html;
}
#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 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
修改之后:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
#修改部分
#root /usr/nginx/dacheng-wechat-web;
root /var/www/html;
#修改部分
index index.html index.htm index.php;
autoindex on;
try_files $uri /index/index/page.html;
#try_files $uri /index/map/page.html;
}
#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 /var/www/html;
fastcgi_index index.php;
fastcgi_pass xy_phpfpm:9000;
#如果你的根目录和php容器的根目录不一样,这里的$document_root需要换成你php下的根目录,不然php就找不到文件了
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
xy_phpfpm是容器别名;
5.4
然后进入到我们的php容器,然后我们在/var/www/html目录下新建一个index.php文件
内容:
<?php
try {
$con = new PDO('mysql:host=mysql;dbname=test', 'xuye', 'xy123456');
$con->query('SET NAMES UTF8');
$res = $con->query('select * from test');
while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
echo "id:{$row['id']} name:{$row['name']}";
}
} catch (PDOException $e) {
echo '错误原因:' . $e->getMessage();
}
参考文章:
(1).docker 搭建lnmp
https://blog.youkuaiyun.com/xy752068432/article/details/75975065#comments
(2). docker 容器互联
https://yeasy.gitbooks.io/docker_practice/network/linking.html
(3) 在Docker容器中安装vim
https://blog.youkuaiyun.com/a785975139/article/details/80654037
(4)在docker 中配置nginx
https://blog.youkuaiyun.com/wangfei0904306/article/details/77623400
(5) 在docker 中配置nginx