前幾天在騰訊購買了域名和雲主機,嘗試在docker容器内部署php+mysql+nginx,參考了https://notemi.cn/docker-quickly-set-up-php-nginx-mysql-environment.html,經過一番折騰,總算是成功了。這裡把詳細的過程寫下來,供今後參考。
系統環境:
CentOS Linux release 7.7.1908 (Core)
Docker 19.03.2
安裝docker
1. 添加repo
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2. 檢視所有倉庫中所有docker版本,并選擇特定版本安裝
$ yum list docker-ce --showduplicates | sort -r
3.推薦安裝docker的最新穩定版本
$ sudo yum install docker-ce
4.安裝好後使用下面指令檢查确認docker版本
$ docker --version
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyROBlLwYTM2AjM0QTMxEDMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
建立資源檔案夾
Docker安裝好之後,我們可以建立一些檔案夾,映射一些配置檔案或網站程式檔案到主控端。
/data
/mysql 存放資料庫備份
/nginx nginx配置檔案
/conf
/rewrite 僞靜态
/wwwroot 網站檔案
/wwwlogs 日志
/source 程式源代碼
/download 下載下傳目錄
部署Mysql
1. 拉取鏡像
2 建立mysql容器,為了便于今後的管理和指令的重複使用,直接把指令放在sh腳本檔案中
create_mysql.sh
echo "create mysql container"
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name m_mysql mysql:5.7
參數說明:
-d 容器背景運作
-p 添加主機到容器的端口映射,前面是映射到主控端的本地端口,後面是容器内需要映射的端口
-e 設定環境變量, MYSQL_ROOT_PASSWORD這裡設定了mysql的root使用者初始密碼
--name 容器的名字
之後需要進入容器執行mysql允許遠端連接配接
3. 進入容器:
$ docker exec -it m_mysql /bin/bash
4. 開啟Mysql遠端連接配接
# 進入MySQL
$ MySQL -uroot -p123456
# 選擇資料庫
> use mysql
# 開啟遠端連接配接
> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
> FLUSH PRIVILEGES;
# 重新開機
$ service mysql restart
部署PHP
這裡使用bitnami/php-fpm:7.1的鏡像,比原生的php-fpm相比,預設安裝了mysqli和pod擴充。
1. 拉取鏡像
docker pull bitnami/php-fpm:7.1
2. 建立容器。下面給出建立php容器的腳本create_php_container.sh
echo "create php container"
docker run \
-d \
-p 9000:9000 \
-v /data/wwwroot:/usr/share/nginx/html \
--link m_mysql:mysql \
--name m_phpfpm bitnami/php-fpm:7.1
參數說明:
-d 讓容器在背景運作
-p 添加主機到容器的端口映射
-v 添加目錄映射
--name 容器的名字,随便取,但是必須唯一
--link link 是在兩個contain之間建立一種父子關系,父container中的web,可以得到子container db上的資訊。
通過link的方式建立容器,我們可以使用被Link容器的别名進行通路,而不是通過IP,解除了對IP的依賴。
部署NGINX
1.首先使用指令拉取鏡像并運作容器
$ docker pull nginx:1.11.0
$ docker run -d -p 80:80 --name m_nginx nginx:1.11.0
2. 之後用docker cp指令複制配置檔案到主控端
# docker cp m_nginx:/etc/nginx/nginx.conf /data/nginx
# docker cp m_nginx:/etc/nginx/conf.d/default.conf /data/nginx/conf
3. 删除之前運作的nginx
$ docker stop m_nginx && docker rm m_nginx
4. 重新運作nginx容器,這一步跟以前一樣,建議儲存為create_nginx_container.sh腳本
docker run -d -p 80:80 --name m_nginx \
-v /data/wwwroot:/usr/share/nginx/html \
-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/conf:/etc/nginx/conf.d \
-v /data/wwwlogs:/var/log/nginx \
--link m_phpfpm:phpfpm \
nginx
5. 編輯配置檔案
修改
/data/nginx/conf/default.conf
server {
listen 80;
server_name _;
#charset koi8-r;
access_log /var/log/nginx/default_nginx.log main;
location / {
root /usr/share/nginx/html/default;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /usr/share/nginx/html/default;
fastcgi_pass phpfpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
部署phpmyadmin
1. 拉取鏡像
$ docker pull phpmyadmin/phpmyadmin
2. 建立容器
docker run -d -p 8080:80 \
--name m_phpmyadmin \
--link m_mysql:db \
phpmyadmin/phpmyadmin
注意:這一步我們把主控端的8080端口映射到容器的80端口上。
最後測試
浏覽器裡輸入http://主機位址:8080,使用者名和密碼需要跟mysql一緻。
OK,成功