- 一、概述
- 二、安装docker桌面管理器
- 三、常用命令
- 3.1 docker命令
- 3.2 镜像命令
- 3.3 容器命令
- 四、DockerFile编写
- 4.1 前置
- 4.2 构建自定义镜像
- 五、容器集群管理
- 5.1 docker-compose概述
- 5.2 部署
- 5.2.1 后端django项目详解
- 5.2.2 前端及nginx配置
- 5.2.3 postgresql配置
- 5.3 docker-compose.yml文件详解
- 5.3.1 文件内容
- 5.4 命令
- 简介:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows *** 作系统的机器上,简而言之,docker可以实现以应用为核心的最精简虚拟机。
- 名词解释
- 守护进程:Docker Daemon
- 镜像:重点,Docker Image,类似于面向对象中的类
- 容器:重点,DockerContainer,类似于面向对象中的类实例(对象)
-
centos安装:
# 安装docker yum install docker -y # 启动|关闭|重启docker服务 systemctl start|stop|restart docker # 开机启动docker systemctl enable docker # 查看docker当前状态 systemctl status docker # 测试docker是否正确安装及功能完备 docker run hello-world
-
mac安装、win10desktop安装:传送门
-
docker镜像仓库:传送门,创建账号和镜像版本标签(tag)处
-
界面
阿里云docker镜像加速网址获取参照点此处
- 命令
# 获取docker版本 docker version # 详细信息,包括容器信息 docker info # 测试docker是否正确安装及功能完备 docker run hello-world
- 命令
# 现实镜像列表 docker images # 拉取nginx镜像:pull 镜像名:版本号, # 省略版本号即为latest,镜像都自带系统 docker pull nginx:1.20 # 删除镜像 # docker rmi nginx:1.20
- 镜像版本tag查询
- 创建及查询容器
# 创建并启动容器: # -d: 后台运行 # -i:容器开启交互接口,若容器内无循环逻辑,则立即exit # --name: 容器别名 # -p: 映射端口,宿主端口:容器虚拟机端口,多映射写法-p x:x -p x:x # 构建容器的最底层镜像:镜像:版本号,若本机没有,docker自动pull docker run -id --name nginx_test -p 8080:80 nginx:1.20 # docker容器运行必须有一个前台进程, 如果没有前台进程执行,容器 # 认为空闲,就会自行退出,-i(容器开启交互接口) docker run -id --name python3 python:3.8 # 显示已启动的容器详情列表,-a可以显示包括关闭的容器 # 各列说明见下表 docker ps [-a]
- docker ps结果
表头 数据 释义 CONTAINER ID aa67260f166d 自动分配容器序号 IMAGE nginx:1.20 镜像 COMMAND “/docker-entrypoint.…” 容器启动后立即执行的命令、脚本 CREATED 4 minutes ago 容器创建时间 STATUS Up 4 minutes 容器状态:created(已创建)restarting(重启中)running(运行中)removing(迁移中)paused(暂停)exited(停止)dead(死亡) PORTS 0.0.0.0:8080->80/tcp 容器端口映射,宿主端口=>容器端口/协议 NAMES nginx_test 容器别名 - 容器运维 *** 作
# 容器名:可以用别名,也可以用序号,位数能区分容器即可 # 重启容器:取序号前两位,位数能区分容器即可 docker restart aa # 关闭容器:取容器别名 docker stop nginx_test # 开启容器:取容器前一位 docker start a # 进入容器内: # exec:退出容器,不关闭容器 # -i(容器开启交互接口),-t(创建伪终端) # aa6: 容器序号前三位 # /bin/bash:进入容器后启动的shell docker exec -it aa6 bash # 退出伪终端命令为:exit # 删除容器,配合docker ps -a使用 # docker rm aa
范例:封装uwsgi和Django项目到一个镜像里
4.1 前置- 文件结构
- uwsgi.ini
[uwsgi] # 版本为2.0.20,以下为必要设置,其他采用默认 # 启动一个主程序管理其他进程 master=true # 进程数:2倍cpu核心数,跟worker processes = 2 # 每个进程中开启线程数 threads=2 # 通信接口:直接作为web服务器使用,注意IP # 也可写为0:2048,表示对访问的IP无限制 # socket接口:跟nginx配合使用,监听本机2048端口 # socket=0.0.0.0:2048 http=0.0.0.0:2048 # 项目启动后的根目录 chdir=/home/www/backend # uwsgi服务器进入Django项目的入口 # 绝对路径:/home/www/backend/main/wsgi.py module = main.wsgi:application # pid文件,通过其可以控制uwsgi服务器的停止和重启 pidfile=uwsgi.pid # 日志存放位置,根目录下,用daemonize设置有问题 logto=uwsgi.log # 服务器退出时自动删除socket和pid文件 vacuum=true # 日志最大大小 log-maxsize=50000 # 每个进程最多请求数,达到立即回收重用此进程 max-requests=1000 # 前后端传输数据大小:单位kb,要是文件上传下载需要注意此处 buffer-size = 65536
- Dockerfile
FROM python:3.8 MAINTAINER chuck<******@qq.com> WORKDIR /home/www/backend ADD . /home/www/backend RUN pip install -r requirements.txt \ -i http://pypi.douban.com/simple \ --trusted-host pypi.douban.com \ &&pip install uwsgi \ -i http://pypi.douban.com/simple \ --trusted-host pypi.douban.com ENTRYPOINT /usr/local/bin/uwsgi --ini /home/www/backend/uwsgi.ini
- 注释
Dockerfile中不可有注释 FROM:后接构建自定义镜像的模板镜像 MAINTAINER:维护者 WORKDIR:指定后续语句的工作目录,相当于cd命令,docker exec进入的也是此文件夹 ADD:拷贝宿主机文件到镜像,宿主机若为路径如:/home/www,则仅拷贝其中文件到 镜像文件夹内,优势是源文件是压缩文件,此命令会先解压再拷贝进镜像 RUN:构建镜像,在镜像内运行的命令,每个RUN在镜像中生成一层,效率与层数成反比, 用此种写法,仅生成一层,多个命令写法 ENTRYPOINT:使用此镜像,docker run命令生成容器,容器启动后第一个执行的语句
- 命令
cd 父目录/project # -t后面接的是 镜像名:版本号,别落了最后的点儿 # 点号:是指镜像构建时打包上传到Docker引擎中的文件的目录 docker build -t django:v1.0 . # 查看镜像创建情况 docker images # 创建自定义镜像的容器:请求在端口流转,宿主2000=>docker中uwsgi的2048端口=> # 通过uwsgi配置文件传给main/wsgi.py,进而进入Django项目 docker run -id --name django_v1.0 -p 2000:2048 django:v1.0 # 可进入运行中的容器,退出的容器可以`docker log 容器序号`查看原因 docker exec -it django_v1.0 bash
- 功能:用于管理多容器协同,包括存储、网络、启动调度等
- 文件布局
- settings.py
""" ... # 开启生产环境 DEBUG = False ... # 开启访问白名单 ALLOWED_HOSTS = ['*'] ... # 此处设置postgresql参数 DATABASES = { 'default': { # 此模块要pip install psycopg2-binary 'ENGINE': 'django.db.backends.postgresql_psycopg2', # 以下在docker-compose.yml中设置 'NAME': 'postgres', 'USER': 'postgres', 'PASSWORD': 'postgres', # 在yml文件中,db为数据库所在虚拟机的IP 'HOST': 'db', 'PORT': '5432', } } ... # 此处是关闭跨域访问限制 CORS_ALLOW_ALL_ORIGINS = True ...
- requirements.txt
pip install psycopg2-binary pip freeze > requirements.txt
- uwsgi.ini
[uwsgi] master=true processes = 2 threads=2 # 此处用socket,nginx会使用uwsgi_params模块 # 进入uwsgi服务器 socket=0.0.0.0:2048 chdir=/home/www/backend # uwsgi服务器从此处进入Django项目 module = main.wsgi:application pidfile=uwsgi.pid logto=uwsgi.log vacuum=true log-maxsize=50000 max-requests=1000 buffer-size = 65536
- Dockerfile
FROM python:3.8 MAINTAINER chuck<******@qq.com> WORKDIR /home/www/backend ADD . /home/www/backend RUN pip install -r requirements.txt \ -i http://pypi.douban.com/simple \ --trusted-host pypi.douban.com \ &&pip install uwsgi \ -i http://pypi.douban.com/simple \ --trusted-host pypi.douban.com ENTRYPOINT /usr/local/bin/uwsgi --ini /home/www/backend/uwsgi.ini
- 虚拟机中/etc/nginx/conf.d/nginx.conf
server { listen 80; server_name 192.168.3.5; location / { include uwsgi_params; uwsgi_pass django:2048; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
include: nginx自带uwsgi模块,django为前端服务器的IP,yml中指定
- Dockerfile
FROM nginx:1.20 MAINTAINER chuck<******@qq.com> ADD ./nginx.conf /etc/nginx/conf.d/nginx.conf
功能:只是将文件加入服务器中,其他采用镜像默认配置
- 新建空的目录:www/postgres,用于后续挂载数据库中数据文件夹的位置
- 位置:后续docker-compose命令必须在此文件同级目录执行
- docker-compose.yml文件内容
# yml格式版本:跟docker engine版本相对应 version: '3' # 服务:每一个对应一个容器 services: # 服务名:随便起,也为容器IP地址别名,即nginx对应172.3.2.1这样 nginx: # 此容器镜像通过./frontend/Dockerfile创建 build: ./frontend # 启动的容器名:对应docker run --name 这项 container_name: nginx_OA # 若关闭,自动重启,前提是docker守护进程在运行,即docker开着 restart: always # 端口暴露:对应docker run -p 这项 ports: - 80:80 - 443:443 # 给另一个服务的容器的IP设置别名,此处django对应 # 容器django_OA的IP,单一网络中直接用服务名即可 # 此项较少用, links: - "backend:django" # 设置容器启动依赖关系:此项仅限制各服务的启动次序, # 不代表backend启动完成再启动nginx,若要完成后再启动 # 官网有wait-for的command的相关设置 depends_on: - backend backend: build: ./backend container_name: django_OA restart: always # 此处只写一个,即指定宿主机任意端口绑定此容器的2048端口, # 实质是仅将此端口暴露给内部容器使用,不给宿主机用 ports: - 2048 depends_on: - db db: # 此处仅制定镜像,即docker拉取镜像创建,不用docker build image: postgres:12.10 container_name: postgres_OA restart: always ports: - 5432:5432 # 设定环境变量:数据库名、用户名、密码、时区,给Django的 # setting进行对应设置 environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - TZ=Asia/Shanghai # 挂载卷: # 1、功能:将postgresql的数据卷挂载到宿主机对应目录下 # 2、docker命令:对应`docker run -v 宿主机目录:容器内目录` # 3、特性:默认宿主机目录(不管是否为空)覆盖(而非删除)容器目录;数据库镜像此 # 设置特殊,经测试宿主机为空目录,会被容器目录反向拷贝填满,但若宿主机目录非空,则 # 宿主机目录覆盖容器目录 # 4、数据持久性:两目录数据同步,停止甚至销毁容器,宿主目录不变,可多容器绑定 # 同一宿主目录 volumes: - ./www/postgres:/var/lib/postgresql/data
- 命令
# 以下命令均需要在yml文件所在目录中运行 # 侦测yml文件中build项,镜像有更新需要主动运行此命令 docker-compose build # 首次运行会调用docker build和docker run针对每个容器 # -d:可选项,为后台运行,建议先不带看运行详情,没问题再-d docker-compose up [-d] # 停止并删除yml管理的容器,包含挂载的卷volume,不删镜像 docker-compose down # 启动、停止、重启服务容器集群 docker-compose start|stop|restart
- django数据库迁移
# 容器集群启动起来后需要做Django项目数据库迁移 docker exec -it django_OA bash > python manage.py makemigrations > python manage.py migrate > python manage.py createsuperuser
- debug用命令
# 查看挂载卷信息 docker volume ls # 删除挂载卷:卷标上条命令 docker volume rm 卷序号 # 打印容器输出日志:序号获取 docker ps -a docker logs 容器序号
跳转至:宝塔版nginx+uwsgi+django+vue
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)