1. 程式人生 > 實用技巧 >技術部落格 - Docker 部署和執行Web服務

技術部落格 - Docker 部署和執行Web服務

作業要求檢視作業要求 20201029-3 事後諸葛亮會議 及 交換1人

Docker 部署和執行Web服務

Docker 是一個開源的應用容器引擎,Docker讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出任何機器上(區分Linux和Windows系統)。Docker技術極大的簡化了運維部署服務的難度,也加快了服務上線的速度和提高了成功率。

安裝Docker

Docker容器在各個系統的安裝文件可以在Install Docker Engine找到。本組採用了Ubuntu 20.04 LTS,以下以Ubuntu 20.04 LTS為例。

在Ubuntu 20.04 LTS中安裝Docker,在Bash中執行如下指令即可,指令上方的註釋說明了該指令的用途。由於Docker官方安裝源速度較慢,以下指令採用阿里雲提供的映象。

# 移除老版本的Docker相關元件
sudo apt-get remove docker docker-engine docker.io containerd runc

# 更新APT倉庫
sudo apt-get update

# 安裝可能需要的工具軟體
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# 安裝Docker阿里雲源的金鑰
curl-fsSLhttp://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg|sudoapt-keyadd-

# 新增Docker阿里雲源
sudoadd-apt-repository"deb[arch=amd64]http://mirrors.aliyun.com/docker-ce/linux/ubuntu$(lsb_release-cs)stable"

# 更新APT倉庫
sudoapt-get-yupdate

# 安裝Docker
sudoapt-get-yinstalldocker-ce

# 安裝Docker-Compose
sudo apt-get -y install docker-compose

#新增docker使用者組
sudogroupadddocker

#添加當前使用者到docker使用者組
sudogpasswd-a$USERdocker

# 重啟Docker服務
sudo service docker restart

#執行一個hello-world測試是否安裝成功
dockerrunhello-world

編寫Dockerfile

編寫Dockerfile的最佳實踐請檢視Best practices for writing Dockerfiles

Dockerfile檔案用以要求Docker容器引擎構建使用者自己的容器。本組在Python映象的基礎上進一步構建了我們需要的Django容器。構建程式碼如下。

FROM python:3.8
ENV PYTHONUNBUFFERED=1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY ./manage.py /code/manage.py
COPY ./src /code/src

編寫docker-comspoe

編寫docker-compsoe.yml用以編排多個容器。如本組最終使用了三個容器,包括資料庫容器,我們自主構建的Web服務容器,和Nginx容器。Docker-Compose使得多種服務的安裝、啟動和維護更為便捷。

更多Docker-Compose資訊,請查閱文件Get started with Docker Compose

本組的docker-compose.yml檔案編寫如下。

version: "3"

networks:
    default:
        driver: bridge
        driver_opts:
            com.docker.network.driver.mtu: 1492

services:
    mariadb:
        image: mariadb
        environment:
            MYSQL_ROOT_PASSWORD: 1214
            MYSQL_DATABASE: soul
        volumes:
            - ./mariadb:/var/lib/mysql
        ports:
            - "3306:3306"
    django:
        build: .
        command: bash -c "python3 manage.py makemigrations scale setting story user wechat && python3 manage.py migrate && python3 manage.py runserver 0.0.0.0:8000"
        volumes:
            - ./src:/code/src
            - ./manage.py:/code/manage.py
            - ./static:/var/static
        ports:
            - "8000:8000"
        depends_on:
            - mariadb
        restart: always

    nginx:
        image: nginx
        volumes:
            - ./nginx:/etc/nginx
            - ./static:/var/static
        depends_on: 
            - django
        ports: 
            - "8080:80"

使用Docker-Compose啟動服務

docker-compose up