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 中是否已经存在添加的扩展。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于