侧边栏壁纸
博主头像
SaltFish 博主等级

行动起来,活在当下

  • 累计撰写 3 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

docker简明教程(二)

Administrator
2024-12-12 / 0 评论 / 0 点赞 / 25 阅读 / 0 字

如何部署docker容器

2种的部署方式

docker run

docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go
  • docker run: Docker 命令,用于创建并启动一个新的容器。

  • -d: 以分离模式(后台)运行容器。

  • --name ddns-go: 为容器指定名称 ddns-go

  • --restart=always: 设置容器的重启策略为 always,即无论容器以何种方式退出,Docker 都会始终尝试重新启动容器。

  • --net=host: 使用宿主机的网络堆栈。容器将与宿主机共享网络接口,能直接使用宿主机的 IP 和端口。

  • -v /opt/ddns-go:/root: 将宿主机的 /opt/ddns-go 目录挂载到容器内的 /root 目录,实现数据持久化和共享。

  • jeessy/ddns-go: 使用 jeessy/ddns-go 镜像来创建容器。

选项解释

--restart 选项

用于设置容器的重启策略。常见选项包括:

  • no: 不自动重启容器(默认)。

  • always: 容器停止时总是自动重启。

  • unless-stopped: 除非手动停止,否则总是重启容器。

  • on-failure[:max-retries]: 仅在容器以非零状态退出时重启,最多重启 max-retries 次。

--net 选项

用于指定容器的网络模式。常见选项包括:

  • bridge: 默认网络模式,使用 Docker 提供的桥接网络。

  • host: 容器与宿主机共享网络堆栈。

  • none: 容器没有网络连接。

  • container:<name|id>: 让新容器与指定容器共享网络堆栈。

  • network-name: 使用用户定义的网络。

-v 选项

用于挂载卷,使宿主机的目录或文件能够在容器中使用。常见用法包括:

  • -v /host/path:/container/path: 将宿主机的路径挂载到容器的路径。

  • -v /host/path:/container/path:ro: 只读挂载。

  • -v volume-name:/container/path: 使用命名卷。

通过这条命令,你可以启动一个名为 ddns-go 的 Docker 容器,使用宿主机的网络配置,并确保 /opt/ddns-go 目录中的数据在容器中 /root 路径下可访问且持久化。容器会在异常退出时自动重启以保证服务的持续运行。

docker compose

定义:*Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。*

功能:

  • 多容器管理:允许用户在一个YAML文件中定义和管理多个容器

  • 服务编排:配置容器间的网络和依赖关系

  • 一键部署:使用docker-compose up命令启动、停止和重建服务

# 下载
curl -L "https://github.com/docker/compose/releases/download/v2.31.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
​
# 国内源
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.31.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
 
# 开启可执行权限
chmod +x /usr/local/bin/docker-compose
 
# 查看版本
docker-compose --version
 
# 如果使用curl方式安装的,这样卸载即可
rm /usr/local/bin/docker-compose
​
# 查看帮助
docker-compose -h
​
# 启动所有docker-compose服务
docker-compose up
 
# 启动所有docker-compose服务并后台运行
docker-compose up -d
​
# 停止并删除容器、网络、卷、镜像
docker-compose down

如何查看日志&debug

# 查看实时日志
docker logs -f 容器id
​
# 进入容器
docker exec -it 容器id /bin/bash

DEMO

portainer

version: "3"
services:
  portainer:
    image: portainer/portainer:latest
    container_name: portainer
    ports:
    - "9000:9000"
    volumes:
    - /app/portainer/data:/data
    - /var/run/docker.sock:/var/run/docker.sock

it-tools

services:
  it-tools:
    image: qingfeng2336/it-tools:latest
    container_name: it-tools
    ports:
      - 8080:80
    restart: unless-stopped

chatnio

version: '3'
services:
  mysql:
    image: mysql:8.3.0
    container_name: db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: chatnio
      MYSQL_USER: chatnio
      MYSQL_PASSWORD: chatnio123456!
      TZ: Asia/Shanghai
    expose:
      - "3306"
    volumes:
        - ./db:/var/lib/mysql
    networks:
      - chatnio-network
​
  redis:
    image: redis:latest
    container_name: redis
    restart: always
    expose:
      - "6379"
    volumes:
      - ./redis:/data
    networks:
      - chatnio-network
​
  chatnio:
      image: programzmh/chatnio
      container_name: chatnio
      restart: always
      ports:
          - "8000:8094"
      depends_on:
          - mysql
          - redis
      links:
          - mysql
          - redis
      ulimits:
        nofile:
          soft: 65535
          hard: 65535
      environment:
          MYSQL_HOST: mysql
          MYSQL_USER: chatnio
          MYSQL_PASSWORD: chatnio123456!
          MYSQL_DB: chatnio
          REDIS_HOST: redis
          REDIS_PORT: 6379
          REDIS_PASSWORD: ""
          REDIS_DB: 0
          SERVE_STATIC: "true"
      volumes:
        - ./config:/config
        - ./logs:/logs
        - ./storage:/storage
      networks:
        - chatnio-network
​
networks:
  chatnio-network:
    driver: bridge

nginx-proxy-manager

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

如何开发docker应用程序

docker打包

第一个hello-world程序

创建app.py

from http.server import HTTPServer, BaseHTTPRequestHandler
​
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'Hello, Docker!')
​
def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler):
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()
​
if __name__ == '__main__':
    run()

创建Dockerfile

# 使用官方 Python 运行时作为父镜像
FROM python:3.8-slim
​
# 将当前目录内容复制到容器中的 /app 目录
COPY . /app
​
# 设置工作目录为 /app
WORKDIR /app
​
# 将 8000 端口暴露出来
EXPOSE 8000
​
# 定义环境变量,用于 Python 应用
ENV NAME World
​
# 运行 Python 应用
CMD ["python", "app.py"]

运行服务

docker run -d --name python-http-app-container -p 8001:8000 python-http-app

部署一个文件分享服务

步骤 1: 创建 Python HTTP 服务

首先,你需要一个 Python 脚本来提供 HTTP 服务,并确保它能够访问挂载的目录。假设你有一个名为 app.py 的文件,内容如下:

python# app.py
import os
from http.server import HTTPServer, SimpleHTTPRequestHandler
​
# 设置文件服务目录
os.chdir('/app/share')
​
# 创建 HTTP 请求处理器
class CustomHTTPRequestHandler(SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate')
        return super().end_headers()
​
def run(server_class=HTTPServer, handler_class=CustomHTTPRequestHandler):
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    print("Serving on port 8000")
    httpd.serve_forever()
​
if __name__ == '__main__':
    run()

步骤 2: 创建 Dockerfile

接下来,创建一个 Dockerfile 来定义你的 Python 环境和应用:

dockerfile# 使用官方 Python 运行时作为父镜像
FROM python:3.8-slim
​
# 将当前目录内容复制到容器中的 /app 目录
COPY . /app
​
# 设置工作目录为 /app
WORKDIR /app
​
# 将 8000 端口暴露出来
EXPOSE 8000
​
# 运行 Python 应用
CMD ["python", "app.py"]

步骤 3: 构建 Docker 镜像

在包含 Dockerfileapp.py 的目录中运行以下命令来构建 Docker 镜像:

bash
docker build -t python-http-app .

步骤 4: 运行 Docker 容器并挂载目录

使用以下命令运行 Docker 容器,并挂载 /opt/share 目录:

docker run -d --name python-http-app-container -p 8001:8000 -v /opt/share:/app/share:ro python-http-app1
  • -d: 以分离模式运行容器(后台运行)。

  • --name python-http-app-container: 为容器指定名称 python-http-app-container

  • -p 8000:8000: 将容器的 8000 端口映射到宿主机的 8000 端口。

  • -v /opt/share:/app/share:ro: 将宿主机的 /opt/share 目录挂载到容器的 /app/share 目录,以只读方式挂载(ro 表示只读)。

  • python-http-app: 使用之前构建的镜像。

解释

  1. 构建镜像:使用 docker build 命令根据 Dockerfile 构建一个包含 Python 环境和你的 HTTP 服务的 Docker 镜像。

  2. 运行容器

    • -d: 容器在后台运行。

    • --name: 为容器指定一个名称。

    • -p 8000:8000: 将容器的 8000 端口映射到宿主机的 8000 端口,使得可以通过宿主机的 8000 端口访问 Python HTTP 服务。

    • -v /opt/share:/app/share:ro: 将宿主机的 /opt/share 目录挂载到容器的 /app/share 目录,以只读方式挂载,确保容器内的 HTTP 服务可以访问该目录下的文件。

    • python-http-app: 使用构建的镜像启动容器。

通过以上步骤,你的 Docker 容器将运行一个 HTTP 服务,能够共享并提供物理机 /opt/share 目录下的文件。你可以通过访问 http://<your-host-ip>:8000 来查看和下载这些文件。

镜像构建失败的原因

  1. 镜像构建失败

    • 检查Dockerfile中的指令是否正确。

    • 确保所有依赖文件都已正确复制到容器中。

  2. 容器无法启动

    • 检查应用程序的启动脚本是否有错误。

    • 确保端口映射正确。

  3. 镜像体积过大

    • 使用多阶段构建优化镜像大小。

    • 清理不必要的文件和依赖。


0

评论区