Docker介绍
Docker 是一种开源的容器化平台,允许开发者将应用程序及其依赖打包到一个独立的容器中,从而实现快速部署、可移植性和环境一致性。
1. Docker 的核心组件
Docker 主要由以下三个核心组件组成:
-
Docker 镜像(Image):
-
镜像是容器的基础,是一个只读的模板,包含了运行容器所需的文件系统、环境变量和程序配置。
-
镜像可以基于其他镜像构建,并且是层叠的,每一层都代表了对原始镜像的修改。
-
可以从 Docker Hub 或私有仓库中获取镜像。
-
使用
docker images
命令可以列出本地主机上的 Docker 镜像。
Docker原理最全详解(图文全面总结) - 哈喽比特 - https://www.hellobit.com.cn <!-- 图片示例,实际图片请根据来源替换 -->
-
-
Docker 容器(Container):
-
容器是一个独立、轻量级的运行环境,包含了应用程序及其所有依赖项。
-
容器是镜像的运行实例,可以被创建、启动、停止、删除。
-
容器技术本质上是对计算机资源的隔离与控制,可以理解为一种沙盒技术。
Docker原理最全详解(图文全面总结) - 哈喽比特 - https://www.hellobit.com.cn <!-- 图片示例,实际图片请根据来源替换 -->
-
-
Docker 仓库(Repository):
-
仓库是存储和分享 Docker 镜像的地方。
-
Docker 官方维护了一个公共仓库:Docker Hub,这里提供了可以满足大部分需求的 Docker 镜像。
-
除了 Docker Hub,国内一些云服务商也提供类似于 Docker Hub 的公开服务,如阿里云、腾讯云等。
Docker原理最全详解(图文全面总结) - 哈喽比特 - https://www.hellobit.com.cn <!-- 图片示例,实际图片请根据来源替换 -->
-
2. Docker 的工作原理
Docker 的实现原理主要基于以下 Linux 内核特性:
-
命名空间(Namespace):
-
用于隔离进程间的资源,包括进程、网络、用户等,使得容器内的进程看起来就像在一个独立的环境中运行一样。
-
-
控制组(Cgroups):
-
用于限制和隔离进程组的资源,如 CPU、内存、磁盘 I/O 等,以确保容器在宿主机上的有限资源中运行。
-
-
联合文件系统(Union File System):
-
将多个文件系统挂载到同一个目录下,形成一个统一的文件系统。这使得容器可以共享基础镜像的文件系统层,并在其之上添加自己的可写层。
-
3. Docker 的基本操作
-
拉取镜像:
bash复制
docker pull ubuntu
-
推送镜像:
bash复制
docker push your-registry/your-image:tag
-
搜索镜像:
bash复制
docker search nginx
-
启动容器:
bash复制
docker start [容器名/ID]
-
查看容器:
bash复制
docker ps
-
进入容器:
bash复制
docker exec -it [容器名/ID] /bin/bash
-
停止容器:
bash复制
docker stop [容器名/ID]
-
删除容器:
bash复制
docker rm [容器名/ID]
4. Docker 的架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。Docker 主要有以下几部分组成:
-
Docker Client(客户端)
-
Docker Daemon(守护进程)
-
Docker Image(镜像)
-
Docker Container(容器)
-
Docker Registry(仓库)
Docker基本命令
Docker 是一个开源的应用容器引擎,允许开发者将应用程序及其依赖打包到一个独立的容器中,从而实现快速部署、可移植性和环境一致性。以下是 Docker 的一些基本命令,帮助你快速上手 Docker。
1. 安装 Docker
(1)安装 Docker Engine
-
Windows 和 macOS:
-
下载并安装 Docker Desktop。
-
安装完成后,启动 Docker Desktop。
-
-
Linux:
-
更新包索引:
bash复制
sudo apt-get update
-
安装必要的包:
bash复制
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
-
添加 Docker 的官方 GPG 密钥:
bash复制
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
-
将 Docker 的 APT 仓库添加到系统中:
bash复制
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
-
安装最新版本的 Docker Engine 和
containerd
:
bash复制
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
-
验证 Docker 是否安装成功:
bash复制
sudo docker run hello-world
-
2. Docker 基本命令
(1)管理镜像
-
拉取镜像:
bash复制
docker pull [镜像名]
-
示例:
bash复制
docker pull ubuntu
-
-
列出本地镜像:
bash复制
docker images
-
删除镜像:
bash复制
docker rmi [镜像ID或镜像名]
-
示例:
bash复制
docker rmi ubuntu
-
-
搜索镜像:
bash复制
docker search [关键词]
-
示例:
bash复制
docker search nginx
-
(2)管理容器
-
运行容器:
bash复制
docker run [选项] [镜像名] [命令]
-
示例:
bash复制
docker run -d -p 80:80 nginx
-
-d
:后台运行容器。 -
-p
:端口映射,格式为宿主机端口:容器端口
。
-
-
列出正在运行的容器:
bash复制
docker ps
-
列出所有容器:
bash复制
docker ps -a
-
进入容器:
bash复制
docker exec -it [容器ID或容器名] /bin/bash
-
示例:
bash复制
docker exec -it my_container /bin/bash
-
-
停止容器:
bash复制
docker stop [容器ID或容器名]
-
示例:
bash复制
docker stop my_container
-
-
启动容器:
bash复制
docker start [容器ID或容器名]
-
示例:
bash复制
docker start my_container
-
-
删除容器:
bash复制
docker rm [容器ID或容器名]
-
示例:
bash复制
docker rm my_container
-
-
删除所有已停止的容器:
bash复制
docker container prune
(3)管理数据卷
-
创建数据卷:
bash复制
docker volume create [数据卷名]
-
示例:
bash复制
docker volume create my_volume
-
-
列出数据卷:
bash复制
docker volume ls
-
删除数据卷:
bash复制
docker volume rm [数据卷名]
-
示例:
bash复制
docker volume rm my_volume
-
-
删除所有未使用的数据卷:
bash复制
docker volume prune
(4)管理网络
-
创建网络:
bash复制
docker network create [网络名]
-
示例:
bash复制
docker network create my_network
-
-
列出网络:
bash复制
docker network ls
-
删除网络:
bash复制
docker network rm [网络名]
-
示例:
bash复制
docker network rm my_network
-
-
连接容器到网络:
bash复制
docker network connect [网络名] [容器名或容器ID]
-
示例:
bash复制
docker network connect my_network my_container
-
-
断开容器与网络的连接:
bash复制
docker network disconnect [网络名] [容器名或容器ID]
-
示例:
bash复制
docker network disconnect my_network my_container
-
3. Docker Compose
Docker Compose 是一个工具,用于定义和运行多容器 Docker 应用程序。通过一个 YAML 文件,你可以配置应用程序的服务、网络和卷。
-
安装 Docker Compose:
-
下载并安装 Docker Compose。
-
-
创建
docker-compose.yml
文件:yaml复制
version: '3' services: web: image: nginx ports: - "80:80" db: image: mysql environment: MYSQL_ROOT_PASSWORD: example
-
启动服务:
bash复制
docker-compose up
-
停止服务:
bash复制
docker-compose down
4. 常见问题解决
-
权限问题:
-
如果在运行 Docker 命令时遇到权限问题,可以将当前用户添加到
docker
组:
bash复制
sudo usermod -aG docker ${USER}
-
重新登录或重启系统以使更改生效。
-
-
清理未使用的资源:
-
清理未使用的镜像、容器、数据卷和网络:
bash复制
docker system prune
-
使用Docker搭建实验环境
Docker 是一个强大的工具,可以快速搭建各种实验环境,无论是开发、测试还是学习新的技术栈,Docker 都能提供一致性和隔离性。以下将通过几个具体的实验环境搭建示例,展示如何使用 Docker 快速搭建实验环境。
1. 搭建一个简单的 Web 应用环境
假设你想搭建一个简单的 Web 应用环境,使用 Nginx 作为 Web 服务器,MySQL 作为数据库。
(1)创建 docker-compose.yml
文件
yaml复制
version: '3'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- "3306:3306"
volumes:
- ./mysql_data:/var/lib/mysql
(2)创建 Web 应用内容
在项目目录下创建一个 html
文件夹,并在其中创建一个简单的 HTML 文件 index.html
:
HTML复制
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My Web App</title>
</head>
<body>
<h1>Welcome to My Web App</h1>
</body>
</html>
预览
(3)启动服务
在项目目录下运行以下命令:
bash复制
docker-compose up -d
-
-d
参数表示在后台运行服务。
(4)访问 Web 应用
打开浏览器,访问 http://localhost
,你应该能看到你的 Web 应用。
(5)停止服务
当你完成实验后,可以运行以下命令停止服务:
bash复制
docker-compose down
2. 搭建一个 Python Flask 应用环境
假设你想搭建一个基于 Python Flask 的 Web 应用环境。
(1)创建项目结构
复制
my_flask_app/
├── app.py
├── requirements.txt
├── Dockerfile
└── docker-compose.yml
(2)创建 app.py
文件
Python复制
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Docker!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
(3)创建 requirements.txt
文件
Flask==2.0.1
(4)创建 Dockerfile
文件
dockerfile复制
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
(5)创建 docker-compose.yml
文件
yaml复制
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
(6)启动服务
在项目目录下运行以下命令:
bash复制
docker-compose up -d
(7)访问 Flask 应用
打开浏览器,访问 http://localhost:5000
,你应该能看到 "Hello, Docker!" 的消息。
(8)停止服务
当你完成实验后,可以运行以下命令停止服务:
bash复制
docker-compose down
3. 搭建一个 Node.js 应用环境
假设你想搭建一个基于 Node.js 的 Web 应用环境。
(1)创建项目结构
复制
my_node_app/
├── app.js
├── package.json
├── Dockerfile
└── docker-compose.yml
(2)创建 app.js
文件
JavaScript复制
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello, Docker!');
});
app.listen(3000, () => {
console.log('App is running on port 3000');
});
(3)创建 package.json
文件
JSON复制
{
"name": "my_node_app",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.17.1"
}
}
(4)创建 Dockerfile
文件
dockerfile复制
FROM node:14-slim
WORKDIR /app
COPY package.json package.json
RUN npm install
COPY . .
CMD ["npm", "start"]
(5)创建 docker-compose.yml
文件
yaml复制
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
(6)启动服务
在项目目录下运行以下命令:
bash复制
docker-compose up -d
(7)访问 Node.js 应用
打开浏览器,访问 http://localhost:3000
,你应该能看到 "Hello, Docker!" 的消息。
(8)停止服务
当你完成实验后,可以运行以下命令停止服务:
bash复制
docker-compose down