Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中。我们通过部署 lnmp 环境,制作 php 镜像,来熟悉怎么快速的利用 docker 部署开发环境。
nginx 部署
1.创建服务运行网络
docker network create -d bridge my-net
2.nginx 镜像下载
docker pull hub.c.163.com/library/nginx:latest
3.编写 nginx 配置
mkdir -p /home/nginx/ && cd /home/nginx/ && vi nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
events {
worker_connections 1024; ## Default: 1024
}
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
include /etc/nginx/conf.d/*.conf;
}
4.启动 nginx 镜像,创建容器
docker run -p 80:80 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/cond.d/:/etc/nginx/conf.d -v /home/nginx/log/:/var/log/nginx/ -v /home/www/:/usr/share/nginx/html/ --name my-nginx --network my-net -ti hub.c.163.com/library/nginx:latest
-v 挂在目录
--network 指定我们 nginx 容器运行的网络(同一个网络的容器可以互相访问)
###我们看到 nginx容器已经启动 0.0.0.0:80->80 80端口映射 我通过宿主机的80端口访问到容器
[root@localhost php-fpm]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8c134ba045bb hub.c.163.com/library/nginx:latest "nginx -g 'daemon ..." 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp my-nginx
mysql 部署
1.mysql 镜像下载
docker pull hub.c.163.com/library/mysql:latest
2.编写 mysql 配置
mkdir -p /home/mysql/ && cd /home/mysql/ && vi my.cnf
[mysql]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
symbolic-links=0
[mysqld]
skip-host-cache
skip-name-resolve
3.启动 mysql 镜像,创建容器
docker run -v /home/mysql/data/:/var/lib/mysql/ --name my-mysql -e MYSQL_ROOT_PASSWORD=12345678 -p 3306:3306 -tid --network my-net hub.c.163.com/library/mysql:latest
##我们看到 mysql容器已经启动 也可以通过navicat等客户端工具连接访问
[root@localhost log]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
22aaa2e60073 hub.c.163.com/library/mysql:latest "docker-entrypoint..." About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp my-mysql
8c134ba045bb hub.c.163.com/library/nginx:latest "nginx -g 'daemon ..." 52 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp my-nginx
php 部署
1.php 镜像下载
docker pull hub.c.163.com/library/php:7.2.0RC1-fpm
2.编写 php 配置
mkdir -p /home/php/ && cd /home/php/ && vi php-fpm.conf
[global]
error_log = /var/log/php-fpm/error.log
daemonize = no
[www]
access.log = /var/log/php-fpm/access.log
clear_env = no
catch_workers_output = yes
user = www-data
group = www-data
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
listen = [::]:9000
3.启动 php 镜像,创建容器
docker run -v /home/php-fpm/php-fpm.conf:/usr/local/etc/php-fpm.conf -v /home/php-fpm/log/:/var/log/php-fpm/ -v /home/www/:/home/www/ --name my-php-fpm --network my-net -tid hub.c.163.com/library/php:7.2.0RC1-fpm
启动 php-fpm 镜像时并没有映射端口到宿主机,那怎么访问呢。
我们可以通过 nginx 的反向,访问 php-fpm,这样我们的 php-fpm 就可以通过 nginx 正常访问 php 了。
####my-php-fpm 我们php-fpm的容器名
location ~ \.php$ {
fastcgi_pass my-php-fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/$fastcgi_script_name;
include fastcgi_params;
}
##现在我们可以看到容器服务都正常启动了
[root@localhost www]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4605179a5653 hub.c.163.com/library/php:7.2.0RC1-fpm "docker-php-entryp..." 2 minutes ago Up 2 minutes 9000/tcp my-php-fpm
22aaa2e60073 hub.c.163.com/library/mysql:latest "docker-entrypoint..." 15 minutes ago Up 15 minutes 0.0.0.0:3306->3306/tcp my-mysql
8c134ba045bb hub.c.163.com/library/nginx:latest "nginx -g 'daemon ..." 24 minutes ago Up About a minute 0.0.0.0:80->80/tcp my-nginx
测试服务
curl 访问测试的文件
[root@localhost www]# echo '<?php echo "hello docker lnmp server"; ' > /home/www/index.php
[root@localhost www]# curl 192.168.139.136/index.php
hello docker lnmp server
[root@localhost www]#
制作自己的镜像
服务已经运行,我们的 php 要使用 mysqli、redis 等扩展,怎么办?docker 的 php 镜像已经有了添加扩展的工具 docker-php-ext-*,我们可以通过工具制作新的镜像使用。
下面我们制作一个支持 gd、mysqli、iconv 的镜像
1. 编写 Dockerfile 文件
Vi Dockerfile
##基础镜像
FROM hub.c.163.com/library/php:7.2.0RC1-fpm
RUN curl -k 'https://ftp.acc.umu.se/mirror/gnu.org/savannah/freetype/freetype-2.4.0.tar.gz' -o freetype.tar.gz \
&& tar -zxvf freetype.tar.gz \
&& rm freetype.tar.gz \
&& cd freetype-2.4.0 \
&& ./configure \
&& make -j \
&& make install && cd .. && rm -rf freetype-2.4.0
RUN pecl install igbinary \
&& docker-php-ext-enable igbinary
RUN pecl install redis-3.1.5 \
&& docker-php-ext-enable redis
RUN curl -k 'http://219.238.7.71/files/4239000009B52EEA/www.zlib.net/zlib-1.2.11.tar.gz' -o zlib.tar.gz \
&& tar -zxvf zlib.tar.gz \
&& rm zlib.tar.gz \
&& cd zlib-1.2.11 \
&& ./configure \
&& make -j \
&& make install && cd .. && rm -rf zlib-1.2.11 \
&& curl -k 'https://ftp-osl.osuosl.org/pub/libpng/src/libpng16/libpng-1.6.34.tar.gz' -o libpng.tar.gz \
&& tar -zxvf libpng.tar.gz \
&& rm libpng.tar.gz \
&& cd libpng-1.6.34 \
&& ./configure \
&& make -j \
&& make install && cd .. && rm -rf libpng-1.6.34
RUN docker-php-ext-install mysqli pdo_mysql iconv gd
2.构建我们的镜像
docker build -t php-fpm-ext .
## 我们看到镜像列表中已经创建出 php-fpm-ext镜像
[root@localhost php-fpm]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
php-fpm-ext latest 818c2a9a9b49 6 seconds ago 385MB
hub.c.163.com/library/php 7.2.0RC1-fpm 96a7430411ac 3 months ago 368MB
hub.c.163.com/library/nginx latest 46102226f2fd 7 months ago 109MB
hub.c.163.com/library/mysql latest 9e64176cd8a2 8 months ago 407MB
删除之前的 my-php-fpm 容器,用我们制作的镜像启动 php-fpm 容器,看下 phpinfo 中是否已经存在添加的扩展。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于