Docker

Docker 是一个开源的平台,用于自动化应用程序的部署、扩展和管理。它通过容器技术使得应用程序可以在不同的环境中一致地运行。以下是一些 Docker 的基本知识:

1. 容器(Container)

容器是 Docker 的核心概念。它是一个轻量级、可移植的、封装应用程序及其所有依赖项的环境。容器可以在不同的计算机上运行,保证无论是在开发、测试、还是生产环境中,应用程序的行为是一致的。

  • 容器与虚拟机(VM)不同,虚拟机需要整个操作系统,而容器共享宿主操作系统的内核,只运行应用程序和必要的库,因此更轻量,启动更快。

2. 镜像(Image)

镜像是容器的模板,包含了运行某个应用所需要的一切,包括操作系统、应用程序、库和依赖项。你可以将镜像看作容器的"蓝图",它是不可变的。

  • Dockerfile:是定义镜像内容的文件,包含一系列的指令,用来构建镜像。你可以通过 Dockerfile 自动化镜像的创建。

3. Docker 引擎(Docker Engine)

Docker 引擎是 Docker 的核心组件,负责构建、运行和管理 Docker 容器。它由以下部分组成:

  • Docker Daemon:负责管理 Docker 容器的生命周期,处理 Docker 客户端发出的请求。
  • Docker CLI:命令行接口,用户通过它与 Docker Daemon 交互。

4. Docker Hub

Docker Hub 是一个公共的镜像仓库,你可以在这里存储和共享你的 Docker 镜像。它也提供了大量的官方镜像,可以直接拉取使用。

5. 基本 Docker 命令

  • docker pull <image>:从 Docker Hub 拉取镜像。
  • docker build -t <image_name> .:根据当前目录的 Dockerfile 构建镜像。
  • docker run <image>:运行一个容器实例。
  • docker ps:列出当前运行的容器。
  • docker stop <container_id>:停止一个正在运行的容器。
  • docker rm <container_id>:删除一个停止的容器。
  • docker rmi <image_id>:删除一个镜像。
  • docker inspect + 检查的 Docker 对象的 名称ID
  • docker load -i jdk.tar 如果有了镜像可以这样创建容器
  • docker exec it (容器名称)bash 相当于进入了容器中

+

6. Docker Compose

Docker Compose 是一个工具,用于定义和管理多个容器应用的部署。你可以通过编写一个 docker-compose.yml 文件来描述多个容器之间的关系和配置,简化容器的管理。

7. 容器与虚拟机的区别

  • 虚拟机:运行完整的操作系统和应用程序,开销较大,启动较慢。
  • 容器:共享宿主机操作系统的内核,运行效率更高,启动速度更快。

如何从Docker上面下载镜像?

要从 Docker 上下载镜像,你需要使用 docker pull 命令。以下是操作步骤:

1. 使用 docker pull 命令下载镜像

docker pull 命令用于从 Docker Hub 或其他镜像仓库下载镜像。

在官网中有,但是需要梯子

mysql - Official Image | Docker Hub

基本语法:

docker pull <image_name>:<tag>

  • <image_name> 是你想下载的镜像名称。
  • <tag> 是镜像的版本标签(默认为 latest)。如果你不指定标签,Docker 会默认下载 latest 标签的镜像。
示例:
  • 下载官方的 ubuntu 镜像:

    docker pull ubuntu

    如果没有指定标签,Docker 会默认下载 ubuntu:latest

  • 下载特定版本的镜像(例如:nginx 版本为 1.21):

    docker pull nginx:1.21

如何启动 Docker 容器?

这是一个使用 Docker 启动 MySQL 容器的示例和解释:

基于镜像创建新容器

使用 docker run 命令创建并启动一个新容器

bash 复制代码
docker run -d --name new-container-name -p 8080:8080 docker-demo

如何修改容器内部的文件?

通过 数据卷(Volume)修改文件

如果你希望容器中的文件和宿主机之间保持同步,可以使用 卷(volumes) 将宿主机的目录挂载到容器中,这样可以在宿主机上直接修改文件,容器内的文件也会同步更新。

使用自动创建的数据卷(无指定宿主机路径)

如果在运行容器时使用 -v 数据卷名:/container/path,而不指定宿主机目录,Docker 会自动创建一个数据卷,并分配唯一的名称。

例如:

docker run -v my_volume:/app/data ubuntu

my_volume 是一个数据卷的名称,存储在 Docker 管理的目录中。

Docker 会确保该数据卷存在,并将其挂载到容器内的 /app/data

如果在下载镜像的时候没有挂载数据卷,docker会自动挂载,叫做匿名卷

挂载本地目录时使用路径,而非数据卷名称

如果明确指定宿主机目录,直接使用路径挂载:

docker run -v /host/path:/container/path ubuntu

/host/path 是宿主机目录路径,而非数据卷名称。

如何挂载/root/mysql/data到容器内的/var/lib/mysql目录

挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录,

挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录,携带课前资料准备的配置文件(注意前提需要把这些文件的目录创建出来

bash 复制代码
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d  \
mysql

Dockerfile

如何自定义镜像?

如何自定义网络?

docker compose

编写 docker-compose.yml 文件

docker-compose.yml 文件用于定义多容器的应用服务。以下是一个简单的示例,包含一个 Web 服务,nginx前端和一个数据库服务。

bash 复制代码
version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - hm-net
    depends_on:
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - hmall
    networks:
      - hm-net
networks:
  hm-net:
    name: hmall
  • 服务 mysql
    • 使用官方 MySQL 镜像。
    • 将主机的 3306 端口映射到容器的 3306 端口。
    • 设置时区和 root 密码。
    • 使用卷挂载配置文件、数据目录和初始化脚本。
    • 连接到自定义网络 hm-net
  • 服务 hmall
    • 使用当前目录下的 Dockerfile 构建镜像。
    • 将主机的 8080 端口映射到容器的 8080 端口。
    • 依赖于 mysql 服务,确保 MySQL 在 hmall 启动前已启动。
    • 连接到自定义网络 hm-net
  • 服务 nginx
    • 使用官方 Nginx 镜像。
    • 将主机的 1808018081 端口分别映射到容器的相应端口。
    • 挂载自定义的 Nginx 配置文件和静态文件目录。
    • 依赖于 hmall 服务,确保 hmall 在 Nginx 启动前已启动。
    • 连接到自定义网络 hm-net
  • 网络 hm-net
    • 定义一个名为 hmall 的自定义网络,确保服务之间可以通过服务名互相通信。
运行 Docker Compose

在包含 docker-compose.yml 文件的目录中执行以下命令:

docker-compose up -d

使用compose部署在Lunix的完整步骤:

在开发环境下,已经生成了一个可执行的 JAR 包,并希望将其部署到虚拟机上。以下是如何使用 Docker Compose 配置您的项目,包括如何处理已经打包好的 JAR 文件以及 Nginx 配置的调整。

准备项目目录结构、创建必要的配置文件、构建和启动服务。以下是详细的指南:

1. 准备项目目录结构

首先,创建一个项目目录并在其中设置所需的子目录和文件。这有助于组织不同服务的配置和数据。

假设您的项目名为 hmall-project,可以按以下结构组织:

bash 复制代码
hmall-project/
├── docker-compose.yml
├── Dockerfile
├── hmall.jar
├── mysql/
│   ├── conf/
│   │   └── my.cnf (可选,根据需要配置)
│   ├── data/
│   └── init/
│       └── init.sql (可选,根据需要初始化数据库)
├── nginx/
│   ├── nginx.conf
│   └── html/
│       └── (您的静态文件)

1.1 创建项目目录

bash 复制代码
mkdir hmall-project
cd hmall-project

1.2 创建子目录

bash 复制代码
mkdir -p mysql/conf mysql/data mysql/init nginx/html
mkdir hmall

1.3 创建必要的配置文件

  • docker-compose.yml : 在 hmall-project 目录下创建此文件,并将您提供的配置粘贴进去。

    • Dockerfile : 根据您的 hmall 服务需求创建 Dockerfile。以下是一个简单的示例:

      bash 复制代码
      # Dockerfile
      
      # 使用官方 OpenJDK 作为基础镜像(根据您的应用需求调整)
      FROM openjdk:11-jdk
      
      # 设置工作目录
      WORKDIR /app
      
      # 复制应用 JAR 文件到容器中 hmall .jar是你在开发环境的target目录下面的,前提是已经打包好了的
      COPY hmall.jar /app/hmall.jar
      
      # 暴露应用端口
      EXPOSE 8080
      
      # 启动应用
      CMD ["java", "-jar", "hmall.jar"]

      注意 :如果项目结构或构建方式不同,请根据实际情况调整 Dockerfile
      注意 :确保 hmall.jar 文件与 Dockerfile 在同一目录下。

  • nginx/nginx.conf : 创建 Nginx 配置文件。

    bash 复制代码
    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/json;
    
        sendfile        on;
        
        keepalive_timeout  65;
    
        server {
            listen       18080;
            # 指定前端项目所在的位置
            location / {
                root /usr/share/nginx/html/hmall-portal;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
            location /api {
                rewrite /api/(.*)  /$1 break;
                proxy_pass http://hmall:8080;
            }
        }
        server {
            listen       18081;
            # 指定前端项目所在的位置
            location / {
                root /usr/share/nginx/html/hmall-admin;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
            location /api {
                rewrite /api/(.*)  /$1 break;
                proxy_pass http://hmall:8080;
            }
        }
    }

    需要修改的配置项包括:

    • 监听端口 :如果你需要让 Nginx 监听其他端口(比如 8080、443 等),或者你的应用需要不同的端口,可能需要修改 listen 指令。
    • 反向代理设置 :如果 Nginx 被用作反向代理服务器,通常需要修改 proxy_pass 配置,指向后端应用服务器的地址。
    • location 定义请求路径匹配规则的部分
      • location / :表示匹配所有访问根路径 (/) 的请求。
      • root /usr/share/nginx/html/hmall-portal; :为匹配到的请求提供静态文件的根目录。这里是指定了路径 /usr/share/nginx/html/hmall-portal,当访问根路径时,Nginx 会查找并返回这个目录下的静态文件。
  • mysql/conf/my.cnf(可选):根据需要自定义 MySQL 配置。

  • mysql/init/init.sql(可选):用于初始化数据库的 SQL 脚本。

  • nginx/html/:将您的静态网页文件放在此目录下

  • 创建 docker-compose.yml

    • hmall-project 目录下创建并编辑 docker-compose.yml 文件(我一般是创建好拖进虚拟机)
  • 构建和启动服务

    • 构建 hmall 镜像

      在项目根目录 (hmall-project) 下运行以下命令:

      bash 复制代码
      docker-compose build

      参数解释

      • up: 创建并启动容器。
      • -d: 在后台运行(detached mode)。
  • 验证服务状态

    • 查看所有运行中的服务

      bash 复制代码
      docker-compose ps
相关推荐
ccmjga2 小时前
升级 Spring Boot 3 配置讲解 —— 如何在 Spring Boot 3 中接入生成式 AI?
java·人工智能·spring boot·后端·docker·面试·单元测试
转码的小石2 小时前
使用docker 通过lobechat部署ollama中的模型
运维·docker·容器
大卫talk4 小时前
使用Docker搭建npm私有仓库
前端·docker·npm
wuzi_uzi5 小时前
Docker 部署 elasticsearch:7.14.0 与 kibana:7.14.0
elasticsearch·docker·jenkins
PyAIGCMaster5 小时前
docker学习记录:部署es+kibana
学习·elasticsearch·docker
AI探索家_星海算力6 小时前
如何配置【Docker镜像】加速器+【Docker镜像】的使用
运维·人工智能·docker·容器·gpu算力
boy快快长大16 小时前
通过Dockerfile来实现项目可以指定读取不同环境的yml包
docker
会飞的土拨鼠呀16 小时前
docker system df命令
运维·docker·容器
dessler19 小时前
Docker-原理之cgroup
linux·运维·docker
Dolphin_Home20 小时前
Docker搭建Skywalking
docker·容器·skywalking