docker 快速部署 lnmp 开发环境

本贴最后更新于 2541 天前,其中的信息可能已经东海扬尘

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 中是否已经存在添加的扩展。

  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 408 回帖 • 484 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    494 引用 • 928 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • CRoot

    学习了,之前容器之间的联系,我用的是 link。
    刚刚查了一下文档原来已经过时了。

    Warning: The --link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link. One feature that user-defined networks do not support that you can do with --link is sharing environmental variables between containers. However, you can use other mechanisms such as volumes to share environment variables between containers in a more controlled way.

    回头我更新一下我的容器之间的关联去。

  • alanfans via macOS

    docker-compose 走起,GitHub 上很多 docker 编排。