docker_django_mysql

2020-08-09 11:42:46

參考 使用Docker部署Django服務
參考 Docker run 命令參數及使用

install docker + docker-compose

sudo apt install docker-ce -y
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 
sudo chmod +x /usr/local/bin/docker-compose
docker -v
docker-compose -v
docker version
docker-compose version

Docker run 命令參數

# 說明下參數意義
-i 開啓STDIN,用於控制檯互動
-t 分配一個僞終端 - 分配tty裝置,該可以支援終端登錄,預設爲false
-d 分離模式: 在後台執行 - 指定容器執行於前臺還是後臺,預設爲false
-p 對映埠:docker內部埠: 埠對映,只有將容器埠對映到外部,外部才能 纔能存取
-e 環境變數,指定一些服務內讀取的變數,以初始化服務,這裏的變數意義從字面上不難理解
--network 指定容器所在網路,需要互相存取的容器記得指定到同一個網路!
--name 容器名,這個名字在同一個容器網路裡是可以直接當成域名存取的!

docker exec -it $(docker ps -a|awk '{print $1}') /bin/bash # 實際不能進入,要用 容器id 替換掉 $(docker ps -a|awk '{print $1}')

Docker 命令大全 - www.runoob.com

docker images # 檢視已經存在的映象
docker ps -a  # 檢視全部狀態的容器 # https://www.runoob.com/docker/docker-ps-command.html
docker ps -a|awk '{print $1}' # 只顯示映象id
# 下面 下麪兩個同樣的效果
docker rm $(docker ps -a -q)                # 刪除所有已經停止的容器
docker rm $(docker ps -aq|awk '{print $1}') # 刪除所有已經停止的容器

建立專屬網路

docker network ls # 檢視專屬網路
docker network create django_net   # 建立專屬網路
docker network inspect django_net  # 檢視網路內部資訊

docker install images

docker search mysql  # 檢視可用版本
docker images        # 檢視已經存在的映象 - 檢查是否安裝完成

# 拉取 容器
docker pull mysql:8.0.18
docker pull python:3.8

docker 執行容器

參考 Docker 安裝 MySQL

 # 執行容器
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.18 # ref runoob

docker run -d -p 3337:3306 --network django_net --name django_mysql -v $PWD/db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_USER=admin -e MYSQL_PASSWORD=123456  mysql:8.0.18

-e, --env=[]               指定環境變數,容器中可以使用該環境變數
-d, --detach=false         指定容器執行於前臺還是後臺,預設爲false
-p, --publish=[]           指定容器暴露的埠 
-v, --volume=[]            給容器掛載儲存卷,掛載到容器的某個目錄
--name=""                  指定容器名字,後續可以通過名字進行容器管理,links特性需要使用名字 

# 檢視專屬網路的容器對應的IP地址
docker network inspect django_net|grep IPv4Address
docker inspect --format '{{ .NetworkSettings.IPAddress }}' 容器id

# 驗證 容器內 mysql 是否執行正常
# 1. 進入 容器內部測試
docker exec -it 41708994233e /bin/bash # 實際不能進入,要用 容器id 替換掉 $(docker ps -a|awk '{print $1}')

# 2. 遠程登錄測試
mysql -h172.18.0.2 -uroot -p123456  -e 'show databases;' # 遠程登錄測試容器是否執行正常,遠端是3306埠


mysql -uroot -P3307 -p123456  -e 'show databases;' # 爲什麼進不去呢。。。。

檢視埠

Linux 檢視埠佔用情況可以使用 lsof 和 netstat 命令 # https://www.runoob.com/w3cnote/linux-check-port-usage.html

lsof -i:埠號
netstat -tunlp |grep grep 埠號
-t (tcp) 僅顯示tcp相關選項
-u (udp)僅顯示udp相關選項
-n 拒絕顯示別名,能顯示數位的全部轉化爲數位
-l 僅列出在Listen(監聽)的服務狀態
-p 顯示建立相關鏈接的程式名

使用Dockerfile 部署Django應用

# Dockerfile
# use base python image with python 3.8
FROM python:3.8
RUN echo "這是一個py3.8環境,使用Dockerfile構建一個Django3.8的環境"

# install mysql-client
RUN apt-get update
RUN apt-get install -y mysql-client
 
# 映象作者
MAINTAINER spider [email protected]
 
# 設定 python 環境變數
ENV PYTHONUNBUFFERED 1
# env
ENV RUN_MODE=DEPLOY
 
# 建立 my_blog 資料夾
RUN mkdir /my_blog
 
# 將 my_blog 資料夾爲工作目錄
WORKDIR /my_blog
 
# 將當前目錄加入到工作目錄中(. 表示當前目錄)
ADD . /my_blog

# 利用 pip 安裝依賴 (-i 表示指定清華源,預設源下載過慢)  # include django
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

#設定環境變數
ENV SPIDER=/my_blog

# RUN server after docker is up
CMD ./start.sh

編寫 start.sh 命令指令碼 - https://www.cangmangai.cn/archives/docker-django-deployment

# start.sh

#!/bin/sh
# 從第一行到最後一行分別表示:
# 1. 守護行程執行 celery,沒有這個需求的小夥伴可以將第一行命令其刪除
# 1. 收集靜態檔案到根目錄,
# 2. 生成數據庫可執行檔案,
# 3. 根據數據庫可執行檔案來修改數據庫
# 4. 啓動 django 服務
python manage.py collectstatic --noinput &&
python manage.py makemigrations &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000 &&

在Dockerfile所在目錄進行構建

docker build . -t django_web

啓動django服務

docker run -d --network django_web --name django_web -p 6060:8000 django_web