教女朋友web開發,第1節:Docker搭建Codeigniter的開發環境
目錄:
如果你也開啟這個地址,你會發現,Intl左右有兩個*,其實這漢化過來的時候沒有做好。需要7.2或更新版本的 PHP :我們PHP就選擇php:7.4.8-apache的Docker映象好了
1. 選擇Docker映象我們的Dockerfiel檔案裡面新增第1部分:
# https://hub.docker.com/_/php 在這個地方可以看到官方的php映象,選擇自己需要的。FROM php:7.4.8-apache
這個版本的映象是基於debian:buster-slim, 我們安裝軟體的時候就可以按debian作業系統的方式來:
2.軟體源-配置國內映象我們如果在映象php:7.4.8-apache這個基礎上直接安裝相應的軟體,那麼由於國內的網路問題你會發現,速度真的不是一般的慢。好在國內也有不少這方面的映象可以使用。Debian 的軟體源配置檔案是 /etc/apt/sources.list。如果我們run這個映象,我們可以看到sources.list它的內容是這樣:
# cat sources.list.back.2021.01.19# deb http://snapshot.debian.org/archive/debian/20200720T000000Z buster maindeb http://deb.debian.org/debian buster main# deb http://snapshot.debian.org/archive/debian-security/20200720T000000Z buster/updates maindeb http://security.debian.org/debian-security buster/updates main# deb http://snapshot.debian.org/archive/debian/20200720T000000Z buster-updates maindeb http://deb.debian.org/debian buster-updates main
可以看到buster字眼,將系統自帶的該檔案做個備份(先把舊的檔案備份好這是一個很好的習慣):
mv /etc/apt/sources.list /etc/apt/sources.list.back.2021.01.19
軟體源配置檔案,要配置映象的設定可以從下面這個網站找到:
https://mirrors.tuna.tsinghua.edu.cn/help/debian/
我們的Dockerfiel檔案裡面新增第2部分:
#第2部分 apt update 加速RUN echo '# 預設註釋了原始碼映象以提高 apt update 速度,如有需要可自行取消註釋' > /etc/apt/sources.list && \echo 'deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free' >> /etc/apt/sources.list && \echo '# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free' >> /etc/apt/sources.list && \echo 'deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free' >> /etc/apt/sources.list && \echo '# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free' >> /etc/apt/sources.list && \echo 'deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free' >> /etc/apt/sources.list && \echo '# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free' >> /etc/apt/sources.list && \echo 'deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free' >> /etc/apt/sources.list && \echo '# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free' >> /etc/apt/sources.list && \
這裡的第1行的是隻有一個>為建立,其他行是>> 為追加, 最後一行的話尾部是&& \,因為後面還有沒寫完的, 一個RUN語句儘可能多的寫一些,這也是Docker的最佳策略之一。
3.安裝常用軟體可以多看看別人寫的Dockerfile,借鑑一下別人的思路和各種寫法。我們在php官方的Dockerfile可以看到這樣一部分:
RUN set -eux; \ apt-get update; \ apt-get install -y --no-install-recommends \ $PHPIZE_DEPS \ ca-certificates \ curl \ xz-utils \ ; \ rm -rf /var/lib/apt/lists/*
這裡,set -eux; 有三個意思:
e 若指令傳回值不等於0,則立即退出shell。 u 當執行時使用到未定義過的變數,則顯示錯誤資訊。x 執行指令後,會先顯示該指令及所下的引數。以上這三點參考自:https://www.cnblogs.com/robinunix/p/11635560.html
其中& 、; 、&& 的區別的例子:
command1 & command2 & command3 三個命令同時執行 command1; command2; command3 不管前面命令執行成功沒有,後面的命令繼續執行 command1 && command2 只有前面命令執行成功,後面命令才繼續執行
我們的Dockerfiel檔案裡面新增第3部分:
#第3部分,安裝 vim mlocate unzip wgetset -eux; \ apt-get update && \ apt-get install -y --no-install-recommends \ vim \ mlocate \ unzip \ tree \ wget && \ rm -rf /var/lib/apt/lists/* && \ apt-get clean
4. 安裝intl:
我們的Dockerfiel檔案裡面新增第4部分,安裝intl:
#第4部分 安裝intl:RUN apt-get update && \apt-get install -y --no-install-recommends libicu-dev && \rm -r /var/lib/apt/lists/* && \docker-php-ext-install -j$(nproc) intl && \docker-php-ext-install mysqli
在phpinf()裡可以看到:
5.安裝libcurl我們的Dockerfiel檔案裡面新增第5部分,安裝libcurl:
第5部分,安裝libcurl:RUN apt-get update && \apt-get install -y --no-install-recommends libcurl4-openssl-dev && \rm -r /var/lib/apt/lists/*
6. 選擇Codeigniter版本
我們就選擇4.04版本好了。它的下載地址在:
https://github.com/codeigniter4/framework/archive/v4.0.4.zip
將這個檔案下載到我們的映象裡(Dockerfiel檔案裡):我們的Dockerfiel檔案裡面新增第6部分:
# 第6部分:RUN mkdir /virhuiai/ && cd /virhuiai && wget https://github.com/codeigniter4/framework/archive/v4.0.4.zip && unzip v4.0.4.zip
解壓後在目錄/virhuiai/framework-4.0.4下
7. 配置php查詢 php.ini 的位置法一:locate命令
# updatedb# locate php.ini/usr/local/etc/php/php.ini-development/usr/local/etc/php/php.ini-production
法二:在php的Dockerfile中能看到php.ini的位置
https://hub.docker.com/layers/php/library/php/7.4-apache/images/sha256-a04de56c0cd08d5372c07cedf8fdf0b609b61e947750c72589ff95fb10099948?context=exploreENV PHP_INI_DIR=/usr/local/etc/php
複製生成開發環境的php.ini, 我們的Dockerfiel檔案裡面新增第7部分:
# 第7部分RUN cp /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini && \
先看下舊資料:
vim /usr/local/etc/php/php.ini
啟用拓展,我們的Dockerfiel檔案裡面新增第8部分:
# 第7.2部分sed -ri -e 's!;extension=intl!extension=intl!g' /usr/local/etc/php/php.ini && \sed -ri -e 's!;extension=mysqli!extension=mysqli!g' /usr/local/etc/php/php.ini && \sed -ri -e 's!;extension=mbstring!extension=mbstring!g' /usr/local/etc/php/php.ini && \sed -ri -e 's!;extension=mbstring!extension=mbstring!g' /usr/local/etc/php/php.ini && \sed -ri -e 's!;extension=pdo_sqlite!extension=pdo_sqlite!g' /usr/local/etc/php/php.ini \
8.設定apache目錄我們的Dockerfiel檔案裡面新增第8部分:
# 第8部分#ENV APACHE_DOCUMENT_ROOT '/virhuiai/framework-4.0.4/public'RUN sed -ri -e 's!/var/www/html!/virhuiai/framework-4.0.4/public!g' /etc/apache2/sites-available/*.conf && \sed -ri -e 's!/var/www/!/virhuiai/framework-4.0.4/public!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.confWORKDIR /virhuiai/framework-4.0.4/public
# 第9部分# 映象資訊LABEL Author="virhuiai"LABEL Version="0.0.2"LABEL Description="PHP APACHE CODEIGNITER 映象"
9.映象測試
cd /Users/virhuiaivirhuiai/Documents/virhuiai-github/teaching_gf_web_developdocker build . -t tmpimgdocker run -d -p 80:80 --rm --name tmpimg_c tmpimg
啟動,在宿主機上就可以使用了,這會目前因為未配置資料庫,會報錯
進入終端
docker exec -it tmpimg_c /bin/sh
10 複製檔案到宿主機
docker cp tmpimg_c:/virhuiai/framework-4.0.4/ /Users/virhuiaivirhuiai/Documents/virhuiai-github/teaching_gf_web_develop
後面執行時就可以從外面對映到裡面了。
發現Docker Hub上的配置需要修改下:
提交到Docker Hub,生成:
virhuiai/teaching_gf_web_develop:v-0.0.2
11 連線資料庫
暫時用 --link的方式做示例:
docker run -e MYSQL_DATABASE=ci4_database_name -e MYSQL_ROOT_PASSWORD=Passw0rd! -p 3306:3306 --name ci4mysql57 -d mysql:5.7
docker container run --publish 80:80 -v /Users/virhuiaivirhuiai/Documents/ci-framework-4.0.3:/ci4/ --name ci4 --link ci4mysql57:mysql_db -d virhuiai/teaching_gf_web_develop:v-0.0.2
12 資料庫配置app/Config/Database.php
public $default = [ 'DSN' => '', 'hostname' => 'mysql_db', 'username' => 'root', 'password' => 'Passw0rd!', 'database' => 'ci4_database_name', 'DBDriver' => 'MySQLi', 'DBPrefix' => '', 'pConnect' => false, 'DBDebug' => (ENVIRONMENT !== 'production'), 'cacheOn' => false, 'cacheDir' => '', 'charset' => 'utf8', 'DBCollat' => 'utf8_general_ci', 'swapPre' => '', 'encrypt' => false, 'compress' => false, 'strictOn' => false, 'failover' => [], 'port' => 3306, ];