Docker使用操作

文章目录

  • Docker基本使用
    • 1. 安装Docker(简易版)
    • 2. docker常用命令
    • 3. 镜像基础命令
    • 4. 容器操作
    • 5. Dockerfile编写

Docker基本使用

  • 环境: python3.11

  • 使用框架 Django


1. 安装Docker(简易版)

  • 卸载旧版本docker(如果存在)

    sudo apt-get remove docker docker-engine docker-ce docker.io
    
  • 更新镜像源

    sudo apt-get update
    
  • 安装简易版docker

    sudo apt-get install docker.io
    

2. docker常用命令

  • docker version : 查看docker版本信息

3. 镜像基础命令

  • docker images: 查看镜像列表。
  • docker pull: 下载镜像
  • docker ps: 查看正在运行的容器列表。
  • docker ps -a: 查看正在运行的容器和之前运行过的。
  • docker start 容器id: 启动某个暂停的容器
  • docker rm 容器id: 删除指定容器,正在运行中的不能删除
  • docker rm -f 容器id: 删除指定容器,无论是在运行还是不运行的,都能删除
  • docker rm -f $(docker ps -aq): 强制删除所有容器
  • docker stop 容器id: 停止某个容器
  • docker restart 容器id: 重启某个正在运行中的容器
  • docker logs 容器id: 查看某个容器下的日志信息
  • docker inspect 容器id: 获取容器或镜像的详细信息,可以查看到容器或镜像的配置,状态,网络,卷和其他元数据。

4. 容器操作

  • docker run

    • –name: 为容器指定一个名称
    • -d: 在后台运行容器,并返回容器ID
    • -e: 设置环境变量
    • -i: 以交互模式运行容器,通常与-t同时使用。
    • -t: 为容器重新分配一个伪输入终端,通常与-i同时使用
    • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
    • -v: 绑定一个卷,格式为:宿主目录:容器内部目录,常用于将配置文件或数据文件放在宿主机器上。
    • –rm: 指定容器停止后自动删除容器,但不支持与docker run -d同时使用。
  • docker exec

    进入容器命令,此命令可以进入容器中去,方便修改配置文件之类的

    docker exec -it 容器id /bin/bash
    

    注意:

    此处不能用 ctrl + c 或者 exit 去退出,这样推出会导致容器停止

    使用快捷键 ctrl + p + q 退出


5. Dockerfile编写

此处已打包Django为例

django + gunicorn

gunicornx.py

# gunicorn.conf
# coding:utf-8
# 启动命令:gunicorn -c gunicornx.py application.asgi:application
import multiprocessing
# 并行工作进程数, int,cpu数量*2+1 推荐进程数
# workers = multiprocessing.cpu_count() * 2 + 1
workers = 4
# 指定每个进程开启的线程数
threads = 500
# 绑定的ip与端口
bind = '0.0.0.0:5000'
# 设置守护进程,将进程交给第三方管理
daemon = 'false'
# 工作模式协程,默认的是sync模式,推荐使用 gevent,此处使用与uvicorn配合使用 uvicorn.workers.UvicornWorker
# worker_class = "gevent"
worker_class = 'uvicorn.workers.UvicornWorker'
# 设置最大并发量(每个worker处理请求的工作线程数,正整数,默认为1)
worker_connections = 500
# 最大客户端并发数量,默认情况下这个值为1000。此设置将影响gevent和eventlet工作模式
# 每个工作进程将在处理max_requests请求后自动重新启动该进程
max_requests = 10000
max_requests_jitter = 200
# 设置进程文件目录
pidfile = './gunicorn.pid'
# 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
loglevel = 'info'
# 设置gunicorn访问日志格式,错误日志无法设置
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'
# 监听队列
backlog = 512
#进程名
proc_name = 'gunicorn_process'
# 设置超时时间120s,默认为30s。按自己的需求进行设置timeout = 120
timeout = 120
# 超时重启
graceful_timeout = 300
# 在keep-alive连接上等待请求的秒数,默认情况下值为2。一般设定在1~5秒之间。
keepalive = 3
# HTTP请求行的最大大小,此参数用于限制HTTP请求行的允许大小,默认情况下,这个值为4094。
# 值是0~8190的数字。此参数可以防止任何DDOS攻击
limit_request_line = 5120
# 限制HTTP请求中请求头字段的数量。
#  此字段用于限制请求头字段的数量以防止DDOS攻击,与limit-request-field-size一起使用可以提高安全性。
# 默认情况下,这个值为100,这个值不能超过32768
limit_request_fields = 101
# 限制HTTP请求中请求头的大小,默认情况下这个值为8190。
# 值是一个整数或者0,当该值为0时,表示将对请求头大小不做限制
limit_request_field_size = 0
# 记录到标准输出
accesslog = '-'

start.sh

#!/bin/sh

gunicorn -c gunicornx.py application.asgi:application
# 1. 挑选基础镜像
FROM python:3.11.2
# 使用sed工具来修改/etc/apt/sources.list文件, 是Debian和Ubuntu系统中APT软件包管理工具的软件源列表文件。这个命令的目的是将所有的deb.debian.org替换为mirrors.163.com,这实际上是将默认的Debian软件源替换为网易的镜像源。使用镜像源通常可以加快软件包的下载速度,因为它可能位于地理位置更接近您的服务器或具有更好的网络连接
RUN sed -i s/deb.debian.org/mirrors.163.com/g /etc/apt/sources.list
# 输出/etc/apt/sources.list文件的内容, 用于验证前面的sed命令是否已成功修改了软件源列表
RUN cat /etc/apt/sources.list
# 清理APT缓存, 通常在安装新软件包之前执行,以确保使用的是最新的软件包版本。
RUN apt-get clean
# 命令用于更新软件包列表
RUN apt-get update
# 安装vim,使用debian的话有的时候没有vim命令
RUN apt-get install -y vim
# 创建一个工作目录
RUN mkdir /workspace
# 指令用于设置容器的工作目录,即后续命令执行的默认目录, 它设置了工作目录为/workspace。这意味着,除非指定了其他路径,否则后续的RUN、COPY、ADD等指令都会在这个目录下执行。
WORKDIR /workspace
# 将我的django代码复制到容器中
COPY . /workspace/mydjangotest
# 更新pip镜像并切换镜像源
RUN pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 给start.sh一个可读可写可执行的权限
RUN chmod 777 /workspace/mydjangotest/start.sh
# 设置容器启动时要执行的命令。这里,它指定了容器启动时要运行start.sh 这个脚本
# 也可以用CMD启动:CMD ["/workspace/mydjangotest/start.sh"]
ENTRYPOINT ["/workspace/mydjangotest/start.sh"]
# 用于声明容器运行时会监听的网络端口。这里,它告诉Docker容器将监听5个不同的端口:80、8001、8000、5010和4000。
EXPOSE 80 8001 8000 5010 4000

注意

我在这里没有使用CMD来启动

  1. 目的和用途:

    • CMD:用于指定容器启动时的默认要运行的命令或程序。如果在Dockerfile中存在多个CMD指令,只有最后一个会生效。此外,CMD指令指定的命令可以被docker run命令后面提供的命令行参数所覆盖。
    • ENTRYPOINT:用于指定容器启动时要运行的可执行文件或脚本,它定义了容器的主要启动命令。与CMD不同,ENTRYPOINT指令不会被docker run命令的参数所覆盖,而是将这些参数作为ENTRYPOINT指令的参数进行传递。
  2. 覆盖和替换:

    • CMD:如果用户在运行docker run命令时指定了运行的命令,那么CMD指令指定的默认命令将被覆盖。
    • ENTRYPOINT:ENTRYPOINT指令指定的命令不会被docker run命令的参数所覆盖,而是将这些参数作为ENTRYPOINT的参数。这意味着,用户提供的命令参数将附加到ENTRYPOINT后面,形成新的命令组合。
  3. 稳定性和必要性:

    • CMD:由于CMD指令可以被docker run命令的参数所覆盖,因此它提供的命令可能不是稳定的。Dockerfile中至少要有一个ENTRYPOINT或CMD指令,如果都没有,那么容器将没有默认的执行命令。
    • ENTRYPOINT:ENTRYPOINT指令更加稳定,因为它不会被docker run命令的参数所覆盖。在Dockerfile中,ENTRYPOINT指令是可选的,但如果存在,它定义了容器的基本行为。

    总结来说,CMD和ENTRYPOINT的主要区别在于它们的用途、覆盖行为以及稳定性。CMD主要用于提供容器的默认命令,这个命令可以被docker run命令的参数所覆盖;而ENTRYPOINT则定义了容器的主要启动命令,它不会被覆盖,而是将docker run命令的参数作为自身命令的参数进行传递。是将docker run命令的参数作为自身命令的参数进行传递。

启动

sudo docker run -itd -p 4200:4000 \
	-v /home/workspace/mydjangotest/media/:/workspace/mydjangotest/media/ \
	--name mydjango mydjangotest

你可能感兴趣的:(docker,eureka,容器)