🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

🐳 理解 Docker:容器化技术简介

📦 常见服务的 Docker 部署命令

🔧 部署基础服务:Nginx 和 MySQL 示例

1. 部署 Nginx Web 服务器

2. 部署 MySQL 数据库

🧩 使用 Docker Compose 编排多容器应用

💡 实用技巧与注意事项

⚠️ 常见问题 (FAQ)


img

使用 Docker 来搭建服务能有效解决环境一致性问题,并简化部署流程。下面我将为你介绍 Docker 的核心概念、基本服务部署方法,以及一些实用技巧。

🐳 理解 Docker:容器化技术简介

Docker 是一种容器化技术,允许你将应用程序及其所有依赖项(如库、配置文件等)打包到一个标准化的单元中,这个单元就称为​​容器​​。容器与宿主机共享操作系统内核,因此比传统虚拟机更加轻量、启动更快、资源占用更少。

  • ​镜像 (Image)​​:可以看作是一个​​只读的模板​​,里面包含了运行某个软件所需的所有内容。它用于创建容器。

  • ​容器 (Container)​​:是镜像的一个​​运行实例​​。你可以创建、启动、停止、移动或删除容器。容器之间相互隔离。

  • ​Dockerfile​​:一个文本文件,里面包含了一系列用于构建 Docker 镜像的指令。

  • ​Docker Compose​​:一个工具,用于通过一个 YAML 文件来定义和运行多个相互关联的容器。

📦 常见服务的 Docker 部署命令

下表汇总了部署常见服务时通常会用到的基础 Docker 命令,你可以快速了解每个服务部署的关键参数:

服务

基础镜像

部署命令 (示例)

关键参数说明

​Nginx​

nginx

docker run -d --name my-nginx -p 8080:80 nginx

-p 8080:80:将宿主机的 8080 端口映射到容器的 80 端口。

​MySQL​

mysql

docker run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v /host/data:/var/lib/mysql mysql

-e设置环境变量(密码);-v挂载数据卷实现持久化。

​Redis​

redis:alpine

docker run -d --name my-redis -p 6379:6379 redis:alpine

​Node.js​

需自定义构建

docker build -t my-node-app .docker run -d -p 3000:3000 my-node-app

需先编写 Dockerfile 构建镜像。


🔧 部署基础服务:Nginx 和 MySQL 示例

1. 部署 Nginx Web 服务器

Nginx 是一个流行的 Web 服务器和反向代理服务器。

  1. ​拉取镜像​​:

    docker pull nginx  # 拉取最新的官方Nginx镜像
  2. ​运行容器​​:

    docker run -d --name my-nginx -p 8080:80 nginx
    • -d:让容器在后台运行。

    • --name my-nginx:为容器取一个名字,方便后续管理。

    • -p 8080:80:将宿主机的 8080 端口映射到容器内的 80 端口(Nginx 默认端口)。访问 http://你的服务器IP:8080就能看到 Nginx 的欢迎页面。

2. 部署 MySQL 数据库

部署 MySQL 时,数据持久化和设置初始密码非常重要。

  1. ​拉取镜像​​:

    docker pull mysql
  2. ​运行容器​​:

    docker run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=your_password -p 3306:3306 -v /path/on/host:/var/lib/mysql mysql
    • -e MYSQL_ROOT_PASSWORD=your_password:设置 MySQL root 用户的密码(​​务必更改 your_password​)。

    • -p 3306:3306:端口映射,方便从宿主机或外部连接数据库。

    • -v /path/on/host:/var/lib/mysql:​​数据持久化关键!​​ 将宿主机的目录挂载到容器内 MySQL 的数据存储目录。这样即使容器被删除,数据也不会丢失。请将 /path/on/host替换为你服务器上的实际路径。


🧩 使用 Docker Compose 编排多容器应用

当你的应用需要多个服务(例如,一个 Web 应用同时需要 Web 服务器和数据库)时,使用 Docker Compose 可以轻松管理。只需编写一个 docker-compose.yml文件。

  1. ​创建 docker-compose.yml文件​​:

    version: '3'  # 指定Compose文件版本
    services:
      web:  # 定义Web服务
        image: nginx  # 使用Nginx镜像
        ports:
          - "8080:80"  # 端口映射
      db:   # 定义数据库服务
        image: mysql
        environment:
          MYSQL_ROOT_PASSWORD: example_password  # 设置数据库密码
        volumes:
          - mysql_data:/var/lib/mysql  # 使用命名卷进行数据持久化
    volumes:  # 声明卷
      mysql_data:  # 定义一个名为mysql_data的卷
  2. ​启动服务​​:

    在包含 docker-compose.yml文件的目录下,运行:

    docker-compose up -d  # -d表示后台运行

    这将按照文件定义,启动所有服务(这里指 webdb两个服务)。


💡 实用技巧与注意事项

  • ​使用非 root 用户运行容器​​:出于安全考虑,如果应用支持,尽量在容器内使用非 root 用户运行进程。

  • ​限制容器资源​​:为防止某个容器耗尽所有资源,可以使用 --memory--cpus参数限制容器能使用的最大内存和 CPU。

    docker run -d --name my-app --memory="512m" --cpus="1" my-app-image
  • ​选择合适的基础镜像​​:对于生产环境,通常推荐使用 ​​Alpine Linux​​ 基础的镜像,因为它们非常轻量(例如 node:alpine, python:alpine)。但需注意 Alpine 使用 musl libc,有时可能会遇到兼容性问题。如果追求极简且兼容性好,​​Slim 版本​​(如 python:slim)也是不错的选择。

  • ​镜像优化与多阶段构建​​:对于需要编译的应用(如 Go、Java),可以使用 ​​多阶段构建​​ 来减小最终镜像的大小。它允许你在一个 Dockerfile 中使用多个基础镜像,只将必要的文件和构件复制到最终的运行镜像中。

  • ​查看容器日志​​:

    docker logs [容器名或ID]  # 查看容器的日志输出,对排查问题非常有帮助

⚠️ 常见问题 (FAQ)

  1. ​"端口已占用"错误怎么办?​

    这意味着宿主机上你试图映射的端口(如 8080)已被其他程序使用。解决方法:要么停止正在使用该端口的程序,要么在 docker run-p参数中改为映射一个宿主机上未被占用的端口,例如 -p 8081:80

  2. ​如何进入正在运行的容器?​

    使用 docker exec命令:

    docker exec -it [容器名] /bin/bash  # 或 /bin/sh

    -it参数为你提供一个交互式的终端。

  3. ​如何让容器随 Docker 服务自动启动?​

    docker run中加入 --restart unless-stopped--restart always参数:

    docker run -d --name my-app --restart unless-stopped my-app-image

    这样,除非你手动停止容器,否则 Docker 服务重启时它会自动启动。

  4. ​如何删除不再需要的容器和镜像?​

    • ​删除已停止的容器​​:docker rm [容器名或ID]

    • ​强制删除运行中的容器​​:docker rm -f [容器名或ID]

    • ​删除镜像​​:docker rmi [镜像名或ID]

    • ​清理无用数据​​:docker system prune(​​注意​​:这会删除所有已停止的容器、未被使用的网络、构建缓存和悬空镜像,使用时请留意)


Docker 的世界很大,但掌握这些基础知识已足以让你顺利搭建起常见的基本服务。多动手实践是熟悉它的最好方式。如果你在搭建特定服务时遇到具体问题,我很乐意提供更进一步的帮助。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐