如何自己做攝影網(wǎng)站萬能搜索引擎網(wǎng)站
一·? 生產(chǎn)故障:docker 同一宿主機(jī)不能通信
1. 檢查容器網(wǎng)絡(luò)配置
1.1 查看容器的網(wǎng)絡(luò)信息
使用 `docker inspect` 命令查看容器的網(wǎng)絡(luò)配置,確保它們連接到了正確的網(wǎng)絡(luò)。
docker inspect -f '{{json .NetworkSettings.Networks }}' container1
docker inspect -f '{{json .NetworkSettings.Networks }}' container2
確保兩個(gè)容器連接到了同一個(gè)網(wǎng)絡(luò),例如 `bridge` 網(wǎng)絡(luò)或自定義網(wǎng)絡(luò)。
2. 檢查容器的IP地址
獲取容器的IP地址,確保它們在同一個(gè)子網(wǎng)內(nèi)。
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container1
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container2
3. 檢查網(wǎng)絡(luò)連通性
3.1 使用 `ping` 測試
從一個(gè)容器向另一個(gè)容器發(fā)送 `ping` 請求,檢查網(wǎng)絡(luò)連通性。
docker exec -it container1 ping -c 4 <container2_ip>
如果 `ping` 不通,說明網(wǎng)絡(luò)配置可能有問題。
4. 檢查防火墻規(guī)則
4.1 檢查 `iptables` 規(guī)則
查看 `iptables` 規(guī)則,確保沒有阻止容器之間的通信。
sudo iptables -L -n -v
特別是檢查 `DOCKER` 和 `DOCKER-USER` 鏈,確保沒有 `DROP` 或 `REJECT` 規(guī)則。
4.2 檢查 `firewalld` 規(guī)則
如果你使用 `firewalld`,檢查其規(guī)則。
sudo firewall-cmd --list-all
5. 檢查 Docker 網(wǎng)絡(luò)設(shè)置
5.1 檢查 Docker 網(wǎng)絡(luò)
查看 Docker 網(wǎng)絡(luò)的詳細(xì)信息,確保網(wǎng)絡(luò)配置正確。
docker network ls
docker network inspect <network_name>
5.2 檢查 `--icc` 設(shè)置
確保 Docker 守護(hù)進(jìn)程沒有禁用容器間通信(ICC)。檢查 `/etc/docker/daemon.json` 文件,確保 `icc` 設(shè)置為 `true`。
json{"icc": true}
6. 檢查容器端口映射
確保容器的端口映射正確,特別是如果你使用了 `--publish` 或 `-p` 選項(xiàng)。
docker ps -a
7. 檢查容器內(nèi)的網(wǎng)絡(luò)配置
進(jìn)入容器內(nèi)部,檢查其網(wǎng)絡(luò)配置。
docker exec -it container1 /bin/sh
ip addr show
ip route show
8. 檢查 DNS 解析
如果容器使用域名而不是IP地址進(jìn)行通信,確保 DNS 解析正常。
docker exec -it container1 nslookup <container2_hostname>
9. 檢查容器日志
查看容器的日志,尋找可能的網(wǎng)絡(luò)相關(guān)錯(cuò)誤。
docker logs container1
docker logs container2
10. 重啟 Docker 服務(wù)
如果上述步驟都沒有解決問題,嘗試重啟 Docker 服務(wù)。
sudo systemctl restart docker
11. 重新創(chuàng)建網(wǎng)絡(luò)和容器
如果問題依然存在,可以嘗試刪除現(xiàn)有的網(wǎng)絡(luò)和容器,然后重新創(chuàng)建。
docker network rm <network_name>
docker network create <network_name>
docker rm -f container1
docker rm -f container2
docker run -d --name container1 --network <network_name> my_image
docker run -d --name container2 --network <network_name> my_image
二. 容器名稱互聯(lián)
假設(shè)我們在西安的環(huán)境中部署了一個(gè)簡單的微服務(wù)應(yīng)用,包含以下幾個(gè)部分:
1. Web服務(wù)器:運(yùn)行Nginx,負(fù)責(zé)處理HTTP請求。
2. 應(yīng)用服務(wù)器:運(yùn)行Node.js應(yīng)用,處理業(yè)務(wù)邏輯。
3. 數(shù)據(jù)庫:使用MySQL,存儲(chǔ)應(yīng)用數(shù)據(jù)。
?步驟
# 1. 創(chuàng)建自定義網(wǎng)絡(luò)
首先,創(chuàng)建一個(gè)自定義的橋接網(wǎng)絡(luò),以便容器之間可以相互通信。
docker network create my_network
# 2. 創(chuàng)建數(shù)據(jù)卷
創(chuàng)建一個(gè)數(shù)據(jù)卷,用于持久化MySQL的數(shù)據(jù)。
docker volume create mysql_data
# 3. 啟動(dòng)MySQL容器
啟動(dòng)MySQL容器,并將其連接到自定義網(wǎng)絡(luò)。為容器指定一個(gè)別名,以便其他容器可以通過別名訪問它。同時(shí),掛載數(shù)據(jù)卷以實(shí)現(xiàn)數(shù)據(jù)持久化。
docker run -d --name mysql_db --network my_network --alias db \
? -v mysql_data:/var/lib/mysql \
? -e MYSQL_ROOT_PASSWORD=my-secret-pw \
? -e MYSQL_DATABASE=mydb \
? -e MYSQL_USER=myuser \
? -e MYSQL_PASSWORD=mypassword \
? mysql:5.7
# 4. 啟動(dòng)應(yīng)用服務(wù)器容器
啟動(dòng)Node.js應(yīng)用服務(wù)器容器,并將其連接到自定義網(wǎng)絡(luò)。為容器指定一個(gè)別名,以便其他容器可以通過別名訪問它。
docker run -d --name node_app --network my_network --alias app \
? -e DB_HOST=db \
? -e DB_USER=myuser \
? -e DB_PASSWORD=mypassword \
? -e DB_NAME=mydb \
? my_node_app_image
# 5. 啟動(dòng)Web服務(wù)器容器
啟動(dòng)Nginx容器,并將其連接到自定義網(wǎng)絡(luò)。為容器指定一個(gè)別名,以便其他容器可以通過別名訪問它。
docker run -d --name nginx_server --network my_network --alias web \
? -p 80:80 \
? -v /path/to/nginx/conf.d:/etc/nginx/conf.d \
? -v /path/to/static/files:/usr/share/nginx/html \
? nginx
?配置Nginx
在Nginx配置文件中,配置反向代理,將請求轉(zhuǎn)發(fā)到Node.js應(yīng)用服務(wù)器。
# Nginx配置文件 (`/path/to/nginx/conf.d/default.conf`)
nginx
server {
??? listen 80;
??? server_name localhost;
??? location / {
??????? proxy_pass http://app:3000;
??????? proxy_set_header Host $host;
??????? proxy_set_header X-Real-IP $remote_addr;
??????? proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
??????? proxy_set_header X-Forwarded-Proto $scheme;
??? }
??? location /static/ {
??????? alias /usr/share/nginx/html/;
??? }
}
?驗(yàn)證
1. 驗(yàn)證MySQL容器:
?? - 確保MySQL容器正常運(yùn)行并監(jiān)聽端口3306。
?? docker logs mysql_db
2. 驗(yàn)證Node.js應(yīng)用服務(wù)器容器:
?? - 確保Node.js應(yīng)用服務(wù)器容器正常運(yùn)行并連接到MySQL數(shù)據(jù)庫。
?? docker logs node_app
3. 驗(yàn)證Web服務(wù)器容器:
?? - 訪問Web服務(wù)器的主頁,確保Nginx能夠正確代理請求到Node.js應(yīng)用服務(wù)器。
?? curl http://localhost
?持久化存儲(chǔ)驗(yàn)證
1. 停止并刪除MySQL容器
??docker stop mysql_db
?? docker rm mysql_db
2. 重新啟動(dòng)MySQL容器
?? docker run -d --name mysql_db --network my_network --alias db \
???? -v mysql_data:/var/lib/mysql \
???? -e MYSQL_ROOT_PASSWORD=my-secret-pw \
???? -e MYSQL_DATABASE=mydb \
???? -e MYSQL_USER=myuser \
???? -e MYSQL_PASSWORD=mypassword \
???? mysql:5.7
3. 驗(yàn)證數(shù)據(jù)
?? 連接到MySQL容器,確保數(shù)據(jù)仍然存在。
?? docker exec -it mysql_db mysql -u myuser -pmypassword mydb
?備份和恢復(fù)
# 備份數(shù)據(jù)
1. 備份數(shù)據(jù)卷
?? docker run --rm --volumes-from mysql_db -v $(pwd):/backup ubuntu tar czvf /backup/mysql_backup.tar.gz /var/lib/mysql
# 恢復(fù)數(shù)據(jù)
1. 恢復(fù)數(shù)據(jù)卷
?? docker run --rm --volumes-from mysql_db -v $(pwd):/backup ubuntu ?-c "cd / && tar xzvf /backup/mysql_backup.tar.gz"
補(bǔ)充還有 通過link方式,一般生產(chǎn)都用別名方式,就略了
--link sever1:sever2?
這也是別名實(shí)現(xiàn)的另一種方式