首先了解一个方法:
使用docker exec进入docker容器
docker在1.3.x版本之后还提供了一个新的命令exec用于进入容器,这种方式相对更简单一些,下面我们来看一下该命令的使用:
1
|
sudo docker exec --help
|
接下来我们使用该命令进入一个已经在运行的容器
1
2
|
$ sudo docker ps
$ sudo docker exec -it 775c7c9ee1e1 /bin/bash
|
一. 配置nginx
查找docker hub 上的 nginx 镜像
1
2
3
4
5
6
7
8
9
10
11
12
|
runoob@runoob:~ /nginx $ docker search nginx
name description stars official automated
nginx official build of nginx. 3260 [ok]
jwilder /nginx-proxy automated nginx reverse proxy for docker c... 674 [ok]
million12 /nginx-php nginx + php-fpm 5.5, 5.6, 7.0 (ng), centos... 67 [ok]
maxexcloo /nginx-php docker framework container with nginx and ... 57 [ok]
webdevops /php-nginx nginx with php-fpm 39 [ok]
h3nrik /nginx-ldap nginx web server with ldap /ad , ssl and pro... 27 [ok]
bitnami /nginx bitnami nginx docker image 19 [ok]
maxexcloo /nginx docker framework container with nginx inst... 7 [ok]
...
|
这里我们拉取官方的镜像
1
|
runoob@runoob:~ /nginx $ docker pull nginx
|
等待下载完成后,我们就可以在本地镜像列表里查到 repository 为 nginx 的镜像。
1
2
3
|
runoob@runoob:~ /nginx $ docker images nginx
repository tag image id created size
nginx latest 555bbd91e13c 3 days ago 182.8 mb
|
创建并运行容器:
1
|
docker run --name mynginx -p 80:80 - v /var/www : /var/www - v /usr/local/nginx/conf/conf .d: /etc/nginx/conf .d -d nginx
|
注意:
-v 添加文件映射关系,这样在宿主机上更改的文件可以直接映射到容器中。这里的目录根据自己实际情况进行映射。
创建并运行容器后,docker内的nginx即启动成功,无需进入docker内部再次启动nginx, 否则会提示80等端口被占用,因为nginx已经启动。
这时候便可以访问nginx配置的域名验证了。
我这里映射的conf.d主要包含nginx的配置文件,php的配置信息为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
# php
server {
charset utf-8;
client_max_body_size 128m;
listen 80; ## listen for ipv4
#listen [::]:80 default_server ipv6only=on; ## listen for ipv6
server_name www.baidu.com;
root / var /www;
index index.php;
location / {
#-e表示只要filename存在,则为真
if (!-e $request_filename ){
rewrite ^(.*)$ /index.php?s= $1 last;
break ;
}
# redirect everything that isn't a real file to index.php
try_files $uri $uri / /index.php $is_args $args ;
}
# uncomment to avoid processing of calls to non-existing static files by yii
#location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
# try_files $uri =404;
#}
#error_page 404 /404.html;
# deny accessing php files for the /assets directory
location ~ ^/assets/.*\.php$ {
deny all;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param script_filename $document_root $fastcgi_script_name ;
fastcgi_pass 172.17.0.3:9000;
#fastcgi_pass unix:/ var /run/php5-fpm.sock;
try_files $uri =404;
}
location ~* /\. {
deny all;
}
}
|
注意最后面的fastcgi_pass的ip地址,在php配置常见问题有详细介绍。
二. php配置
查找docker hub上的php镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
runoob@runoob:~ /php-fpm $ docker search php
name description stars official automated
php while designed for web development, the ph... 1232 [ok]
richarvey /nginx-php-fpm container running nginx + php-fpm capable ... 207 [ok]
eboraas /apache-php php5 on apache (with ssl support), built o... 69 [ok]
php-zendserver zend server - the integrated php applicati... 69 [ok]
million12 /nginx-php nginx + php-fpm 5.5, 5.6, 7.0 (ng), centos... 67 [ok]
webdevops /php-nginx nginx with php-fpm 39 [ok]
webdevops /php-apache apache with php-fpm (based on webdevops /php ) 14 [ok]
phpunit /phpunit phpunit is a programmer-oriented testing f... 14 [ok]
tetraweb /php php 5.3, 5.4, 5.5, 5.6, 7.0 for ci and run... 12 [ok]
webdevops /php php (fpm and cli) service container 10 [ok]
...
|
这里我们拉取官方的镜像,标签为5.6-fpm
1
|
runoob@runoob:~ /php-fpm $ docker pull php:5.6-fpm
|
等待下载完成后,我们就可以在本地镜像列表里查到repository为php,标签为5.6-fpm的镜像。
1
2
3
|
runoob@runoob:~ /php-fpm $ docker images
repository tag image id created size
php 5.6-fpm 025041cd3aa5 6 days ago 456.3 mb
|
创建并运行php容器:
1
|
docker run -p 9000:9000 --name phpfpm - v /var/www : /var/www -d php:5.6-fpm
|
注意这里一定要创建文件映射,或者php容器内有对应的php代码。上一步nginx的文件映射,在这里是找不到的。所以如果没有文件映射,127.0.0.1:9000 在此容器内就找不到文件 。
常见问题:
启动php容器后,如果访问nginx为:502 bad gateway
尝试以下方法:
查看php镜像的ip地址
1
|
docker inspect -- format = '{{.networksettings.ipaddress}}' phpfpm
|
如:192.168.4.202
那么修改nginx的conf配置文件,使fastcgi_pass的值为 192.168.4.202:9000
vim /docker/nginx/conf.d/default.conf
fastcgi_pass 192.168.4.202:9000;
重启nginx容器后,就可以正常访问。
三. mysql配置
查找docker hub上的mysql镜像
1
2
3
4
5
6
7
8
9
10
11
12
|
runoob@runoob: /mysql $ docker search mysql
name description stars official automated
mysql mysql is a widely used, open - source relati... 2529 [ok]
mysql /mysql-server optimized mysql server docker images. crea... 161 [ok]
centurylink /mysql image containing mysql. optimized to be li... 45 [ok]
sameersbn /mysql 36 [ok]
google /mysql mysql server for google compute engine 16 [ok]
appcontainers /mysql centos /debian based customizable mysql con... 8 [ok]
marvambass /mysql mysql server based on ubuntu 14.04 6 [ok]
drupaldocker /mysql mysql for drupal 2 [ok]
azukiapp /mysql docker image to run mysql by azuki - http:... 2 [ok]
...
|
这里我们拉取官方的镜像,标签为5.6
1
|
runoob@runoob:~ /mysql $ docker pull mysql:5.6
|
等待下载完成后,我们就可以在本地镜像列表里查到repository为mysql,标签为5.6的镜像。
1
2
|
runoob@runoob:~ /mysql $ docker images | grep mysql
mysql 5.6 2c0964ec182a 3 weeks ago 329 mb
|
创建并运行mysql容器:
1
|
docker run -p 3306:3306 --name mysql - v /usr/local/mysql : /etc/mysql/sqlinit -e mysql_root_password=123456 -d mysql:5.6
|
这里的文件映射主要目的是把宿主机的sql数据库数据文件映射到docker mysql容器,方便导入,注意这里mysql容器的目录不能是已有的目录,否则会覆盖。
注意:
这里创建容易已经有了my.cnf,无需自己添加。
拓展
使用外部工具navicat连接docker 内mysql
mysql的host 填写docker内的ip,获取方式为:
1
|
docker inspect -- format = '{{.networksettings.ipaddress}}' mysql
|
填写ssh连接信息:
即可连接成功!
注意:
docker的容器启动顺序问题会导致容器的ip地址不一致,如果在连接数据库和fastcgi处有用到容器的ip,要注意容器的启动顺序。
重启容器:docker restart 容器名/容器id
关闭容器:docker stop xxx
开启容器:docker start xxx
查看正在运行的容器:docker ps
查看所有容器(包括未运行的容器): docker ps -a
创建并运行容器: docker run
---------------------------------------
常见报错:
1. thinkphp报错 undefined class constant 'mysql_attr_init_command'
缺少pdo_mysql扩展,链接数据库失败
找到php.ini,docker中在/usr/local/etc/php中,复制一份php.ini,增加 extension=pdo_mysql.so ,重启phpfpm。
如果还不行,访问phpinfo页面,查看是否有pdo_mysql
如果没有,说名扩展不存在,需要编译。
编译方法如下:
可以通过两种方式实现
方式一(未验证):
pecl pdo_msql
方式二(已验证可行):
到docker的php容器中,在php文件夹下:
1
|
docker-php-ext- install pdo pdo_mysql
|
如果报 /usr/local/bin/docker-php-ext-enable: cannot create /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini: directory nonexistent
解决方案:
直接在/usr/local/etc/php目录下面新建 conf.d目录和对应的docker-php-ext-pdo_msql.ini文件
其中docker-php-ext-pdo_msql.ini的内容为:
extension=pdo_mysql.so
2. thinkphp 报错 _storage_write_error_:./application/runtime/cache/home/4e64ea6a2012f26b832b14cbc2152b28.php
是因为服务器缓存文件夹的操作权限不够,即runtime没有权限,把缓存文件全部删除,再给runtime777权限就行了
sudo chmod 777 runtime 或者直接对代码库最外层设置777权限
3. thinkphp验证码图片显示不出来
缺少gd扩展,安装:
1
|
docker-php-ext- install pdo pdo_mysql
|
可能以下报错:
1
2
3
|
if configure fails try --with-webp-dir=<dir>
if configure fails try --with-jpeg-dir=<dir>
configure: error: png.h not found.
|
安装:
1
|
apt-get install libpng-dev libjpeg-dev
|
再次执行:
1
2
3
4
5
|
// 增加freetype配置
docker-php-ext-configure gd --enable-gd-native-ttf --with-freetype-dir=/usr/ include /freetype2 --with-png-dir=/usr/ include --with-jpeg-dir=/usr/ include
// 安装
docker-php-ext-install gd
|
php.ini增加php_gd2.so
phpinfo中显示gd库
注意如果phpinfo的gd库中没有freetype的支持,验证码依然显示不出来, 会报错:
call to undefined function think\imagettftext()
如果gd库中没有freetype,则按照以下步骤进行:
1
2
3
4
|
docker-php-ext-configure gd -- enable -gd-native-ttf --with-freetype- dir = /usr/include/freetype2 --with-png- dir = /usr/include
重新编译:
docker-php-ext- install gd
|
如果报错:
configure: error: freetype-config not found.
运行: apt- get -y install libfreetype6-dev ,然后再继续运行上面的命令。
gd库中有了freetype,则验证码显示正常了:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/saysmy/p/10389902.html