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
相关推荐
小洋-21 分钟前
k8s ingress-nginx-controller 0.46.0 升级到 1.6.4
nginx·容器·kubernetes
凤山老林3 小时前
CentOS 安装 Docker
linux·运维·docker·容器·centos
Zaralike3 小时前
JavaWeb
eureka·elementui·linq
AnnyYoung5 小时前
普通用户授权docker使用权限
linux·docker·centos
特立独行的猫a8 小时前
Docker Compose介绍及安装使用MongoDB数据库详解
数据库·mongodb·docker
一行111 小时前
docker配置国内源
运维·docker·容器
嘻嘻哈哈1712 小时前
docker搭建mysql
mysql·docker·容器
wuhanwhite12 小时前
更新无忧:用 Docker 数据卷确保 Open WebUI 数据持久化
docker·openwebui
鸵鸟爸爸12 小时前
Kubernetes 最佳实践:Top 10 常见 DevOps/SRE 面试问题及答案
云原生·容器·kubernetes·devops
forestqq21 小时前
openEuler22.03LTS系统升级docker至26.1.4以支持启用ip6tables功能
linux·运维·docker