当前位置: 首页 > news >正文

docker 相关操作

1. 以下是一些常见的 Docker 命令:

docker --version

显示安装的 Docker 版本。

docker pull <image_name>

从 Docker Hub 或其他镜像仓库下载镜像。

docker build -t <image_name> <path>

从指定路径的 Dockerfile 构建 Docker 镜像。

docker images

列出本地所有的 Docker 镜像。

docker ps

列出所有正在运行的容器。

docker ps -a

列出所有容器(包括运行和停止的容器)。

docker run <image_name>

根据指定镜像运行一个容器。

docker run -d <image_name>

在后台(脱离模式)运行容器。

docker exec -it <container_id> <command>

在正在运行的容器中执行命令(如 bash 或 sh)。

docker stop <container_id>

停止正在运行的容器。

docker start <container_id>

启动已停止的容器。

docker restart <container_id>

重启容器。

docker rm <container_id>

删除已停止的容器。

docker rmi <image_name>

删除 Docker 镜像。

docker logs <container_id>

查看正在运行或已停止容器的日志。

docker-compose up

启动 docker-compose.yml 文件中定义的服务。

docker-compose down

停止并删除 docker-compose.yml 文件中定义的容器、网络和卷。

docker network ls

列出所有 Docker 网络。

docker volume ls

列出所有 Docker 卷。

docker info

显示 Docker 系统的全局信息。

2. 手动生成一个 Docker 镜像

要手动生成一个 Docker 镜像,你通常需要创建一个 Dockerfile,然后使用 Docker 命令来构建镜像。下面是整个过程的步骤:

1. 创建 Dockerfile

首先,你需要创建一个 Dockerfile 文件,定义镜像的构建过程。Dockerfile 是一组指令,告诉 Docker 如何构建镜像。

示例 Dockerfile

以下是一个简单的 Dockerfile 示例,用于创建一个包含 Python 环境的镜像:

# 使用官方的 Python 作为基础镜像
FROM python:3.8-slim# 设置工作目录
WORKDIR /app# 将本地代码复制到容器中
COPY . /app# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt# 设置容器启动时执行的命令
CMD ["python", "app.py"]
  • FROM: 定义基础镜像,这里使用的是 Python 3.8 版本的官方镜像。
  • WORKDIR: 设置容器内的工作目录,所有后续命令都会在此目录下运行。
  • COPY: 将本地文件(如源代码)复制到容器内。
  • RUN: 在容器内执行命令,这里用于安装 Python 依赖。
  • CMD: 设置容器启动时执行的命令。

2. 构建镜像

一旦你有了 Dockerfile,你就可以用 docker build 命令来构建镜像。

命令格式:
docker build -t <image_name>:<tag> <path_to_dockerfile>
  • <image_name> 是你为镜像指定的名称。
  • <tag> 是镜像的标签,通常是版本号,比如 latestv1.0
  • <path_to_dockerfile> 是 Dockerfile 所在的目录,通常是当前目录(.)。
示例:
docker build -t my_python_app:latest .

这个命令会在当前目录(.)查找 Dockerfile 并使用该文件构建镜像,最后生成的镜像会被命名为 my_python_app,标签为 latest

3. 查看生成的镜像

构建完成后,你可以使用 docker images 命令查看所有本地的 Docker 镜像:

docker images

这将列出所有可用的镜像,类似于以下输出:

REPOSITORY           TAG       IMAGE ID       CREATED          SIZE
my_python_app        latest    abc123def456    5 seconds ago    150MB
python               3.8-slim  789xyz123abc    2 days ago       80MB

在这里插入图片描述

4. 运行镜像

你可以使用 docker run 命令来启动一个容器并运行你的镜像。例如:

docker run -d --name my_python_app_container my_python_app:latest
  • -d 表示在后台运行容器。
  • --name 用于给容器指定一个名称。
  • my_python_app:latest 是你刚刚构建的镜像。
    在这里插入图片描述

5. 删除镜像

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

docker rmi my_python_app:latest

这将删除名为 my_python_app 且标签为 latest 的镜像。

3. 项目目录

如果你有一个项目目录,并希望在该目录中构建 Docker 镜像,目录结构通常像这样:

/my-project├── Dockerfile├── app.py├── requirements.txt└── ... (其他文件)

我的 app.py 文件是 print("hello world") 但是 docker run 后,怎么没有显示

如果你在 app.py 文件中只是简单地写了 print("hello world"),但是使用 docker run 后没有看到输出,可能是因为容器默认运行时没有将标准输出(stdout)正确地映射到终端。你可以通过以下几种方式来调试和确保输出显示。

1. 确保容器的输出没有被重定向

默认情况下,Docker 容器的标准输出(stdout)和标准错误(stderr)是打印到控制台的。但是,如果容器是在后台运行的(即使用了 -d 参数),输出会被忽略。确保你没有使用 -d 参数,或者查看容器的日志。

解决方法:不使用 -d 以交互模式启动容器

如果你没有使用 -d,容器会在前台运行并直接打印输出:

docker run --name my_python_app my_python_app:latest

这样,你应该能看到 hello world 输出。

在这里插入图片描述

2. 查看容器的日志

如果你使用了 -d 参数让容器在后台运行,你可以通过以下命令查看容器的日志输出:

docker logs my_python_app_container

或者:

docker logs <container_id>

这会显示容器的标准输出和错误输出。如果 app.py 中有 print("hello world"),你应该能在这里看到输出。

3. 确保 Dockerfile 设置正确

确保你的 Dockerfile 配置正确。特别是确保容器启动时执行 app.py,可以通过 CMDENTRYPOINT 来指定容器启动的命令。

例如,假设你有如下的 Dockerfile:

# 使用 Python 作为基础镜像
FROM python:3.8-slim# 设置工作目录
WORKDIR /app# 将本地代码复制到容器中
COPY . /app# 安装依赖
# RUN pip install --no-cache-dir -r requirements.txt # 如果有依赖的话# 执行 app.py 文件
CMD ["python", "app.py"]

确保你的 CMDENTRYPOINT 指令正确地运行了 app.py

4. 调试步骤

确保容器启动后,python app.py 会执行。
如果你仍然无法看到输出,可以进入容器内部进行调试,看看脚本是否正常执行。
进入容器内部:

docker exec -it my_python_app_container /bin/bash

然后手动执行脚本:

python /app/app.py
5. 完全重新构建镜像

如果你对 Dockerfile 或代码做了更改,确保重新构建镜像并运行容器。可以使用以下命令来重新构建镜像:

docker build -t my_python_app:latest .

然后再次运行容器:

docker run my_python_app:latest
http://www.lryc.cn/news/501925.html

相关文章:

  • AI作图效率高,亲测ToDesk、顺网云、青椒云多款云电脑AIGC实践创作
  • 【代码随想录day57】【C++复健】 53. 寻宝(prim算法);53. 寻宝(kruskal算法)
  • C++中多态
  • 【实现多网卡电脑的网络连接共享】
  • 算力介绍与解析
  • 解决 MyBatis 中空字符串与数字比较引发的条件判断错误
  • python 词向量的代码解读 self.word_embeds = nn.Embedding(vocab_size, embedding_dim) 解释下
  • 记一次:使用C#创建一个串口工具
  • Android Studio新版本的一个资源id无法找到的bug解决
  • Datawhale AI冬令营(第一期)--零基础定制你的专属大模型
  • LLMs之APE:基于Claude的Prompt Improver的简介、使用方法、案例应用之详细攻略
  • 【Unity人形布娃娃插件】Ragdoll Animator
  • 跨团队协作中目标一致性至关重要
  • Excel的文件导入遇到大文件时
  • 使用字典进行动态编程
  • 机器学习02-发展历史补充
  • 全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之计数器与累加器(一)
  • Android的SurfaceView和TextureView介绍
  • Scala的集合
  • 1. Flink自定义Source
  • 关于LinuxWindows双系统在八月更新后出现的问题
  • VMware:如何在CentOS7上开启22端口
  • ubuntu远程桌面开启opengl渲染权限
  • 从小学题到技术选型哲学:以智能客服系统为例,解读相关AI技术栈20241211
  • 【C语言练习(5)—回文数判断】
  • 【Rust 学习笔记】Rust 基础数据类型介绍——数组、向量和切片
  • 2024年特别报告,「十大生活方式」研究数据报告
  • R中单细胞RNA-seq分析教程 (5)
  • openpnp - Too many misdetects - retry and verify fiducial/nozzle tip detection
  • 不与最大数相同的数字之和