這一篇筆記介紹一下如何使用 Docker 運行 Django 系統(tǒng)贵扰。
流程大概是這樣熊昌,拉取一個 python 鏡像,然后將我們的 Django 系統(tǒng)放到該鏡像中構建一個新的鏡像,運行新鏡像產生的容器就有我們的 Django 服務了谷誓。
以下是本篇筆記目錄:
- 鏡像和系統(tǒng)準備
- Dockerfile 準備
- 構建鏡像
- 運行容器
- 其他Dockerfile命令
1、鏡像和系統(tǒng)準備
鏡像拉取
首先我們需要準備一個 Python 3.6 的鏡像髓废,用于后面構建我們的 Django 鏡像冬骚。
通過下面的命令拉取:
docker pull python:3.6
然后通過 docker images
可以看到在 REPOSITORY 下名一個 python别瞭, TAG 為 3.6 鏡像
Django 系統(tǒng)準備
根據隔壁 Django 筆記窿祥,我們可以創(chuàng)建一個新系統(tǒng),也可以用自己的項目系統(tǒng)蝙寨,這里我們命名為 hunter晒衩,放在 ~/ 目錄下,這個目錄地址可以自定義
python 依賴準備
然后準備一個 requirements.txt籽慢,這包含了我們運行系統(tǒng)所需要的全部依賴浸遗,可以在我們創(chuàng)建的 Django 系統(tǒng)下通過 pip freeze 命令獲得:
pip3 freeze > requirements.txt
requirements.txt 這個文件我們也放在 ~/ 目錄下
2、Dockerfile 準備
然后我們需要新建一個 Dockerfile 文件箱亿,這個文件的作用是依據我們寫好的命令跛锌,在一個基礎鏡像上將我們需要運行的 Django 系統(tǒng)或者其他系統(tǒng)傳到鏡像里成為一個新的鏡像
我們創(chuàng)建的 Dockerfile 也放在 ~/ 目錄下
FROM python:3.6
RUN mkdir /hunter -p
WORKDIR /hunter
ADD ./requirements.txt /hunter
RUN cd /hunter
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
ADD ./hunter /hunter
CMD ["python3", "manage.py", "runserver", "0:9898"]
- FROM 構建新的鏡像的基礎鏡像,即使用哪個指定的鏡像作為基礎來構建新的鏡像
- ADD 復制指令,類似于 COPY 指令髓帽,在這里菠赚,使用 COPY 指令也可以,不同點在于對壓縮文件的處理
- RUN 執(zhí)行指令郑藏,在構建新鏡像的時候運行
- CMD 也是執(zhí)行指令衡查,不過是在容器運行的時候執(zhí)行,相當于是容器啟動時的默認指令
- WORKDIR 指定工作的目錄必盖,在容器運行起來后拌牲,使用命令進入容器,默認進入的也是 WORKDIR 的目錄
所以我們上面的 Dockerfile 的內容是:
- FROM 命令:在 python:3.6 的基礎鏡像上操作
- RUN 命令:在鏡像內創(chuàng)建 /hunter 文件夾
- WORKDIR 命令:指定鏡像內工作目錄為 /hunter
- ADD 命令:將宿主機的 requirements.txt 文件復制到鏡像內 /hunter 目錄下
- RUN 命令:在鏡像內進入 /hunter 文件夾下
- RUN 命令:在鏡像內根據 /hunter 文件夾下的 requirements.txt 文件安裝 python 依賴
- ADD 命令:將宿主機的 Django 系統(tǒng)文件整個復制到鏡像內的 /hunter 文件夾下
- CMD 命令:指定容器啟動時運行的命令
以上命令在我們構建鏡像的時候會依次執(zhí)行歌粥。
注意: CMD 指定的程序會被 docker run 的時候后面添加的程序指令覆蓋
與 CMD 還有個作用類似的命令塌忽,ENTRYPOINT,這個用法后面再介紹
就此失驶,我們構建新鏡像的步驟和命令就此指定了土居。
3、構建鏡像
接下來的操作就是根據 Dockerfile 構建一個新鏡像
進入 ~/ 文件夾下嬉探,有以下幾個文件及文件夾:
hunter/
requirements.txt
Dockerfile
基本的命令如下:
docker build . -t tag -f Dockerfile
-t 參數表示構建新鏡像時手動打的一個 tag
-f 表示指定的 Dockerfile 文件擦耀,如果不使用 -f 參數,會默認尋找當前文件夾的 Dockerfile
接下來我們打一個 tag 為 Django:1.0.0 的鏡像涩堤,使用前面我們創(chuàng)建的 Dockerfile
docker build . -t django:1.0.0 -f Dockerfile
在這里 -f 參數可以不添加眷蜓,因為會默認使用當前文件夾的 Dockerfile 文件
可以看到下面這種類似的輸出內容:
Step 7/8 : ADD ./hunter /hunter
---> 84a62ad79b51
Step 8/8 : CMD ["python3", "manage.py", "runserver", "0:9898"]
---> Running in 33bcc53af8cf
Removing intermediate container 33bcc53af8cf
---> 926fce7b8cea
Successfully built 926fce7b8cea
Successfully tagged django:1.0.0
然后使用 docker images
命令可以看到有一個 django:1.0.0 的鏡像了。
4定躏、運行容器
接下來我們可以根據 image id 或者 django:1.0.0 這個 tag 來運行容器:
docker run -p 9898:9898 django:1.0.0
然后當前界面會顯示 Watching for file changes with StatReloader 這種信息
然后訪問我們的系統(tǒng) localhost:9898 類似這種账磺,在當前界面就會輸出相應的訪問信息
而如果我們想要停止運行這個容器,可以在新開一個shell痊远,通過 docker ps 找到正在運行的容器垮抗,然后 docker stop xxxx停止或者直接在當前界面 ctrl + c
在后臺運行這個容器可以如下操作:
docker run -itd -p 9898:9898 django:1.0.0
在這里我們使用 -p 參數將容器的 9898 端口映射到宿主機的 9898 端口
注意: 為了以示區(qū)分,假設端口映射為 -p 5678:9898碧聪,前面的 5678 是宿主機的端口冒版,后面的 9898 是容器內的端口
在容器運行起來之后,如果想進入該容器逞姿,可以 通過 docker ps 找到這個運行的容器辞嗡,然后 使用下面的命令進入容器內查看
5、其他Dockerfile命令
除了在前面介紹的 Dockerfile 命令滞造,還有掛載的命令 VOLUME续室,端口聲明的命令 EXPOSE,環(huán)境變量設置的命令 ENV谒养,還有與 CMD 相似的指令執(zhí)行的命令 ENTRYPOINT 等
EXPOSE
可用于聲明這個鏡像使用的端口挺狰,在運行的時候可以使用 -p 參數映射這個端口,但似乎并無太多實際意義,可以用于在 Dockerfile 中聲明丰泊,后期便于查看
VOLUME
掛載的命令薯定,我們可以在后面的運行 MySQL 鏡像的時候介紹
ENV
命令為環(huán)境變量,可以在構建鏡像的時候就指定變量瞳购,也可以在 運行容器的時候指定命令话侄,可以直接在 Dockerfile 中如此聲明:
ENV key value
ENTRYPOINT
與 CMD 類似的作用,但 ENTRYPOINT 不會被容器啟動時的指定的指令覆蓋学赛,而 CMD 命令會被覆蓋
比如:
docker run -itd image_id bash
這里就指定了新的 CMD 命令為 bash年堆,那么原來的 CMD 命令就被覆蓋,不會執(zhí)行了
如果想要覆蓋 Dockerfile 中的 ENTRYPOINT 命令罢屈,僅在容器 run 的時候嘀韧,使用 --entrypoint 的參數,則會覆蓋 ENTRYPOINT 指定的程序
在 Dockerfile 中缠捌,如果存在多個 ENTRYPOINT 命令,僅最后一個生效译蒂,比如:
# Dockerfile
ENTRYPOINT ["python3", "manage.py", "runserver", "0:7979"]
ENTRYPOINT ["python3", "manage.py", "runserver", "0:9898"]
則系統(tǒng)會運行 最后一條曼月,使用 9898 的端口
ENTRYPOINT 和 CMD 搭配使用
因為 entrypoint 不會被覆蓋,所以可以放入不會變的命令
而 CMD 會被后面的參數覆蓋柔昼,所以可以放入會被更改的數據哑芹,比如端口,或者其他會變的配置文件位置
以 Django 系統(tǒng)為例捕透,我們可以將 python3 manage.py 這兩個命令給 entrypoint聪姿,將端口的設置給 CMD,因為端口我們是可以更改的乙嘀。
示例如下:
ENTRYPOINT ["python3", "manage.py", "runserver"]
CMD ["0:9898"]
然后我們重新構建鏡像末购,獲得新的 image_id,然后運行容器虎谢,加上 CMD 命令更換端口為 9999:
docker run -itd -p 9898:9999 image_id 0:9999
通過上面的命令將系統(tǒng)運行起來后盟榴,還是可以訪問宿主機的 localhost:9898,但是容器內部使用的端口已經變成了 9999
我們可以進入容器內部婴噩,查看運行的進程擎场,可以看到在容器內已經是 使用的 9999 端口在運行
docker exec -it container_id bash
ps aux