【开发工具】Docker常用操作

Docker常用操作

目录

文章目录

Docker容器管理

Docker 容器是 Docker 的核心,它将应用及其所有依赖包打包到一个标准化的单元中,能够在任何地方快速运行。在本节中,我们将介绍如何管理容器。

创建并启动容器

  1. 使用 docker run 命令启动一个新的容器,并指定镜像。这里我们以启动一个 Ubuntu 容器为例:

    bash 复制代码
    docker run -it ubuntu bash

这会拉取 Ubuntu 镜像并启动一个容器,进入到容器内的 bash 命令行环境。

查看运行中的容器

要查看当前运行的容器,可以使用:

bash 复制代码
docker ps

该命令会列出所有正在运行的容器及其相关信息,如容器ID、镜像名称、运行时间等。

停止容器

停止运行中的容器,使用:

bash 复制代码
docker stop <容器ID或容器名称>

错误示例

如果尝试启动一个不存在的镜像,会出现如下错误:

bash 复制代码
docker run -it nonexistent_image bash

错误提示:Unable to find image 'nonexistent_image' locally

调试技巧:在启动之前,使用 docker images 命令查看是否存在该镜像,或者使用 docker pull <镜像名> 拉取镜像。

Docker镜像管理

镜像是容器的基础,Docker 镜像包含了操作系统、软件包、应用程序等必要的文件和配置。

拉取镜像

使用 docker pull 命令从 Docker Hub 下载镜像:

bash 复制代码
docker pull nginx

查看本地镜像

列出本地所有的 Docker 镜像:

bash 复制代码
docker images

删除镜像

如果不再需要某个镜像,可以使用 docker rmi 删除:

bash 复制代码
docker rmi <镜像ID或镜像名称>

错误示例

如果删除正在使用的镜像,Docker 会报错:

bash 复制代码
docker rmi nginx

错误提示:Error response from daemon: conflict: unable to delete...

调试技巧:使用 docker ps -a 查看是否有正在使用该镜像的容器,停止或删除容器后再删除镜像。

Docker网络与数据管理

Docker 提供了多种方式来配置容器的网络和数据存储。你可以使用不同类型的网络和挂载数据卷来提升容器之间的通信和数据持久化。

创建自定义网络

使用以下命令创建一个自定义的 Docker 网络:

bash 复制代码
docker network create my_network

启动容器并连接到网络

将容器连接到自定义网络:

bash 复制代码
docker run --network my_network -it ubuntu bash

使用数据卷存储数据

Docker 数据卷(Volumes)用于持久化容器的数据。创建并挂载一个数据卷:

bash 复制代码
docker volume create my_volume
docker run -it -v my_volume:/data ubuntu

错误示例

尝试将容器连接到不存在的网络时,会报错:

bash 复制代码
docker run --network nonexistent_network -it ubuntu bash

错误提示:network nonexistent_network not found

调试技巧:使用 docker network ls 查看当前 Docker 环境中的网络,确保网络名称正确。

Docker Compose操作

Docker Compose 是一种用于定义和运行多容器 Docker 应用的工具。它允许用户通过配置文件管理多个容器的生命周期。

创建 docker-compose.yml 文件

在项目根目录下创建一个 docker-compose.yml 文件,定义多个服务:

yaml 复制代码
version: '3'
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example

启动服务

使用以下命令启动 Compose 定义的所有服务:

bash 复制代码
docker-compose up

停止服务

使用以下命令停止所有运行中的服务:

bash 复制代码
docker-compose down

错误示例

如果 docker-compose.yml 文件存在格式错误,启动时会报错:

bash 复制代码
docker-compose up

错误提示:ERROR: yaml.parser.ParserError: while parsing a block collection

调试技巧:检查 docker-compose.yml 文件的格式,使用在线 YAML 校验工具检查是否有语法错误。

高级使用技巧与调试

优化镜像大小

构建镜像时,可以使用多阶段构建(multi-stage build)来优化镜像的体积。例如,先在一个临时的镜像中安装构建工具,然后将最终应用复制到一个轻量级镜像中:

dockerfile 复制代码
# 第一阶段:构建阶段
FROM node:14 AS builder
WORKDIR /app
COPY . .
RUN npm install

# 第二阶段:运行阶段
FROM node:14-slim
WORKDIR /app
COPY --from=builder /app .
CMD ["node", "app.js"]

使用 Docker 容器日志进行调试

查看容器的标准输出和错误信息:

bash 复制代码
docker logs <容器ID或容器名称>

错误示例

如果容器因为某个原因退出,可以使用以下命令查看容器的日志信息:

bash 复制代码
docker logs <退出容器ID>

错误提示:No such container

调试技巧:确保容器ID正确,或者使用 docker ps -a 查看所有容器的状态。

实际项目案例

示例项目:搭建一个 Flask + MySQL 应用

  1. 创建项目目录结构

    plaintext 复制代码
    my_flask_app/
    ├── app.py
    ├── Dockerfile
    ├── requirements.txt
    └── docker-compose.yml
  2. 编写 app.py

    python 复制代码
    from flask import Flask
    import mysql.connector
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        db = mysql.connector.connect(host="mysql", user="root", password="example", database="test")
        cursor = db.cursor()
        cursor.execute("SELECT * FROM users")
        result = cursor.fetchall()
        return f"Users: {result}"
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0')
  3. 编写 Dockerfile

    dockerfile 复制代码
    FROM python:3.8-slim
    COPY requirements.txt /app/
    WORKDIR /app
    RUN pip install -r requirements.txt
    COPY . /app
    CMD ["python", "app.py"]
  4. 编写 docker-compose.yml

    yaml 复制代码
    version: '3'
    services:
      web:
        build: .
        ports:
          - "5000:5000"
      mysql:
        image: mysql
        environment:
          MYSQL_ROOT_PASSWORD: example
          MYSQL_DATABASE: test
  5. 启动服务

    bash 复制代码
    docker-compose up --build
  6. 访问应用 :在浏览器中访问 http://localhost:5000

AI创作声明

本文部分内容由 AI 辅助生成,并经人工整理与验证,仅供参考学习,欢迎指出错误与不足之处。

相关推荐
nxlifebao3572 小时前
自媒体整体效率提升怎么做?AI智能媒体助理自动化是关键
运维·自动化·媒体·ai内容创作·自动化工作流·自媒体效率提升·多平台分发
sun0077002 小时前
iptables 配置 3台设备 进行路由转发(不同网段)
运维·服务器
landyjzlai2 小时前
深入理解AMBA总线(14)AXI Ordering Model、非对齐访问
运维·服务器
lbb 小魔仙2 小时前
【Linux】Linux入门实战教程:文件系统与进程管理
linux·运维·服务器
ts9772 小时前
Nginx + Vue History 模式刷新 404 的完整排查与解决方案
运维·vue.js·nginx
HIT_Weston2 小时前
76、【Ubuntu】【Hugo】搭建私人博客:Hugo 版本更新
linux·运维·ubuntu
qq_353737542 小时前
服务器防止宕机
运维·服务器
摇滚侠2 小时前
VMvare 虚拟机 centOS 7 安装 Docker,Docker 安装 Kong Konga
docker·centos·kong
LucianaiB2 小时前
【基于昇腾平台的CodeLlama实践:从环境搭建到高效开发】
运维·人工智能·性能优化