Docker入門:容器化技術的第一堂課

在這里插入圖片描述

Docker入門:容器化技術的第一堂課

🌟 你好,我是 勵志成為糕手 !
🌌 在代碼的宇宙中,我是那個追逐優雅與性能的星際旅人。 ?
每一行代碼都是我種下的星光,在邏輯的土壤里生長成璀璨的銀河;
🛠? 每一個算法都是我繪制的星圖,指引著數據流動的最短路徑; 🔍
每一次調試都是星際對話,用耐心和智慧解開宇宙的謎題。
🚀 準備好開始我們的星際編碼之旅了嗎?

目錄

  • Docker入門:容器化技術的第一堂課
    • 容器化世界的探索之旅
    • Docker基礎概念
      • 什么是Docker?
      • Docker的核心組件
      • Docker vs 虛擬機
    • Docker安裝與配置
      • Windows上安裝Docker
      • Linux上安裝Docker
      • 驗證安裝
    • Docker基本命令
      • 鏡像管理命令
      • 容器管理命令
    • Dockerfile詳解
      • Dockerfile基本結構
      • Dockerfile常用指令
      • 構建和運行Docker鏡像
    • Docker Compose入門
      • Docker Compose基本概念
      • docker-compose.yml文件示例
      • Docker Compose常用命令
    • Docker實戰:部署一個全棧博客系統
      • 項目架構概覽
      • 后端API服務
      • 前端React應用
      • Nginx配置
      • Docker Compose配置
      • 部署和運行
      • 啟動完整應用
      • 應用特點
    • Docker最佳實踐
      • 鏡像構建最佳實踐
      • 容器運行最佳實踐
      • 安全最佳實踐
    • Docker生態系統
      • 常用Docker工具
      • Docker使用趨勢
      • 容器化技術的未來
    • 總結與展望
    • 參考鏈接
    • 關鍵詞標簽

容器化世界的探索之旅

作為一名剛剛踏入技術博客創作領域的新手,我深知學習新技術的挑戰與樂趣。Docker作為現代開發環境中不可或缺的工具,一直是我近期學習的重點。還記得我第一次接觸Docker時,被各種概念和命令搞得暈頭轉向,甚至一度懷疑自己是否適合繼續深入這個領域。然而,經過不斷的實踐和摸索,我逐漸理解了Docker的核心理念和基本操作,感受到了它帶來的便利與效率提升。

在這篇文章中,我將以自己的學習經歷為基礎,為大家梳理Docker的入門知識,包括Docker的基本概念、安裝配置、常用命令以及實際應用場景。我會盡量用簡潔明了的語言,配合實用的代碼示例和直觀的圖表,幫助你快速掌握Docker的基礎知識。無論你是完全的新手,還是已經有一些了解但想要系統學習的開發者,這篇文章都能為你提供有價值的參考。

讓我們一起揭開Docker的神秘面紗,探索容器化技術的奇妙世界!通過這篇文章,你將了解Docker如何解決"在我的機器上能運行"的經典問題,如何簡化開發環境的配置,以及如何提高應用部署的一致性和可靠性。準備好了嗎?讓我們開始這段Docker入門之旅吧!

Docker基礎概念

在深入學習Docker之前,我們需要先理解幾個核心概念,這些是構建Docker知識體系的基礎。

什么是Docker?

Docker是一個開源的應用容器引擎,讓開發者可以將應用及其依賴打包到一個可移植的容器中,然后發布到任何流行的Linux或Windows操作系統的機器上。Docker使用沙箱機制,相互隔離,不會互相影響。

“Build once, run anywhere”(構建一次,到處運行)是Docker的核心理念,它徹底改變了我們部署和運行應用的方式。

Docker的核心組件

Docker的架構主要包含以下幾個核心組件:

  1. Docker引擎:Docker的核心部分,負責創建和管理Docker容器。
  2. Docker鏡像:Docker容器的模板,包含了運行應用所需的所有內容。
  3. Docker容器:由Docker鏡像創建的運行實例。
  4. Docker倉庫:存儲和分發Docker鏡像的地方,如Docker Hub。

下面是Docker架構的可視化表示:

Docker Registry
Docker Host
Docker Client
REST API
pull/push
Docker Hub
私有倉庫
Docker Daemon
dockerd
Images
鏡像
Containers
容器
Networks
網絡
Volumes
數據卷
Docker CLI
docker build
docker pull
docker run

圖1:Docker架構圖 - 展示了Docker Client、Docker Host和Docker Registry之間的關系和交互方式

Docker vs 虛擬機

Docker容器和傳統虛擬機有著本質的區別,下表對比了兩者的主要特點:

特性Docker容器虛擬機
啟動時間秒級分鐘級
占用磁盤空間MB級GB級
性能接近原生有所損耗
隔離級別進程級隔離完全隔離
操作系統共享宿主機OS需要完整OS
可移植性非常高較低

Docker安裝與配置

在不同的操作系統上安裝Docker的方法略有不同,這里我主要介紹在Windows和Linux上的安裝方法。

Windows上安裝Docker

在Windows上,我們可以安裝Docker Desktop,它包含了Docker引擎、Docker CLI客戶端、Docker Compose等組件。

  1. 首先,確保你的Windows系統滿足以下要求:

    • Windows 10 64位:專業版、企業版或教育版(Build 16299或更高版本)
    • 啟用Hyper-V和容器功能
  2. 從Docker官網下載Docker Desktop安裝程序

  3. 運行安裝程序,按照向導完成安裝

  4. 安裝完成后,Docker會自動啟動,你可以在系統托盤看到Docker圖標

Linux上安裝Docker

在CentOS上安裝Docker的步驟如下:

# 安裝必要的依賴
sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加Docker倉庫
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安裝Docker引擎
sudo yum install -y docker-ce docker-ce-cli containerd.io# 啟動Docker服務
sudo systemctl start docker# 設置Docker開機自啟
sudo systemctl enable docker# 驗證Docker是否安裝成功
sudo docker run hello-world

驗證安裝

安裝完成后,可以通過運行以下命令來驗證Docker是否正確安裝:

# 查看Docker版本
docker --version# 運行hello-world容器
docker run hello-world

如果一切正常,你應該能看到Docker版本信息和hello-world容器的歡迎消息。

Docker基本命令

掌握Docker的基本命令是入門的關鍵,下面我將介紹一些最常用的Docker命令。

鏡像管理命令

# 搜索鏡像
docker search nginx# 拉取鏡像
docker pull nginx:latest# 列出本地鏡像
docker images# 刪除鏡像
docker rmi nginx:latest# 構建鏡像
docker build -t myapp:1.0 .

容器管理命令

# 創建并啟動容器
docker run -d -p 80:80 --name webserver nginx# 列出運行中的容器
docker ps# 列出所有容器(包括已停止的)
docker ps -a# 停止容器
docker stop webserver# 啟動容器
docker start webserver# 重啟容器
docker restart webserver# 刪除容器
docker rm webserver# 查看容器日志
docker logs webserver# 進入容器內部
docker exec -it webserver bash

這些命令的執行流程可以用下面的時序圖來表示:

用戶Docker CLIDocker守護進程Docker倉庫容器docker pull nginx請求拉取鏡像從倉庫拉取鏡像返回鏡像數據拉取完成顯示結果docker run nginx請求創建并運行容器創建容器啟動容器容器運行狀態容器已啟動顯示容器IDdocker exec -it nginx bash請求在容器中執行命令在容器中執行bash命令執行結果返回交互式shell提供容器內shell訪問docker stop nginx請求停止容器停止容器容器已停止停止成功顯示結果用戶Docker CLIDocker守護進程Docker倉庫容器

圖2:Docker命令執行時序圖 - 展示了用戶、Docker CLI、守護進程和容器之間的交互過程

Dockerfile詳解

Dockerfile是用來構建Docker鏡像的文本文件,包含了一系列指令和參數,用于自動化地創建Docker鏡像。

Dockerfile基本結構

一個典型的Dockerfile包含以下部分:

  1. 基礎鏡像(FROM)
  2. 維護者信息(MAINTAINER,已棄用,推薦使用LABEL)
  3. 鏡像操作指令(RUN, COPY, ADD等)
  4. 容器啟動指令(CMD, ENTRYPOINT)

Dockerfile常用指令

下面是一個簡單的Dockerfile示例,用于構建一個基于Node.js的Web應用:

# 使用官方Node.js鏡像作為基礎鏡像
FROM node:14-alpine# 設置工作目錄
WORKDIR /app# 復制package.json和package-lock.json
COPY package*.json ./# 安裝依賴
RUN npm install# 復制應用代碼
COPY . .# 暴露端口
EXPOSE 3000# 設置環境變量
ENV NODE_ENV=production# 定義容器啟動命令
CMD ["npm", "start"]

這個Dockerfile的執行流程如下:

  1. 從Docker Hub拉取node:14-alpine鏡像
  2. 設置容器內的工作目錄為/app
  3. 復制package.json和package-lock.json到工作目錄
  4. 安裝Node.js依賴
  5. 復制所有應用代碼到工作目錄
  6. 聲明容器將監聽3000端口
  7. 設置NODE_ENV環境變量為production
  8. 設置容器啟動時執行的命令為npm start

構建和運行Docker鏡像

使用上面的Dockerfile構建鏡像并運行容器的命令如下:

# 構建鏡像
docker build -t myapp:1.0 .# 運行容器
docker run -d -p 3000:3000 --name myapp-container myapp:1.0

Docker Compose入門

Docker Compose是一個用于定義和運行多容器Docker應用的工具,使用YAML文件來配置應用的服務。

Docker Compose基本概念

Docker Compose通過一個docker-compose.yml文件定義多個相互關聯的服務,使它們可以一起啟動和關閉。這對于開發、測試和部署復雜的多容器應用非常有用。

docker-compose.yml文件示例

下面是一個簡單的docker-compose.yml文件,定義了一個包含Web應用和數據庫的應用:

version: '3'
services:web:build: .ports:- "3000:3000"depends_on:- dbenvironment:- DATABASE_URL=postgres://postgres:password@db:5432/mydbvolumes:- ./:/app- /app/node_modulesrestart: alwaysdb:image: postgres:13ports:- "5432:5432"environment:- POSTGRES_USER=postgres- POSTGRES_PASSWORD=password- POSTGRES_DB=mydbvolumes:- postgres_data:/var/lib/postgresql/datavolumes:postgres_data:

Docker Compose常用命令

# 啟動所有服務
docker-compose up -d# 查看服務狀態
docker-compose ps# 查看服務日志
docker-compose logs# 停止所有服務
docker-compose down# 重新構建服務
docker-compose build

Docker Compose的服務關系可以用下面的架構圖來表示:

Docker Compose 應用
depends_on
持久化數據
Web服務
端口: 3000
數據庫服務
PostgreSQL
數據卷
postgres_data

圖3:Docker Compose架構圖 - 展示了docker-compose.yml中定義的服務之間的關系

Docker實戰:部署一個全棧博客系統

現在,讓我們通過一個更復雜的實際例子來應用我們學到的知識,部署一個包含前端、后端API和數據庫的完整博客系統。

項目架構概覽

我們將構建一個包含以下組件的博客系統:

  • 前端:React應用,提供用戶界面
  • 后端API:Node.js + Express,提供RESTful API
  • 數據庫:MongoDB,存儲博客數據
  • 反向代理:Nginx,負載均衡和靜態文件服務

后端API服務

首先創建后端API服務的文件:

backend/package.json:

{"name": "blog-api","version": "1.0.0","description": "Blog API with MongoDB","main": "server.js","scripts": {"start": "node server.js","dev": "nodemon server.js"},"dependencies": {"express": "^4.18.2","mongoose": "^7.0.3","cors": "^2.8.5","dotenv": "^16.0.3"}
}

backend/server.js:

const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
require('dotenv').config();const app = express();
const PORT = process.env.PORT || 5000;// 中間件
app.use(cors());
app.use(express.json());// MongoDB連接
mongoose.connect(process.env.MONGODB_URI || 'mongodb://mongo:27017/blogdb', {useNewUrlParser: true,useUnifiedTopology: true,
});// 博客文章模型
const PostSchema = new mongoose.Schema({title: { type: String, required: true },content: { type: String, required: true },author: { type: String, required: true },createdAt: { type: Date, default: Date.now }
});const Post = mongoose.model('Post', PostSchema);// API路由
app.get('/api/posts', async (req, res) => {try {const posts = await Post.find().sort({ createdAt: -1 });res.json(posts);} catch (error) {res.status(500).json({ message: error.message });}
});app.post('/api/posts', async (req, res) => {try {const post = new Post(req.body);const savedPost = await post.save();res.status(201).json(savedPost);} catch (error) {res.status(400).json({ message: error.message });}
});app.get('/api/posts/:id', async (req, res) => {try {const post = await Post.findById(req.params.id);if (!post) return res.status(404).json({ message: 'Post not found' });res.json(post);} catch (error) {res.status(500).json({ message: error.message });}
});app.listen(PORT, () => {console.log(`Server running on port ${PORT}`);
});

backend/Dockerfile:

FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 5000
CMD ["npm", "start"]

前端React應用

frontend/package.json:

{"name": "blog-frontend","version": "1.0.0","private": true,"dependencies": {"react": "^18.2.0","react-dom": "^18.2.0","axios": "^1.3.4","react-scripts": "5.0.1"},"scripts": {"start": "react-scripts start","build": "react-scripts build","test": "react-scripts test","eject": "react-scripts eject"},"browserslist": {"production": [">0.2%", "not dead", "not op_mini all"],"development": ["last 1 chrome version", "last 1 firefox version", "last 1 safari version"]}
}

frontend/src/App.js:

import React, { useState, useEffect } from 'react';
import axios from 'axios';
import './App.css';const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:5000/api';function App() {const [posts, setPosts] = useState([]);const [newPost, setNewPost] = useState({ title: '', content: '', author: '' });const [loading, setLoading] = useState(true);useEffect(() => {fetchPosts();}, []);const fetchPosts = async () => {try {const response = await axios.get(`${API_URL}/posts`);setPosts(response.data);setLoading(false);} catch (error) {console.error('Error fetching posts:', error);setLoading(false);}};const handleSubmit = async (e) => {e.preventDefault();try {await axios.post(`${API_URL}/posts`, newPost);setNewPost({ title: '', content: '', author: '' });fetchPosts();} catch (error) {console.error('Error creating post:', error);}};if (loading) return <div className="loading">Loading...</div>;return (<div className="App"><header className="App-header"><h1>🚀 Docker博客系統</h1></header><main className="container"><section className="create-post"><h2>創建新文章</h2><form onSubmit={handleSubmit}><inputtype="text"placeholder="文章標題"value={newPost.title}onChange={(e) => setNewPost({...newPost, title: e.target.value})}required/><inputtype="text"placeholder="作者"value={newPost.author}onChange={(e) => setNewPost({...newPost, author: e.target.value})}required/><textareaplaceholder="文章內容"value={newPost.content}onChange={(e) => setNewPost({...newPost, content: e.target.value})}required/><button type="submit">發布文章</button></form></section><section className="posts"><h2>最新文章</h2>{posts.length === 0 ? (<p>暫無文章,快來發布第一篇吧!</p>) : (posts.map(post => (<article key={post._id} className="post"><h3>{post.title}</h3><p className="meta">作者:{post.author} | 發布時間:{new Date(post.createdAt).toLocaleString()}</p><p className="content">{post.content}</p></article>)))}</section></main></div>);
}export default App;

frontend/Dockerfile:

# 構建階段
FROM node:16-alpine as build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build# 生產階段
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Nginx配置

frontend/nginx.conf:

events {worker_connections 1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;server {listen 80;server_name localhost;location / {root /usr/share/nginx/html;index index.html index.htm;try_files $uri $uri/ /index.html;}location /api/ {proxy_pass http://backend:5000/api/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
}

Docker Compose配置

docker-compose.yml:

version: '3.8'services:# MongoDB數據庫mongo:image: mongo:5.0container_name: blog-mongorestart: alwaysports:- "27017:27017"volumes:- mongo_data:/data/dbenvironment:MONGO_INITDB_DATABASE: blogdb# 后端API服務backend:build: ./backendcontainer_name: blog-backendrestart: alwaysports:- "5000:5000"depends_on:- mongoenvironment:- MONGODB_URI=mongodb://mongo:27017/blogdb- PORT=5000volumes:- ./backend:/app- /app/node_modules# 前端React應用frontend:build: ./frontendcontainer_name: blog-frontendrestart: alwaysports:- "80:80"depends_on:- backendenvironment:- REACT_APP_API_URL=http://localhost/apivolumes:mongo_data:networks:default:name: blog-network

部署和運行

創建項目目錄結構并添加CSS樣式:

frontend/src/App.css:

.App {text-align: center;max-width: 1200px;margin: 0 auto;padding: 20px;
}.App-header {background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);padding: 40px;color: white;border-radius: 10px;margin-bottom: 30px;
}.container {display: grid;grid-template-columns: 1fr 2fr;gap: 30px;align-items: start;
}.create-post {background: #f8f9fa;padding: 25px;border-radius: 10px;box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}.create-post form {display: flex;flex-direction: column;gap: 15px;
}.create-post input,
.create-post textarea {padding: 12px;border: 1px solid #ddd;border-radius: 5px;font-size: 16px;
}.create-post textarea {min-height: 120px;resize: vertical;
}.create-post button {background: #667eea;color: white;border: none;padding: 12px 24px;border-radius: 5px;cursor: pointer;font-size: 16px;transition: background 0.3s;
}.create-post button:hover {background: #5a6fd8;
}.posts {text-align: left;
}.post {background: white;padding: 25px;margin-bottom: 20px;border-radius: 10px;box-shadow: 0 2px 10px rgba(0,0,0,0.1);border-left: 4px solid #667eea;
}.post h3 {color: #333;margin-bottom: 10px;
}.post .meta {color: #666;font-size: 14px;margin-bottom: 15px;
}.post .content {line-height: 1.6;color: #444;
}.loading {font-size: 18px;color: #667eea;margin: 50px 0;
}@media (max-width: 768px) {.container {grid-template-columns: 1fr;}
}

啟動完整應用

# 在項目根目錄下運行
docker-compose up -d# 查看服務狀態
docker-compose ps# 查看日志
docker-compose logs -f

現在你可以訪問 http://localhost 來查看完整的博客系統!

應用特點

這個實戰項目展示了:

  1. 多服務架構:前端、后端、數據庫分離
  2. 數據持久化:MongoDB數據卷持久化
  3. 反向代理:Nginx處理靜態文件和API代理
  4. 多階段構建:前端使用多階段構建優化鏡像大小
  5. 服務依賴:合理配置服務啟動順序
  6. 環境變量:靈活的配置管理

Docker最佳實踐

在使用Docker的過程中,遵循一些最佳實踐可以幫助你更高效地使用Docker,并避免一些常見的陷阱。

鏡像構建最佳實踐

  1. 使用官方鏡像作為基礎:官方鏡像通常更安全、更穩定,并且有良好的文檔支持。
  2. 使用特定版本標簽:避免使用latest標簽,而是使用特定的版本標簽,以確保構建的一致性。
  3. 最小化鏡像大小:使用多階段構建、Alpine基礎鏡像,并清理不必要的文件。
  4. 合理組織Dockerfile指令:將不經常變化的指令放在前面,經常變化的放在后面,以利用Docker的緩存機制。

容器運行最佳實踐

  1. 一個容器一個關注點:每個容器應該只運行一個應用或進程。
  2. 使用卷進行持久化存儲:對于需要持久化的數據,使用Docker卷而不是在容器內存儲。
  3. 設置資源限制:為容器設置CPU和內存限制,防止單個容器消耗過多資源。
  4. 使用健康檢查:在Dockerfile中添加HEALTHCHECK指令,或在docker-compose.yml中添加healthcheck配置。

安全最佳實踐

  1. 使用非root用戶運行容器:在Dockerfile中使用USER指令切換到非root用戶。
  2. 掃描鏡像中的漏洞:使用工具如Docker Scan、Clair或Trivy掃描鏡像中的安全漏洞。
  3. 不要在鏡像中存儲敏感信息:使用環境變量、Docker secrets或配置管理工具來管理敏感信息。
  4. 保持基礎鏡像和依賴更新:定期更新基礎鏡像和應用依賴,以修復安全漏洞。

Docker生態系統

Docker的生態系統非常豐富,包括許多工具和平臺,可以幫助你更好地使用Docker。

常用Docker工具

  1. Docker Compose:用于定義和運行多容器Docker應用。
  2. Docker Swarm:Docker的原生集群管理工具。
  3. Kubernetes:容器編排平臺,可以管理跨多個主機的容器化應用。
  4. Portainer:Docker的可視化管理工具,提供了友好的Web界面。
  5. Docker Hub:Docker官方的鏡像倉庫,可以存儲和分享Docker鏡像。

Docker使用趨勢

Docker的使用在各個行業都呈現出增長趨勢,下面是一個簡單的趨勢圖:

Docker發展歷程
2013-2015
起步期
5%-25%
2016-2018
成長期
38%-58%
2019-2021
成熟期
65%-78%
2022-2023
普及期
83%-87%
開源發布
社區關注
企業采用
生態完善
云原生
標準化
行業標準
廣泛應用

圖4:Docker采用率增長圖 - 展示了從2013年到2023年Docker的采用率增長趨勢

容器化技術的未來

容器化技術的發展方向主要包括:

  1. 無服務器容器:如AWS Fargate、Azure Container Instances等,無需管理底層基礎設施。
  2. WebAssembly:作為容器的替代方案,提供更輕量級的隔離環境。
  3. 邊緣計算:將容器化應用部署到邊緣設備上,如IoT設備。
  4. AI/ML工作負載:使用容器來標準化和簡化AI/ML工作負載的部署。

Docker容器與虛擬機的對比:

Docker容器架構
虛擬機架構
物理硬件
宿主操作系統
Docker Engine
Container A
App A + Libs
Container B
App B + Libs
Container C
App C + Libs
物理硬件
宿主操作系統
虛擬機監控器
Hypervisor
Guest OS 1
Guest OS 2
Guest OS 3
App A
App B
App C

圖5:Docker容器與虛擬機對比圖 - 展示了容器化技術與傳統虛擬化技術的架構差異

總結與展望

在這篇Docker入門教程中,我們從Docker的基本概念開始,介紹了Docker的安裝配置、基本命令、Dockerfile的編寫、Docker Compose的使用,以及一些最佳實踐。通過這些內容,你應該已經對Docker有了一個全面的了解,并且能夠開始在自己的項目中使用Docker。

作為一名剛剛開始在CSDN上分享技術內容的博主,我深知學習新技術的過程中會遇到各種挑戰。在我學習Docker的過程中,也曾遇到過各種問題,比如鏡像構建失敗、容器無法啟動、網絡配置錯誤等。但正是這些問題和解決問題的過程,讓我對Docker有了更深入的理解。

Docker作為一種容器化技術,已經成為現代軟件開發和部署的標準工具之一。它不僅簡化了開發環境的配置,還提高了應用部署的一致性和可靠性。隨著微服務架構和云原生應用的普及,Docker的重要性將會越來越高。

在未來的文章中,我計劃深入探討Docker的高級主題,如Docker網絡、Docker安全、多階段構建、Docker與CI/CD的集成等。我也會分享一些實際項目中使用Docker的經驗和教訓,幫助大家更好地理解和應用Docker。

學習是一個持續的過程,技術也在不斷發展。希望這篇文章能夠幫助你邁出學習Docker的第一步,為你的技術之路增添一份助力。如果你有任何問題或建議,歡迎在評論區留言,我會盡力回答和改進。

讓我們一起在容器化的世界中探索和成長!

🌟 我是 勵志成為糕手 ,感謝你與我共度這段技術時光!
? 如果這篇文章為你帶來了啟發:
? 【收藏】關鍵知識點,打造你的技術武器庫
💡【評論】留下思考軌跡,與同行者碰撞智慧火花
🚀 【關注】持續獲取前沿技術解析與實戰干貨
🌌 技術探索永無止境,讓我們繼續在代碼的宇宙中:
? 用優雅的算法繪制星圖
? 以嚴謹的邏輯搭建橋梁
? 讓創新的思維照亮前路
📡 保持連接,我們下次太空見!

參考鏈接

  1. Docker官方文檔
  2. Docker Hub
  3. Docker Compose文檔
  4. Docker最佳實踐指南
  5. Docker安全最佳實踐

關鍵詞標簽

#Docker #容器化 #DevOps #微服務 #云原生

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93461.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93461.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93461.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【SLAM】不同相機模型及其常見的鏈式求導推導

【SLAM】不同相機模型及其常見的鏈式求導推導1. 魚眼相機模型鏈式求導1. 魚眼相機畸變模型2. 雅可比矩陣的推導畸變坐標相對于歸一化坐標的雅可比矩陣 Hdz/dznH_{dz/dzn}Hdz/dzn?畸變坐標相對于相機內參的雅可比矩陣 Hdz/dzetaH_{dz/dzeta}Hdz/dzeta?3. 注意4. 輸入輸出含義5…

【人工智能】本地部署 KTransformers并加載大模型筆記

博主未授權任何人或組織機構轉載博主任何原創文章&#xff0c;感謝各位對原創的支持&#xff01; 博主鏈接 本人就職于國際知名終端廠商&#xff0c;負責modem芯片研發。 在5G早期負責終端數據業務層、核心網相關的開發工作&#xff0c;目前牽頭6G技術研究。 博客內容主要圍繞…

TDengine IDMP 高級功能(3. 概念解釋)

枚舉集 為提升數據的可閱讀性&#xff0c;IDMP 為數據提供枚舉類型。您可以將一些整型數定義為一具有可讀性的字符串。與其他軟件一樣&#xff0c;您可以定義多個枚舉集&#xff0c;每個枚舉集可以有多個枚舉量。您可以增加、刪除、修改、查詢枚舉集與枚舉量。 但獨特的是&am…

CUDA 入門教程(GPT優化版)

學習路徑 一、環境準備與快速入門 搭建開發環境 ○ 安裝 CUDA Toolkit,適用于 Windows(如 Visual Studio)或 Linux,確保你的設備為 NVIDIA GPU 并支持 CUDA。(wholetomato.com) ○ 如果你偏好輕量工具,也可用 VS Code + Nsight 開發環境進行 CUDA 編程。(wholetomato.com)…

react項目性能優化的hook

前言&#xff1a;在項目中開發中&#xff0c;性能優化是很重要的&#xff0c;react有提供專門的hook&#xff0c;useMemo 和useCallback 這里說一說他們。區別&#xff1a;特性useMemouseCallback返回值緩存一個 值&#xff08;計算結果&#xff09;緩存一個 函數依賴變化時重新…

Docker(springcloud筆記第三期)

p.s.這是萌新自己自學總結的筆記&#xff0c;如果想學習得更透徹的話還是請去看大佬的講解 目錄鏡像與容器一些命令與鏡像命名規范數據卷自定義鏡像Dockerfile鏡像與容器 當我們利用Docker安裝應用時&#xff0c;Docker會自動搜索并下載應用鏡像(image),鏡像不僅包含應用本身&…

MySQL定時任務詳解 - Event Scheduler 事件調度器從基礎到實戰

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有堅忍不拔之志 &#x1f390; 個人CSND主頁——Micro麥可樂的博客 &#x1f425;《Docker實操教程》專欄以最新的Centos版本為基礎進行Docker實操教程&#xff0c;入門到實戰 &#x1f33a;《RabbitMQ》…

redis存儲原理與對象模型

redis中的不同線程 redis單線程是指什么&#xff1f; redis的所有命令處理都在同一個線程中完成 redis為什么采用單線程&#xff1f; redis中存在多種數據結構存儲value&#xff0c;如果采用多線程&#xff0c;加鎖會很復雜、加鎖力度不阿紅控制&#xff0c;同時&#xff0c…

基于微信小程序的家教服務平臺的設計與實現/基于asp.net/c#的家教服務平臺/基于asp.net/c#的家教管理系統

基于微信小程序的家教服務平臺的設計與實現/基于asp.net/c#的家教服務平臺/基于asp.net/c#的家教管理系統

安全審計-iptales防火墻設置

文章目錄一、iptales防火墻設置1.ip規則設置2.ip端口規則設置3.刪除規則4.INPUT默認設置5.ping、本地訪問規則6.保存還原規則7.查看清除規則一、iptales防火墻設置 1.ip規則設置 #允許ip訪問本服務器 iptables -I INPUT -s 192.168.205.129 -p tcp -j ACCEPT#允許某IP或某網段…

Linux小白加油站,第二周

1.grep命令中哪個選項可以忽略大小寫進行搜索?grep -i 2.如何用grep命令查找包含”error關鍵字的日志文件并返回文件名?grep -lr3.解釋grep命令中^f...d$這個表達式的含義^f&#xff1a;以f開頭..&#xff1a;任意兩個字符d$&#xff1a;以d結尾4.如何過濾掉文件中的注釋行以…

【前端基礎】19、CSS的flex布局

一、FlexBox概念 FlexBox翻譯為彈性盒子。 彈性盒子是一種用于按行或按列布局元素的一維布局方式。元素可以膨脹以填充額外的空間&#xff0c;收縮以適應更小的空間。我們使用FlexBox來進行布局的方案稱為flex布局。二、flex布局的重要概念 兩個重要的概念 開啟flex布局的元素叫…

Effective C++ 條款46:需要類型轉換時請為模板定義非成員函數

Effective C 條款46&#xff1a;需要類型轉換時請為模板定義非成員函數核心思想&#xff1a;當模板類需要支持隱式類型轉換時&#xff0c;應將非成員函數聲明為友元并定義在類內部&#xff08;或通過輔助函數實現&#xff09;&#xff0c;以繞過模板參數推導的限制&#xff0c;…

用Python對機器學習數據進行縮放

許多機器學習算法期望數據被一致地縮放。 在為機器學習擴展數據時&#xff0c;你應該考慮兩種常用的方法。 在這個教程中&#xff0c;您將了解如何為機器學習重新縮放您的數據。閱讀完這個教程后&#xff0c;您將知道&#xff1a; 如何從頭開始對您的數據進行標準化。如何從…

Application-properties 配置大全

SpringBoot - application.properties 配置大全 SpringBoot項目最重要也是最核心的配置文件就是application.properties&#xff0c;所有的框架配置都需要在這個配置文件中說明&#xff0c;以下配置不會的可以進行查閱并修改 &#xff03;SPRING CONFIG&#xff08;ConfigFileA…

MXFP4量化:如何在80GB GPU上運行1200億參數的GPT-OSS模型

大型語言模型&#xff08;Large Language Models, LLMs&#xff09;如GPT-OSS、GPT-4、LLaMA和Mixtral的快速發展顯著提升了人工智能的能力邊界&#xff0c;但同時也帶來了嚴峻的內存資源挑戰。以1200億參數的模型為例&#xff0c;在FP16精度下僅權重存儲就需要約240GB的內存空…

Unity進階--C#補充知識點--【Unity跨平臺的原理】了解.Net

來源于唐老獅的視頻教學&#xff0c;僅作記錄和感悟記錄&#xff0c;方便日后復習或者查找一.什么是.Net.Net是指微軟一整套技術體系的統稱與代號包含的內容有&#xff1a;框架體系&#xff1a;.Net Frameword&#xff0c; .Net Core&#xff0c; Mono開發語言&#xff1a;C#&a…

論文淺嘗 | 提高大型語言模型的數學推理能力的學習定理基本原理(AAAI2025)

筆記整理&#xff1a;蘭雅榕&#xff0c;浙江大學碩士生&#xff0c;研究方向為知識圖譜、大語言模型論文鏈接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/33662發表會議&#xff1a;AAAI 20251. 動機提高開源大型語言模型&#xff08;LLM&#xff09;的數學…

母豬姿態轉換行為識別:計算機視覺與行為識別模型調優指南

母豬姿態轉換行為識別&#xff1a;計算機視覺與行為識別模型調優指南 1. 引言 1.1 研究背景與意義 母豬姿態轉換行為識別是智能養殖領域的重要研究方向&#xff0c;通過計算機視覺技術自動識別母豬的站立、躺臥、行走等姿態變化&#xff0c;對于監測母豬健康狀態、評估福利水平…

K8S集群環境搭建(一)

虛擬機鏡像 ubuntu 24 虛擬機網絡 虛擬網絡–配置 nat模式主機ip配置宿主機ip配置 10.0.0.12 master 2c 10.0.0.15 node1 10.0.0.16 node2 10.0.0.17 node3 10.0.0.20 registersudo vi /etc/netplan/00-installer-config.yaml # 替換為實際文件名 sudo netplan applynetwork:v…