Docker
Nginx
網管考核-2
Docker
鯨魚
Dockerfile
docker ps
docker build
docker run
docker logs
docker stop
Docker容器與虛擬機器類似,但二者在原理上不同。
容器是將作業系統層虛擬化,虛擬機器則是虛擬化硬體
因此容器更具有可攜式性、更能高效地利用伺服器。
Docker
Docker

簡單來說,Docker就是用來執行很多軟體的軟體
可以幫他想成把一個軟體裝進一個容器,這樣比較好控制和檢查等
Docker
如何製作並部署一個docker image
1. 準備要執行的程式,並放在一個資料夾中
2. 在資料夾中編寫 Dockerfile,用來執行這個Docker image
3. 用docker build建立image,docker會依照Dockerfile內的流程製作image
4. 透過 docker run 加上一些參數,讓一個docker image開始運行
Dockerfile
我們先在資料夾裡面創一個資料夾,叫做 Dockerfile (恩對他沒有副檔名)

Dockerfile
我們來看一個 Dockerfile 的範例
#引入Python的Base image
FROM python:3.11.12-alpine3.21
#指定目前目錄(沒有的話會自動新增)
WORKDIR /app
#將.(Dockerfile所在的目錄)新增至映像中的/app資料夾
ADD . /app
#運行命令
RUN pip install --upgrade pip && \
pip install -r requirements.txt
#將port 5000公開 使外部連線可以進入這個image
EXPOSE 5000
#當建置好的image被啟動時要執行的命令
CMD ["python", "main.py"]requirements.txt 蠻重要的
requirements.txt
簡單來說,就是一個告訴你 跑這個程式有什麼需要載的東西
pip freeze > requirements.txt //生成pip install -r requirements.txt //使用在terminal:
Dockerfile
這裡還有一些 Dockerfile 的語法
可以參考看看:
https://philipzheng.gitbook.io/docker_practice/dockerfile/instructions
Docker
假設我們目前這裡有一個 main.py 檔案
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ ls
main.py
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ cat main.py
import time
curtime = 0
while True:
print(curtime, flush=True)
time.sleep(1)
curtime += 1
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ Docker
我們創立一個新的Dockerfile
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ nano Dockerfile
> 輸入Dockerfile 內容
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ ls
Dockerfile main.pyFROM python:3.11.6-alpine3.18
WORKDIR /app
ADD . /app
CMD ["python", "main.py"]Docker build
我們先build這個Dockerfile
docker build -t image的名稱 Dockerfile所在的目錄舉例來說,我們試著build我們剛剛的Dockerfile
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ sudo docker build -t docker_test .他Dockerfile在這個目錄,並且我們將這個image命名為 "docker_test"
Docker build
一些docker build的參數
| 參數: | 要填入的東西: | 做什麼的: |
|---|---|---|
| -d | 在背景運行 | |
| -p | 電腦port:image port | 讓電腦的port跟container EXPOSE 的port連結 |
| -it | 讓container接收使用者輸入 | |
| -e | 變數名稱=值 | 新增環境變數 |
Docker run
我們build完之後就可以run了
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ sudo docker run docker_test
0
1
2
3
^CTraceback (most recent call last):
File "/app/main.py", line 6, in <module>
time.sleep(1)
KeyboardInterrupt
Docker run
加上 -d 讓他可以背景運行
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ sudo docker run -d docker_test
5ffba8c6aae06ff32c5626d27af21c3643567ea3b78e76e50fb20f827a5a734eDocker ps/log
可以用 docker ps 來看有哪些 docker images
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ffba8c6aae0 docker_test "python main.py" 5 seconds ago Up 4 seconds awesome_wu可以用 docker logs 來看它輸出什麼內容
(打 id 的前面幾個自就好了)
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ sudo docker logs 5ff
0
1
2
3
4Docker stop
可以用 docker stop 來把他停掉
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ sudo docker stop 5ff
5ff
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ ^C
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESNginx
n-jin-x
nginx
nginx -s reload
systemctl
Nginx
nginx(發音同「engine X」)
是非同步框架的網頁伺服器,
也可以用作反向代理、負載平衡器和HTTP快取
Nginx

使用者請求
有裝nginx的伺服器
根據使用者的請求
來對正確的port發出請求
port 1
(網站 1)
port 2
(網站 2)
...
(很多port)
Nginx

我要看mrt.ckcsc.net
有裝nginx的伺服器
ok mrt.ckcsc.net
幫我送到 localhost:8080
localhost:8080
我們用Nginx的方法主要試底下的流程:
localhost:5000
localhost:25565
Nginx
我們要做的事:
1. 先跑好你的程式碼,並且記得你開在哪個 localhost的port
2. 寫nginx 的 .conf 檔案
3. 將 .conf 檔案丟到正確的位置
Nginx
.conf 的檔案都放在 /etc/nginx/sites-enabled那裡
mlgnotcool@ckcsc-server1:/$ cd /etc/nginx/sites-enabled
mlgnotcool@ckcsc-server1:/etc/nginx/sites-enabled$ pwd
/etc/nginx/sites-enabledNginx
.conf 檔:
server{
server_name mrt.ckcsc.net;
location / {
proxy_pass http://localhost:4011;
proxy_set_header Origin "";
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 $http_x_forwarded_proto;
proxy_max_temp_file_size 0;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/mrt.ckcsc.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mrt.ckcsc.net/privkey.pem;
# managed by Certbot
}
server{
if ($host = mrt.ckcsc.net) {
return 301 https://$host$request_uri;
} # managed by Certbot
}mrt.conf
Nginx
server{
server_name mrt.ckcsc.net; #檢查 URL
location / { # 當請求的HOST 符合檢查 URL
proxy_pass http://localhost:4011; # 把請求導向 localhost:4011
# 一些參數
proxy_set_header Origin "";
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 $http_x_forwarded_proto;
proxy_max_temp_file_size 0;
}
#讓這個設定檔監聽443的Port
#設定https用的ssl憑證
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/mrt.ckcsc.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mrt.ckcsc.net/privkey.pem;
# managed by Certbot
}
# 確保請求是https
server{
if ($host = mrt.ckcsc.net) {
return 301 https://$host$request_uri;
} # managed by Certbot
}Nginx
其實這要有這些就能運作了:
server{
server_name 你的URL;
location / {
proxy_pass 你在localhost跑的port;
proxy_set_header Origin "";
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 $http_x_forwarded_proto;
proxy_max_temp_file_size 0;
}
listen 80;
}Nginx
可以透過這個指令將nginx啟動: (通常是開的 所以不要動他)
mlgnotcool@ckcsc-server1:/etc/nginx/sites-enabled$ sudo nginx可以透過systemctl status確認他的狀態:
mlgnotcool@ckcsc-server1:/etc/nginx/sites-enabled$ sudo systemctl status nginxNginx
最後要重啟nginx
mlgnotcool@ckcsc-server1:/etc/nginx/sites-enabled$ sudo nginx -s reload小提示
- 我們Docker run開的電腦port,nginx 導向localhost 的 port,和flask run的port都是同一個
- 有一個東西叫 fileZilla 可以用 sftp 來上傳檔案到伺服器
Docker Nginx 部署
By MLGnotCOOL
Docker Nginx 部署
- 9