Docker - 搭建LNMP环境 - 学习/实践
1.應(yīng)用場景
| 主要用于學(xué)習(xí)使用docker搭建開發(fā)環(huán)境. 學(xué)習(xí)容器化技術(shù). 以及快速搭建開發(fā)環(huán)境, 同時保持團隊之間開發(fā)/測試環(huán)境相同~~~~ |
2.學(xué)習(xí)/操作
1.文檔閱讀Docker - 學(xué)習(xí)/實踐_穿素白衫的少年的博客-CSDN博客?// 所需文檔 Docker 入門教程 - 阮一峰的網(wǎng)絡(luò)日志?//? 再放一次, 推薦閱讀~~~ Docker 微服務(wù)教程 - 阮一峰的網(wǎng)絡(luò)日志?// Docker - 微服務(wù)教程 避坑!用Docker搞定PHP開發(fā)環(huán)境搭建?//?避坑!用Docker搞定PHP開發(fā)環(huán)境搭建? -- 20210424 周六 公寓 docker搭建環(huán)境(php+nginx+mysql)_-client的博客-CSDN博客?//?docker搭建環(huán)境(php+nginx+mysql) 插入:其他人發(fā)布的搭建lnmp的鏡像與GitHub項目 Docker Hub Docker Hub GitHub - thinksvip/lnmp: LNMP docker production environment 單獨安裝Nginx,PHP, MySQL MySQL 8.0 - 安裝[含Docker安裝] - Win10/Mac_穿素白衫的少年的博客-CSDN博客 MySQL 8.0 - Docker安裝 - Win10 - 學(xué)習(xí)/實踐_穿素白衫的少年的博客-CSDN博客 Docker - Windows下安裝Nginx - 學(xué)習(xí)/實踐_穿素白衫的少年的博客-CSDN博客 Docker - PHP - 如何使用php image - 學(xué)習(xí)/實踐_穿素白衫的少年的博客-CSDN博客 待做: 將下面也打包成docker image發(fā)布到docker hub 2.整理輸出這里主要整合上面幾個文檔可取之處, 整理出個人認(rèn)為比較好【比較適合自己】的方式~~ 2.1 LNMP拆分為多個容器, 單獨運行.如拆分為:? Nginx, PHP, MySQL三個容器
2.2?同一個容器中, 搭建LNMP環(huán)境TBD 優(yōu)化:TBDhttp://www.dockerinfo.net/docker-compose-項目?// 一個項目一個容器,這種方式個人認(rèn)為更好~ 3. 思考TBD 后續(xù)補充 ... |
3.問題/補充
1.?如何在php7.2/php7.3中安裝mcrypt擴展?如何在php7.2/php7.3中安裝mcrypt擴展?-php教程-PHP中文網(wǎng) 2. 如何安裝pdo_mysql擴展?docker-php-ext-install pdo pdo_mysql 解決方案: extension=pdo_mysql.so 修改完重復(fù)執(zhí)行安裝命令 3. 使用PDO去測試連接mysql容器服務(wù),一直報錯SQLSTATE[HY000] [2002] No such file or directory 搜索了一些問答, 結(jié)果全是關(guān)于apache相關(guān)的問題, 而且多是使用laravel數(shù)據(jù)庫出現(xiàn)的錯誤 php - PDOException SQLSTATE[HY000] [2002] No such file or directory - Stack Overflow?//?PDOException SQLSTATE[HY000] [2002] No such file or directory 結(jié)論就是設(shè)置, mysql的socket,php.ini中的pdo_mysql.default_socket=/tpm/mysql.sock 或者?pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock 以上操作, 但均沒有效果, 而且冷靜下來,想了下連接mysql server的方式, 目前為止, 個人沒有用過socket方式, 至于怎么用TBD 都是使用IP+port方式進行連接, 才想明白, 可能是IP不對, 不能使用lcoalhost或者127.0.0.1本機IP,而應(yīng)該使用容器分配的私有IP 查看容器IP方式 docker inspect 容器ID? 找到IPAddress即可 -- 補充 舊截圖 修改IP,如上 瀏覽器中訪問測試地址 終于訪問成功~~ 思考網(wǎng)上資料質(zhì)量參差不齊,加上個人相關(guān)知識【基礎(chǔ)知識】薄弱, 如果找不到權(quán)威的資料去查看,學(xué)習(xí),實踐,就會花費比較多的時間去弄這件事, 而且花的時間太多卻一直得不到想要的結(jié)果, 本身就是一個負(fù)反饋的過程,?不利于繼續(xù)學(xué)習(xí), 深入。 個人思考后,建議應(yīng)該多學(xué)習(xí)基礎(chǔ)知識,而且在遇到問題時, 盡量去查找相關(guān)權(quán)威資料, 不要上來就百度,而應(yīng)該先花費至少五分鐘思考下,最好寫下來, 哪里會有這方面的權(quán)威資料, 或者請求比較權(quán)威的幫助,比如自己的技術(shù)Leader,或者有可通訊的技術(shù)大佬【不過可能回復(fù)不及時】,? 然后再去實踐,同時在這個過程中,要不斷思考, 盡量結(jié)合以往的知識,經(jīng)驗去推敲,思考驗證,從步步逼近真實情況。如果能將這個過程循環(huán)往復(fù),技能, 知識技能必會有所進益,這才是一個做技術(shù)人應(yīng)該有的態(tài)度和習(xí)慣~ 當(dāng)然更重要的是,可以節(jié)省更多時間去做更多有意義感興趣的事情~ 至于redis,使用localhost時出現(xiàn)報錯,已經(jīng)想到了,是相同的原因 解決辦法,使用容器的IP即可 Fatal error: Uncaught RedisException: Connection refused in /var/www/html/redis.php:4 Stack trace: #0 /var/www/html/redis.php(4): Redis->connect('127.0.0.1', 6379) #1 {main} thrown in?/var/www/html/redis.php?on line?4 4. 查看容器所有的IPdocker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) 可以看到容器的IP是后先后順序的,都是172.17.0.x .... Note容器的IP是會變化的,要確認(rèn)清楚,否則會連接失敗!解決辦法 固定容器IP,具體參考: https://sleele.com/2020/04/26/docker-compose固定容器ip寫法/?// docker-compose固定容器IP寫法 Docker 容器固定 IP - Yogile - 博客園. // Docker 容器固定 IP 5. 容器環(huán)境下,在物理機中執(zhí)行數(shù)據(jù)庫遷移命令,報如下錯,分析報錯信息,可初步判斷是連接被拒絕,應(yīng)該是連接配置信息不正確導(dǎo)致的。 ? ?laravel7.test git:(master) ? php72 artisan migrate ? ?Illuminate\Database\QueryException? ? SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel7.test and table_name = migrations and table_type = 'BASE TABLE') ? at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671 ? ? ? +36 vendor frames? 這里是因為項目代碼中使用的DB_HOST使用的是容器IP「僅僅是用于容器之間的通信」,但是在物理機環(huán)境下,是識別不到該地址的。 所以,解決辦法: 進入到php-fpm容器中,執(zhí)行遷移命令 到容器中執(zhí)行命令,依然失敗,說明配置還是有問題 最后發(fā)現(xiàn)你是容器的IP發(fā)生變化,修改為爭取的IP即可 -- 上面的方式,存在一個問題:IP在重啟容器的時候,可能會發(fā)生變化,這就導(dǎo)致,需要重新配置DB,Redis 的IP? --- 解決辦法:TBD 優(yōu)化: 更好的解決辦法TBD 6. Nginx 和 PHP-FPM容器中執(zhí)行PS命令提示命令不存在原因:該nginx等鏡像沒有打包ps命令 使用如下命令安裝 apt-get update && apt-get install procps 再執(zhí)行PS命令如下: PHP-FPM Nginx 7.?docker修改redis配置文件推薦還是像mysql,nginx,php-fpm那樣將redis的配置文件掛載到外部文件系統(tǒng) 單獨實例化 redis容器: sudo docker run -p 6379:6379 \ --name redis -v /data/redis/redis.conf:/etc/redis/redis.conf \ -v /data/redis/data:/data \ -d redis redis-server /etc/redis/redis.conf \ --appendonly yes docker修改redis配置文件_城北碼農(nóng)的博客-CSDN博客_docker修改redis配置文件 目前先基于當(dāng)前的環(huán)境,進入容器進行下修改: 找到redis的安裝路徑,以及配置 root@9e80a893b099:/usr/local/bin# ls docker-entrypoint.sh? gosu? redis-benchmark? redis-check-aof? redis-check-rdb? redis-cli? redis-sentinel? redis-server root@9e80a893b099:/usr/local/bin# pwd /usr/local/bin root@9e80a893b099:/usr/local/bin# 但是沒有找到redis的配置文件 Docker Hub 根據(jù)docker官方redis鏡像文檔說明,可以知道,如果實例化redis容器時,沒有指定redis.conf 則容器并沒有redis.conf文件,那么現(xiàn)在的解決方案有兩種: 1. 手動下載一個redis.conf文件,并且重啟redis容器并加載redis.conf配置文件 2. 重新實例化一個redis容器。 redis.conf文件下載地址 Redis configuration | Redis 這里是6.2.4 https://raw.githubusercontent.com/redis/redis/6.2/redis.conf 終端curl下載 或者 瀏覽器打開,然后全選復(fù)制 這里先采用方式一:「不推薦,這里只是作為臨時方案」 進入指定目錄下,創(chuàng)建redis.conf 復(fù)制之前redis.conf內(nèi)容到該文件中「走網(wǎng)絡(luò)傳輸」 記得配置 requirepass your-password /usr/local/etc/redis/redis.conf Note:docker容器中「當(dāng)然要根據(jù)自己操作系統(tǒng)來定,不過可以多試試」 安裝vim: apt-get update?&& apt-get install vim 安裝ps命令:apt-get update && apt-get install procps 在容器中啟動redis服務(wù) ?可以看到啟動./redis-server出現(xiàn)警告和報錯,因為: 1. 「警告」沒有指定配置文件 2. 「報錯」端口已經(jīng)占用「因為redis服務(wù)已經(jīng)有一個啟動,使用的正是6379端口」 解決辦法: 關(guān)掉已經(jīng)啟動的redis服務(wù),同時指定我們剛添加/修改的redis配置文件 查看redis進程 root@9e80a893b099:/usr/local/bin# ps aux |grep redis redis? ? ? ? ? 1? 0.1? 0.3? 52968 12632 ?? ? ? ? Ssl? 03:18 ? 0:06 redis-server *:6379 root? ? ? ? 1066? 0.0? 0.0 ? 3084 ? 892 pts/3? ? S+ ? 05:03 ? 0:00 grep redis root@9e80a893b099:/usr/local/bin# 「上面的數(shù)字并不是PID,導(dǎo)致kill失敗」 root@9e80a893b099:/usr/local/bin# ps -ef? ? ? ? ? ? UID? ? ? ? ? PID? ? PPID? C STIME TTY? ? ? ? ? TIME CMD redis? ? ? ? ? 1 ? ? ? 0? 0 03:18 ?? ? ? ? 00:00:07 redis-server *:6379 root? ? ? ? ? 19 ? ? ? 0? 0 03:20 pts/0? ? 00:00:00 bash root? ? ? ? ? 41 ? ? ? 0? 0 03:43 pts/1? ? 00:00:00 bash root? ? ? ? ? 89 ? ? ? 0? 0 04:29 pts/2? ? 00:00:00 bash root ? ? ? ? 480 ? ? ? 0? 0 04:48 pts/3? ? 00:00:00 bash root? ? ? ? 1081 ? ? 480? 0 05:07 pts/3? ? 00:00:00 ps -ef root@9e80a893b099:/usr/local/bin# ps -ef | grep redis redis? ? ? ? ? 1 ? ? ? 0? 0 03:18 ?? ? ? ? 00:00:07 redis-server *:6379 root? ? ? ? 1083 ? ? 480? 0 05:07 pts/3? ? 00:00:00 grep redis root@9e80a893b099:/usr/local/bin# kill 1 root@9e80a893b099:/usr/local/bin# [root@MrNing ~]# 雖然成功了,但是不好意思,直接退出docker容器「容器應(yīng)該是被關(guān)閉了,畢竟PID=1的進程是祖宗進程」 然后重新進入redis容器,回到了上面的問題「應(yīng)是redis容器配置自動重啟服務(wù)」。 如果換個端口,則沒問題 重新開個終端,進入redis容器,連接6380端口的redis實例 斷開ssh連接后,重新連接后,發(fā)現(xiàn)依然有兩個redis服務(wù), 「不過,在重啟redis 容器后,應(yīng)該就只會剩下一個,就是6379端口的redis服務(wù)」 kill 6380端口的redis server,并沒有退出redis容器。 重啟redis容器,然后進入redis容器中,如下 ? 說明與學(xué)習(xí):1. 因為服務(wù)器并沒有暴露6380端口,以及映射端口到容器‘ 2. 說明redis docker容器也可以同時實例化多個redis服務(wù)「容器本質(zhì)上也是提供了一個環(huán)境,即容器,內(nèi)部還是通過軟件的形式發(fā)揮作用」。 方式一目前失敗了「或者說暫時不再深入下去」 只能采用方式二進行解決了修改docker-compose.yml文件中redis的配置 TBD |
4.參考
| Docker - 學(xué)習(xí)/實踐_穿素白衫的少年的博客-CSDN博客?// 所需文檔 Docker 入門教程 - 阮一峰的網(wǎng)絡(luò)日志?//? 再放一次, 推薦閱讀~~~ 避坑!用Docker搞定PHP開發(fā)環(huán)境搭建?//?避坑!用Docker搞定PHP開發(fā)環(huán)境搭建? -- 20210424 周六 公寓 https://sleele.com/2020/04/26/docker-compose固定容器ip寫法/?// docker-compose固定容器IP寫法 Docker 容器固定 IP - Yogile - 博客園. // Docker 容器固定 IP |
后續(xù)補充
...
總結(jié)
以上是生活随笔為你收集整理的Docker - 搭建LNMP环境 - 学习/实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用matlab仿真几类混沌电路,改进型
- 下一篇: 关于“分节符(下一页)”和“分节符(奇数