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 镜像。
- 将主机的
18080
和18081
端口分别映射到容器的相应端口。 - 挂载自定义的 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 配置文件。bashworker_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 会查找并返回这个目录下的静态文件。
- 监听端口 :如果你需要让 Nginx 监听其他端口(比如 8080、443 等),或者你的应用需要不同的端口,可能需要修改
-
mysql/conf/my.cnf
(可选):根据需要自定义 MySQL 配置。 -
mysql/init/init.sql
(可选):用于初始化数据库的 SQL 脚本。 -
nginx/html/
:将您的静态网页文件放在此目录下 -
创建
docker-compose.yml
- 在
hmall-project
目录下创建并编辑docker-compose.yml
文件(我一般是创建好拖进虚拟机)
- 在
-
构建和启动服务
-
构建
hmall
镜像在项目根目录 (
hmall-project
) 下运行以下命令:bashdocker-compose build
参数解释:
up
: 创建并启动容器。-d
: 在后台运行(detached mode)。
-
-
验证服务状态
-
查看所有运行中的服务
bashdocker-compose ps
-