如何利用 Docker 搭建网站的开发环境 秒速五厘米 2022-05-26 01:46 162阅读 0赞 ## 准备工作 ## 在前面的章节,我们已经介绍了如何在 Windows 中安装 Docker,并介绍了一些常用的命令。 如果上述这些准备工作还没做好,请先参考 [https://blog.csdn.net/lamp\_yang\_3533/article/details/77801992][https_blog.csdn.net_lamp_yang_3533_article_details_77801992] 。 下面我们将具体介绍,如何使用 Docker 来搭建网站的开发环境。 我们以 ThinkPHP 5.1 为例,介绍如何在 Windows 中利用 docker 搭建 tp5 项目的开发环境。 * nginx 1.13.7 * php 7.1.12(php-fpm) * mysql 5.7.22 * redis 4.0.9 ## 创建 docker-compose.yml 文件 ## 在 Windows 的用户家目录(C:\\Users\\HP,简写为 ~)中,创建一个文件夹 docker\_data ,并在 ~/docker\_data 中创建 docker-compose.yml 文件。 内容如下: version: '3.6' services: web: image: richarvey/nginx-php-fpm:latest restart: always container_name: dr-web ports: - "80:80" - "9000:9000" networks: - dockerinnernet depends_on: - mysql - redis volumes: - ~/docker_data/wwwroot:/var/www/html mysql: image: mysql:5.7.22 restart: always container_name: dr-mysql ports: - 3306:3306 networks: - dockerinnernet volumes: - mydata:/var/lib/mysql - ~/docker_data/dbdump:/root environment: - MYSQL_ROOT_PASSWORD=123456 - MYSQL_DATABASE=test_db redis: image: redis container_name: dr-redis ports: - "6379:6379" networks: - dockerinnernet volumes: - ~/docker_data/redis:/data networks: dockerinnernet: volumes: mydata: 在上述代码中,我用的 nginx-php-fpm 镜像,它同时包含 nginx 和 php-fpm。你也可以分别单独拉取镜像。 ## 启动容器 ## 首先,我们需要运行 docker。点击桌面的快捷方式 Docker Quickstart Terminal,这样,Linux 虚拟机和 docker 就都启动了。 在打开的终端中,输入如下命令: # 切换到家目录下的 docker_data 目录中 $ cd ~/docker_data # 以后台方式启动容器 $ docker-compose up -d 上述命令,会根据 docker-compose.yml 配置文件,自动从远程仓库拉取镜像,并创建和运行对应的容器实例。 如果看到下面的打印信息: ... Creating dr-redis ... done Creating dr-mysql ... done Creating dr-web ... done 就说明容器启动成功了。 ### 查看本地所有的镜像 ### $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7.22 0164c13b662c 2 days ago 372MB redis latest c5355f8853e4 3 weeks ago 107MB richarvey/nginx-php-fpm latest cea38a28b888 4 months ago 281MB ### 查看正在运行的容器 ### $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 94168b153bcf richarvey/nginx-php-fpm:latest "docker-php-entrypoi…" 47 seconds ago Up 48 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:9000->9000/tcp, 443/tcp dr-web 326d294a80c1 mysql:5.7.22 "docker-entrypoint.s…" 47 seconds ago Up 49 seconds 0.0.0.0:3306->3306/tcp dr-mysql 6ce9fae6c1a2 redis "docker-entrypoint.s…" 47 seconds ago Up 49 seconds 0.0.0.0:6379->6379/tcp dr-redis ### 查看虚拟机列表 ### $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS default * virtualbox Running tcp://192.168.99.100:2376 v18.04.0-ce 这样,我们就知道了 Linux 虚拟机的 IP 地址为 192.168.99.100。 在 Windows 的浏览器中访问 [http://192.168.99.100/][http_192.168.99.100] ,得到的结果是 403 Forbidden 。这是因为网站根目录中还没有任何文件。 现在,我们在 Windows 系统的 C:\\Users\\HP\\docker\_data\\wwwroot 目录中,新建 phpinfo.php 文件,代码如下: <?php phpinfo(); 由于,我们之前做了 web 服务器根目录的映射 volumes: - ~/docker_data/wwwroot:/var/www/html 所以, ~/docker\_data/wwwroot 目录中只要发生了变更,就会自动同步到 docker 服务的 dr-web 容器实例的 /var/www/html 目录中。 注意:这个目录的映射是基于容器的,你只能在进入容器后,才能看到对应的文件,Linux 虚拟机很可能没有 /var/www/html 目录。还需记住,目录的映射是双向的。 我们可以用下面的命令从 Windows 的终端,进入容器。 $ docker exec -it dr-web /bin/bash bash-4.3# 这里我用的是容器的名称,也可以用容器的 ID 。 进入 dr-web 容器后,命令提示符变为 bash-4.3\#,表示我们可以在该容器的 bash shell 中执行 Linux 的命令。 我们来验证一下该容器的 /var/www/html 目录中是否自动就有了 phpinfo.php 文件。 bash-4.3# ls -a /var/www/html . .. phpinfo.php 验证结果确如我们所料。 通过浏览器访问 [http://192.168.99.100/phpinfo.php][http_192.168.99.100_phpinfo.php] ,就可以看到 phpinfo() 的打印信息了。 为了让我们在 Windows 系统中,就可以更改 nginx 进程的配置文件。我们也可以在 docker-compose.yml 文件中,添加对应的目录映射。 由于,我们现在还不知道容器中的 nginx 配置文件存放在哪里,以及格式如何。因此,我们可以先看下 dr-web 容器中的 nginx 配置。 bash-4.3# ls -al /etc/nginx total 92 drwxr-xr-x 9 root root 4096 Dec 2 18:48 . drwxr-xr-x 37 root root 4096 Apr 22 14:14 .. drwxr-xr-x 2 root root 4096 Dec 2 18:39 conf.d -rw-r--r-- 1 root root 1077 Dec 2 18:39 fastcgi.conf -rw-r--r-- 1 root root 1077 Dec 2 18:39 fastcgi.conf.default -rw-r--r-- 1 root root 1007 Dec 2 18:39 fastcgi_params -rw-r--r-- 1 root root 1007 Dec 2 18:39 fastcgi_params.default -rw-r--r-- 1 root root 2837 Dec 2 18:39 koi-utf -rw-r--r-- 1 root root 2223 Dec 2 18:39 koi-win -rw-r--r-- 1 root root 5170 Dec 2 18:39 mime.types -rw-r--r-- 1 root root 5170 Dec 2 18:39 mime.types.default lrwxrwxrwx 1 root root 27 Dec 2 18:39 modules -> ../../usr/lib/nginx/modules -rw-r--r-- 1 root root 774 Dec 2 18:29 nginx.conf -rw-r--r-- 1 root root 2656 Dec 2 18:39 nginx.conf.default -rw-r--r-- 1 root root 636 Dec 2 18:39 scgi_params -rw-r--r-- 1 root root 636 Dec 2 18:39 scgi_params.default drwxr-xr-x 2 root root 4096 Dec 2 18:48 sites-available drwxr-xr-x 2 root root 4096 Dec 2 18:48 sites-enabled drwxr-xr-x 2 root root 4096 Dec 2 18:48 ssl -rw-r--r-- 1 root root 664 Dec 2 18:39 uwsgi_params -rw-r--r-- 1 root root 664 Dec 2 18:39 uwsgi_params.default -rw-r--r-- 1 root root 3610 Dec 2 18:39 win-utf 通过仔细观察 /etc/nginx/nginx.conf 配置文件,里面有用到软链接,最终的虚拟主机配置文件在 /etc/nginx/sites-available 目录中。 我们需要将其从容器拷贝到 Windows 系统中。 先输入 exit 命令,退出容器的 shell,从而回到 Windows 的终端。 然后,进行拷贝: HP@LAPTOP-ND0NRET5 MINGW64 ~/docker_data $ docker cp dr-web:/etc/nginx/sites-available ./nginx 这样,dr-web 容器的 /etc/nginx/sites-available 目录中的内容,就被拷贝到了 Windows 的 C:\\Users\\HP\\docker\_data\\nginx 目录中。 然后,我们修改 docker-compose.yml 文件,在 web 服务代码块的 volumes 修改为: volumes: - ~/docker_data/wwwroot:/var/www/html - ~/docker_data/nginx:/etc/nginx/sites-available 然后,修改 ~/docker\_data/nginx 目录中的 default.conf 配置文件,再添加一个虚拟主机 server ,用来访问 tp5 项目。 server { listen 80; root /var/www/html/tp5/public; index index.php index.html index.htm; server_name tp5.test; # Disable sendfile as per https://docs.vagrantup.com/v2/synced-folders/virtualbox.html sendfile off; # Add stdout logging error_log /dev/stdout info; access_log /dev/stdout; location / { # First attempt to serve request as file, then # as directory, then fall back to index.html try_files $uri $uri/ =404; } error_page 404 /404.html; location = /404.html { root /var/www/errors; internal; } location ^~ /ngd-style.css { alias /var/www/errors/style.css; access_log off; } location ^~ /ngd-sad.svg { alias /var/www/errors/sad.svg; access_log off; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_index index.php; include fastcgi_params; } location ~* \.(jpg|jpeg|gif|png|css|js|ico|webp|tiff|ttf|svg)$ { expires 5d; } # deny access to . files, for security # location ~ /\. { log_not_found off; deny all; } location ^~ /.well-known { allow all; auth_basic off; } } 由于我们修改了 docker-compose.yml ,所以我们必须删除之前的容器,然后创建新的容器实例。 删除容器之前,需要先关闭容器。 # 关闭容器 $ docker-compose stop Stopping dr-web ... done Stopping dr-redis ... done Stopping dr-mysql ... done 再来删除已经关闭的容器。 # 删除容器,需要输入 y 确认删除 $ docker-compose rm 然后,重新创建容器。 $ docker-compose up -d 由于,在网站根目录中,还没有 tp5 的项目源码,为此,我们需要安装 tp5。 前面说过,目录的映射是双向的,我们可以在 Windows 中的 C:\\Users\\HP\\docker\_data\\wwwroot 目录中安装 tp5,也可以在 dr-web 容器的 /var/www/html 目录中进行安装。 由于 Linux 虚拟机中还没有安装 composer,而我的 Windows 中安装了 composer,所以我选择在 Windows 中使用 composer 来安装 tp5。 # 切换到 ~/docker_data/wwwroot 目录中 $ cd /c/Users/HP/docker_data/wwwroot # 执行安装 $ composer create-project topthink/think tp5 --prefer-dist 然后,在浏览器中访问 [http://192.168.99.100/tp5/public/][http_192.168.99.100_tp5_public] ,就可以看到 tp5 的欢迎界面了。 如果访问 [http://tp5.test/][http_tp5.test] ,浏览器会提示:找不到 tp5.test 的服务器 IP 地址。 这是因为,我们还没有修改 Windows 的 hosts 文件。 现在,我们编辑 C:\\Windows\\System32\\drivers\\etc\\hosts 文件,在文件的最后加上一行代码: 192.168.99.100 tp5.test 保存之后,刷新 [http://tp5.test/][http_tp5.test] ,就可以正常访问了。 到此,我们就利用 Docker ,完全搭建好了一个 tp5 项目的开发环境。 docker-compose 是一个非常常用的工具,它还有一些其他的命令和选项,具体可参考它的帮助命令。 $ docker-compose help [https_blog.csdn.net_lamp_yang_3533_article_details_77801992]: https://blog.csdn.net/lamp_yang_3533/article/details/77801992 [http_192.168.99.100]: http://192.168.99.100/ [http_192.168.99.100_phpinfo.php]: http://192.168.99.100/phpinfo.php [http_192.168.99.100_tp5_public]: http://192.168.99.100/tp5/public/ [http_tp5.test]: http://tp5.test/
还没有评论,来说两句吧...