1.阿里雲容器地址
https://cr.console.aliyun.com
2.創建鏡像倉庫
3.虛擬機修改docker源
修改文件:/etc/docker/daemon.json
內容:
{
“registry-mirrors”: [“https://78zjyej0.mirror.aliyuncs.com“]
}
4.虛擬機登錄倉庫賬號
docker login –username= registry.cn-shenzhen.aliyuncs.com
輸入賬號密碼,賬號爲阿里雲賬號,密碼是在倉庫那裏另外設置的密碼
有時login會出現這個問題:x509: certificate has expired or is not yet valid
這個問題是由於虛機的系統時間沒有校正導致的,使用date
命令查看時間是否爲本地時間 ,使用命令ntpdate cn.pool.ntp.org
校正時間,如果提示命令不存在,使用命令安裝yum instal ntp
,再使用date
命令進行查看,確保時間爲本地時間,最後重新使用docker login命令,輸入密碼即可。
5.拉取php鏡像
docker pull php:7.2-fpm
嘗試過很多php鏡像,發現還是這個好用一點,配置文件分割清析在/usr/local/etc
下面,php相關命令較全,在/usr/local/bin
下可以看到很多命令,包括phpize php-config
等等,而且改配置立即生效。
6.xdebug擴展
使用鏡像開啓一個容器docker run -itd --name php php:7.2-fpm
,進入容器docker exec -it php bash
,
使用php -m
命令可看相關模塊,筆者自己安裝了xdebug
擴展,使用命令php -i > phpinfo.txt
獲取到環境信息,複製文件裏的內容到這個網址獲取對應版本的xdebug
https://xdebug.org/wizard.php
,文件是下載到宿主機的,要拷貝文件到docker容器中,docker cp filename containerid:target_file_path
,到容器中解壓文件並進入目錄
/usr/local/bin/phpize
./configure --with-php-config=/usr/local/bin/php-config
make && make install
安裝完成,添加配置,在目錄/usr/local/etc/php/conf.d
下添加xdebug.ini文件,內容爲
;zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so
;xdebug.remote_enable=1
;xdebug.idekey="PHPSTORM"
;xdebug.remote_connect_back=1
;xdebug.remote_port=9900
;xdebug.remote_log="/tmp/xdebug_log/"
使用的時間把”;”刪除,使用xdebug生效,php -m
查看安裝模塊是否有xdebug。如果要安裝其他模塊,安裝命令和配置添加類似,可以下載相應的php安裝源碼cp到虛擬機安裝所需的擴展。(筆者曾經試過自己安裝在一個centos容器中安裝php環境,跑到最後達到了1.5G,最重要的是fileinfo這個擴展安裝不了,提示內存不足,在網上找了很多方法都不行,最後放棄了,直接找現成的php容器)
7.提交鏡像
回到宿主機,爲保留剛纔做的修改,所以重新創建一個鏡像git commit -m 'update php image' songzw/php-fpm:v1
,此時使用git images
可以看到多了一個songzw/php-fpm:v2
鏡像
8.提交鏡像到阿里倉庫
docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/songzw/php:[鏡像版本號]
把倉庫修改到阿里,docker push registry.cn-shenzhen.aliyuncs.com/songzw/php:[鏡像版本號]
完成推送。
9.在php容器中需要安裝composer才能安裝擴展包,使用composer命令時要用到git,zip,unzip命令,所以要先apt-get update
,apt-get install git zip upzip
,重新構建鏡像。
10.docker-compose構建nginx
./nginx/Dockerfile
from nginx
COPY ./*.conf /etc/nginx/conf.d/
run mkdir -p /var/nginx/logs/access /var/nginx/logs/error && chmod -R 777 /var/nginx
nginx如果本地沒有,則會先從遠程倉庫中拉取,將本地的conf配置文件拷貝到容器,在容器中創建目錄並且授權,這個不是必須的,因爲我本地的conf文件裏配置的日誌文件和錯誤文件是在這個目錄,所有本地也要先有這個目錄,如果容器起不來,使用docker logs containerid來查看日誌,有可能是這個目錄問題導致的,在docker-compose.yml文件加上tty: true
11.docker-compose構建mysql
./mysql/Dockerfile
from mysql:5.6
COPY ./*.cnf /etc/mysql/mysql.conf.d/
需要在mysql目錄下touch my.cnf
,裏面內容爲自定義配置,可以爲空,mysql:5.6鏡像如果本地不存在也是從遠程拉取。
12.docker-compose構建php
from songzw/php-fpm:v5
COPY *.conf /usr/local/etc/php-fpm.d/
COPY *.ini /usr/local/etc/php/conf.d/
run chown -R www-data.www-data /var/www
其中songzw/php-fpm:v5是筆者從php:7.2-fpm拉取下來進行重新構建的鏡像,要創建文件touch my.conf
和touch my.ini
,這樣可以添加自定義配置,/var/www修改屬主是因爲會出現緩存文件的寫權限問題
13.docker-compose.yml
最後呈現docker-compose.yml文件內容
mysql:
build: ./mysql/
volumes:
- /var/mysql/data:/var/lib/mysql
- /var/mysql/logs:/var/log/mysql
expose:
- "3306"
ports:
- 3306:3306
env_file:
- ./env
php:
build: ./php/
volumes:
- /var/www/html:/var/www/html
expose:
- "9000"
links:
- mysql
command: php-fpm
nginx:
build: ./nginx
tty: true
volumes_from:
- php
volumes:
- /var/nginx:/var/nginx
links:
- php
ports:
- "80:80"
使用docker-compose up -d
和docker-compose down
便可以搭建和銷燬環境,其中nginx的配置文件在配置連接php時使用php容器ip或者fastcgi_pass php:9000;
,php代碼連接mysql數據庫時使用mysql容器ip或者別名mysql,即links對應的別名。