Dockerfile
docker ps
docker build
docker run
docker logs
docker stop
簡單來說,Docker就是用來執行很多軟體的軟體
可以幫他想成把一個軟體裝進一個容器,這樣比較好控制和檢查等
1. 準備要執行的程式,並放在一個資料夾中
2. 在資料夾中編寫 Dockerfile,用來執行這個Docker image
3. 用docker build建立image,docker會依照Dockerfile內的流程製作image
4. 透過 docker run 加上一些參數,讓一個docker image開始運行
我們先在資料夾裡面創一個資料夾,叫做 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"]pip freeze > requirements.txt //生成pip install -r requirements.txt //使用在terminal:
假設我們目前這裡有一個 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$ 我們創立一個新的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"]我們先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"
| 參數: | 要填入的東西: | 做什麼的: |
|---|---|---|
| -d | 在背景運行 | |
| -p | 電腦port:image port | 讓電腦的port跟container EXPOSE 的port連結 |
| -it | 讓container接收使用者輸入 | |
| -e | 變數名稱=值 | 新增環境變數 |
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
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ sudo docker run -d docker_test
5ffba8c6aae06ff32c5626d27af21c3643567ea3b78e76e50fb20f827a5a734emlgnotcool@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(打 id 的前面幾個自就好了)
mlgnotcool@mlgnotcool-mint:~/Documents/docker_test$ sudo docker logs 5ff
0
1
2
3
4mlgnotcool@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
nginx -s reload
systemctl
根據使用者的請求
來對正確的port發出請求
port 1
(網站 1)
port 2
(網站 2)
...
(很多port)
ok mrt.ckcsc.net
幫我送到 localhost:8080
localhost:8080
我們用Nginx的方法主要試底下的流程:
localhost:5000
localhost:25565
.conf 的檔案都放在 /etc/nginx/sites-enabled那裡
mlgnotcool@ckcsc-server1:/$ cd /etc/nginx/sites-enabled
mlgnotcool@ckcsc-server1:/etc/nginx/sites-enabled$ pwd
/etc/nginx/sites-enabledserver{
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
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
}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啟動: (通常是開的 所以不要動他)
mlgnotcool@ckcsc-server1:/etc/nginx/sites-enabled$ sudo nginx可以透過systemctl status確認他的狀態:
mlgnotcool@ckcsc-server1:/etc/nginx/sites-enabled$ sudo systemctl status nginxmlgnotcool@ckcsc-server1:/etc/nginx/sites-enabled$ sudo nginx -s reload- 我們Docker run開的電腦port,nginx 導向localhost 的 port,和flask run的port都是同一個
- 有一個東西叫 fileZilla 可以用 sftp 來上傳檔案到伺服器