页面加载中
博客快捷键
按住 Shift 键查看可用快捷键
ShiftK
开启/关闭快捷键功能
ShiftA
打开/关闭中控台
ShiftD
深色/浅色显示模式
ShiftS
站内搜索
ShiftR
随机访问
ShiftH
返回首页
ShiftL
友链页面
ShiftP
关于本站
ShiftI
原版/本站右键菜单
松开 Shift 键或点击外部区域关闭
文章详情
互动
最近评论
暂无评论
标签
寻找感兴趣的领域
暂无标签
    0
    Docker 入门到实践:从安装、命令到 Compose 一键部署
    文章摘要
    本文讲解 Docker 安装、常用命令、存储网络、Compose 编排、Dockerfile 及常用中间件一键部署,适合初学者快速上手。
    Docker教程 封面
    Docker教程 封面

    本文内容覆盖安装、常用命令、存储、网络、Redis 主从、MySQL、Docker Compose、Dockerfile,以及一键安装常用中间件的思路。


    一、为什么需要 Docker?

    Docker 的核心价值可以用一句话概括:把应用和它的运行环境一起打包,做到“一次构建,到处运行”

    它常被用于:

    • 快速搭建开发、测试环境

    • 隔离不同应用依赖

    • 一键部署 MySQL、Redis、Nacos 等中间件

    • 配合 Docker Compose 管理多容器应用

    • 作为 CI/CD 和云原生应用的基础

    下面从安装开始,逐步进入 Docker 的常见用法。


    二、安装 Docker(Alibaba Cloud Linux 4)

    Alibaba Cloud Linux 4 兼容 RHEL 9 / EL9,默认包管理器为 dnf,yum 只是它的别名,两者命令可以互换。下面以 Alibaba Cloud Linux 4 为例,国内常见云平台还有腾讯云、华为云、青云等。

    1. 移除旧版本 Docker

    只卸载可能与新版本冲突的 Docker 软件包,不动镜像、容器和卷,数据是安全的:

    BASH
    sudo yum remove docker \
      docker-client \
      docker-client-latest \
      docker-common \
      docker-latest \
      docker-latest-logrotate \
      docker-logrotate \
      docker-engine

    提示某个包“未安装 / No match for argument”属于正常现象,忽略即可。如果之前装过较新的组件,也可以用同样温和的方式卸载,例如 sudo yum remove docker-ce docker-ce-cli containerd.io

    2. 配置 Docker Yum 源

    BASH
    # 安装依赖工具
    sudo dnf install -y dnf-plugins-core yum-utils wget
    ​
    # 添加 Docker CE 软件源
    # 阿里云 ECS 推荐使用内网源,免流量且速度更快:
    sudo wget -O /etc/yum.repos.d/docker-ce.repo \
      http://mirrors.cloud.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
    sudo sed -i 's|https://mirrors.aliyun.com|http://mirrors.cloud.aliyuncs.com|g' \
      /etc/yum.repos.d/docker-ce.repo
    ​
    # 公网环境则改用阿里云公网源(与上一段二选一):
    # sudo wget -O /etc/yum.repos.d/docker-ce.repo \
    #   https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    ​
    # 修正软件源版本号:Alibaba Cloud Linux 4 的 $releasever 为 4,
    # 而 Docker CE 没有对应的 4 目录,需替换为 9(兼容 EL9)
    sudo sed -i 's#$releasever#9#g' /etc/yum.repos.d/docker-ce.repo
    ​
    # 清除并重建缓存
    sudo yum clean all
    sudo yum makecache

    不执行 $releasever 替换,安装时会因为访问不存在的目录而报 404

    3. 安装最新版 Docker

    BASH
    sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

    这里连同 Buildx 和 Compose 插件一起安装,之后即可直接使用 docker compose 命令。

    4. 启动并设置开机自启

    BASH
    sudo systemctl enable docker --now

    5. 配置镜像加速

    BASH
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": [
        "https://docker.1ms.run",
        "https://docker.m.daocloud.io",
        "https://hub.rat.dev",
        "https://docker.1panel.live",
        "https://docker.xuanyuan.me"
      ]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker

    以上均为公共镜像源,Docker 会按顺序依次尝试;在阿里云 ECS 上还可在控制台“容器镜像服务 ACR → 镜像工具 → 镜像加速器”获取专属地址,并放到列表首位(内网免流量、速度最快)。公共镜像源会不定期变动,建议每季度复核一次。

    安装完成后,可以用 docker versiondocker info 检查是否正常。


    三、Docker 常用命令速查

    Docker 命令很多,但入门阶段先掌握“镜像”和“容器”两类即可。

    1. 容器查看与生命周期

    BASH
    # 查看运行中的容器
    docker ps
    ​
    # 查看所有容器
    docker ps -a
    ​
    # 停止容器
    docker stop <容器名或ID>
    ​
    # 启动容器
    docker start <容器名或ID>
    ​
    # 重启容器
    docker restart <容器名或ID>
    ​
    # 查看容器资源占用
    docker stats <容器名或ID>
    ​
    # 查看容器日志
    docker logs <容器名或ID>
    ​
    # 删除指定容器
    docker rm <容器名或ID>
    ​
    # 强制删除指定容器
    docker rm -f <容器名或ID>

    2. 镜像搜索、下载与查看

    BASH
    # 搜索镜像
    docker search nginx
    ​
    # 下载镜像
    docker pull nginx
    ​
    # 下载指定版本镜像
    docker pull nginx:1.30.4
    ​
    # 查看所有镜像
    docker images
    ​
    # 删除指定 ID 的镜像
    docker rmi e784f4560448
    ​
    # 删除多个镜像
    docker rmi bde7d154a67f 94543a6c1aef e784f4560448

    3. 运行容器

    BASH
    # 运行一个新容器
    docker run nginx
    ​
    # 后台启动容器
    docker run -d --name mynginx nginx
    ​
    # 后台启动并暴露端口
    docker run -d --name mynginx -p 80:80 nginx
    ​
    # 进入容器内部
    docker exec -it mynginx /bin/bash

    4. 提交、保存、加载与推送镜像

    BASH
    # 提交容器变化,打成一个新的镜像
    docker commit -m "update index.html" mynginx mynginx:v1.0
    
    # 保存镜像为指定文件
    docker save -o mynginx.tar mynginx:v1.0
    
    # 加载镜像
    docker load -i mynginx.tar
    
    # 登录 Docker Hub
    docker login
    
    # 重新给镜像打标签
    docker tag mynginx:v1.0 leifengyang/mynginx:v1.0
    
    # 推送镜像
    docker push leifengyang/mynginx:v1.0

    四、存储:目录挂载 vs 卷映射

    Docker 存储有两种常见方式,初学时要区分清楚:

    • 目录挂载:把宿主机目录挂载到容器内,例如 -v /app/nghtml:/usr/share/nginx/html

    • 卷映射:使用 Docker 管理的卷,例如 -v ngconf:/etc/nginx

    示例:

    BASH
    docker run -d -p 99:80 \
      -v /app/nghtml:/usr/share/nginx/html \
      -v ngconf:/etc/nginx \
      --name app03 \
      nginx

    简单理解:

    • 目录挂载适合你明确知道宿主机目录,方便直接修改文件。

    • 卷映射由 Docker 管理,适合持久化数据,迁移和备份更省心。


    五、网络:自定义网络与多容器通信

    Docker 默认网络下,容器之间可以通过 IP 通信,但 IP 不稳定。更好的方式是创建自定义网络,让容器通过容器名互相访问。

    BASH
    docker network create mynet

    1. Redis 主从同步集群

    主节点:

    BASH
    docker run -d -p 6379:6379 \
      -v /app/rd1:/data \
      --network mynet --name redis01 \
      redis:8.10 --requirepass 123456

    从节点:

    BASH
    docker run -d -p 6380:6379 \
      -v /app/rd2:/data \
      --network mynet --name redis02 \
      redis:8.10 --replicaof redis01 6379 --masterauth 123456 --requirepass 123456

    这里 redis02 通过 redis01 这个容器名连接主节点,这就是自定义网络的好处。

    补充:教程原本使用的 bitnami/redis 镜像,其免费公共仓库自 2025 年 8 月起已迁移、旧版本标签不再维护,因此这里改用官方 redis 镜像,通过命令行参数配置主从复制。

    2. 启动 MySQL

    BASH
    docker run -d -p 3306:3306 \
      -v /app/myconf:/etc/mysql/conf.d \
      -v /app/mydata:/var/lib/mysql \
      -e MYSQL_ROOT_PASSWORD=123456 \
      mysql:8.4

    生产环境中不要把密码设置得这么简单,也不要随意暴露到公网。


    六、Docker Compose:多容器编排

    当容器越来越多,一个个 docker run 会非常麻烦。Docker Compose 可以用一个 YAML 文件描述多个服务。

    1. 命令式安装 WordPress

    先创建网络:

    BASH
    docker network create blog

    启动 MySQL:

    BASH
    docker run -d -p 3306:3306 \
      -e MYSQL_ROOT_PASSWORD=123456 \
      -e MYSQL_DATABASE=wordpress \
      -v mysql-data:/var/lib/mysql \
      -v /app/myconf:/etc/mysql/conf.d \
      --restart always --name mysql \
      --network blog \
      mysql:8.4

    启动 WordPress:

    BASH
    docker run -d -p 8080:80 \
      -e WORDPRESS_DB_HOST=mysql \
      -e WORDPRESS_DB_USER=root \
      -e WORDPRESS_DB_PASSWORD=123456 \
      -e WORDPRESS_DB_NAME=wordpress \
      -v wordpress:/var/www/html \
      --restart always --name wordpress-app \
      --network blog \
      wordpress:latest

    2. 使用 compose.yaml

    同样的效果,用 Compose 写起来更清晰:

    BASH
    name: myblog
    services:
      mysql:
        container_name: mysql
        image: mysql:8.4
        ports:
          - "3306:3306"
        environment:
          - MYSQL_ROOT_PASSWORD=123456
          - MYSQL_DATABASE=wordpress
        volumes:
          - mysql-data:/var/lib/mysql
          - /app/myconf:/etc/mysql/conf.d
        restart: always
        networks:
          - blog
    
      wordpress:
        image: wordpress
        ports:
          - "8080:80"
        environment:
          WORDPRESS_DB_HOST: mysql
          WORDPRESS_DB_USER: root
          WORDPRESS_DB_PASSWORD: 123456
          WORDPRESS_DB_NAME: wordpress
        volumes:
          - wordpress:/var/www/html
        restart: always
        networks:
          - blog
        depends_on:
          - mysql
    
    volumes:
      mysql-data:
      wordpress:
    
    networks:
      blog:

    启动:

    BASH
    docker compose up -d

    停止并删除容器:

    BASH
    docker compose down

    3. Compose 的特性

    • 增量更新:修改 Compose 文件后重新启动,只会触发修改项的重启。

    • 数据不删:默认 down 容器时,挂载的卷不会被移除,数据比较安全。


    七、Dockerfile:把应用打包成镜像

    假设有一个 app.jar,可以这样写 Dockerfile:

    BASH
    FROM eclipse-temurin:21-jre
    LABEL author=leifengyang
    COPY app.jar /app.jar
    EXPOSE 8080
    ENTRYPOINT ["java","-jar","/app.jar"]

    构建镜像:

    BASH
    docker build -t myapp:1.0 .

    运行:

    BASH
    docker run -d -p 8080:8080 myapp:1.0

    Dockerfile 的核心思路是:选择基础镜像、复制文件、暴露端口、指定启动命令。


    八、附录:一键安装常用中间件

    如果经常需要搭建开发环境,可以用 Docker Compose 一键启动 Redis、MySQL、RabbitMQ、OpenSearch、Kafka、Nacos、Prometheus、Grafana 等中间件。

    1. 系统参数调整

    BASH
    # 关闭内存分页和交换,提升性能
    sudo swapoff -a
    
    # 编辑 sysctl 配置
    sudo vi /etc/sysctl.conf
    
    # 添加或修改
    vm.max_map_count=262144
    
    # 重新加载内核参数
    sudo sysctl -p
    
    # 验证
    cat /proc/sys/vm/max_map_count

    2. compose.yaml 注意事项

    准备一个 compose.yaml,其中如果包含 Kafka,需要把里面的服务器 IP 改成你自己的 IP,例如:

    BASH
    119.45.147.122:9094

    改成:

    BASH
    你的服务器IP:9094

    3. 启动

    compose.yaml 所在目录执行:

    BASH
    docker compose up -d

    如果重启了服务器,有些容器可能启动失败,再执行一遍:

    BASH
    docker compose up -d

    所有程序通常都能恢复运行,并且不会丢失数据。

    4. 常用组件访问表

    组件(容器名)

    介绍

    访问地址

    账号/密码

    特性

    Redis(redis)

    K-V 库

    你的IP:6379

    单密码:123456

    已开启 AOF

    MySQL(mysql)

    数据库

    你的IP:3306

    root/123456

    默认 utf8mb4

    Rabbit(rabbit)

    消息队列

    你的IP:15672

    rabbit/rabbit

    暴露 5672 和 15672

    OpenSearch(opensearch-node1/2)

    检索引擎

    你的IP:9200

    内存 512MB,两个节点

    opensearch-dashboards

    搜索可视化

    你的IP:5601

    Zookeeper(zookeeper)

    分布式协调

    你的IP:2181

    允许匿名登录

    kafka(kafka)

    消息队列

    你的IP:9092,外部:9094

    占用内存 512MB

    kafka-ui(kafka-ui)

    Kafka 可视化

    你的IP:8080

    nacos(nacos)

    注册/配置中心

    你的IP:8848

    nacos/nacos

    持久化到 MySQL

    nacos-mysql(nacos-mysql)

    Nacos 配套数据库

    你的IP:13306

    root/root

    prometheus(prometheus)

    时序数据库

    你的IP:9090

    grafana(grafana)

    可视化监控

    你的IP:3000

    admin/admin

    注意:以上默认密码仅适合本地学习,生产环境务必修改为强密码,并配置防火墙和安全组。


    九、总结

    Docker 入门可以按照这条路线学习:

    1. 安装 Docker:配置好镜像加速。

    2. 掌握常用命令:镜像、容器、日志、进入、提交、推送。

    3. 理解存储:目录挂载和卷映射。

    4. 理解网络:自定义网络让容器通过名字通信。

    5. 使用 Compose:用一个 YAML 管理多容器应用。

    6. 编写 Dockerfile:把自己的应用打包成镜像。

    7. 一键部署中间件:用 Compose 快速搭建开发环境。

    Docker 并不难,关键是多动手。先从一个 Nginx 容器开始,再尝试 MySQL、Redis,最后用 Compose 把多个服务串起来。练完这些,你就已经具备 Docker 的日常使用能力了。

    作者头像
    数阵
    数阵的博客网站
    本文是原创文章,采用 CC BY-NC-SA 4.0 协议,完整转载请注明来自 数阵
    评论

    请登录后发表评论

    滚动到此处加载评论...
    来自 数阵 最新设计与科技的文章
    查看全部
    随便逛逛
    博客分类
    文章标签
    复制地址
    深色模式