学习如何使用dockerfile
以下内容,部分来自gpt生成,里面的描述可能会出现问题,但代码部分,我都会进行测试。
1. 需求
对于一个docker,例如python,我们需要其在构建成容器时,就有np。有以下两种方法:
- pull python,并run后,在里面pip install numpy,随后对这个容器进行打包保存
- 在pull python时,就将pip install numpy一起运行,run的时候,就有numpy了。
2. dockerfile和docker-compose
说明:为了实现上述的功能,dockerfile用于定义并构建单一Docker镜像的指令脚本,即pull;docker-compose用于定义和运行多容器Docker应用程序的工具和配置文件,提供统一的方式run。
Dockerfile:
目的:Dockerfile用于定义单个容器的内容和配置。它提供了一种方式来从头开始创建一个新的Docker镜像,或基于现有的Docker镜像定制一个新的镜像。
主要操作:定义、构建和配置一个Docker容器。 示例用途:安装软件、设置环境变量、定义工作目录、设置入口点等。 用法:使用docker
build命令从Dockerfile创建一个新的Docker镜像。
docker-compose:
目的:docker-compose用于定义和运行多容器Docker应用程序。它提供了一个声明式的方式来定义一组相关联的容器、它们之间的网络、卷和其他配置。
主要操作:定义、连接和管理多个容器。
示例用途:在本地开发环境中运行多服务应用(如前端、后端和数据库)、设置服务之间的网络连接、定义和挂载卷等。
用法:使用docker-compose up命令根据docker-compose.yml文件启动服务。
3. Dockerfile
使用Dockerfile,实现python with numpy
- 创建一个Dockerfile,名字需要严格要求
# 使用python:latest作为基础镜像
FROM python:latest# 安装numpy
RUN pip install numpy
- 将上述内容创建一个镜像
# docker build -t image-name:latest <Dockerfile的路径>
docker build -t py-with-np:v1 .
# 使用 docker images查看已有镜像
- 运行上述docker
docker run -it -v /opt/appdata/python:/py --name pytest py-with-np:v1
# 使用docker ps -a查看运行的容器
4. docker-compose
上述的dockerfile,只能先创建images,再运行,并不优雅。
docker-compose就是解决这个问题的
- 创建 Dockerfile:
# 使用python:latest作为基础镜像
FROM python:latest# 安装numpy
RUN pip install numpy
- 创建 docker-compose.yml:
简单版本,运行后直接启动python
version: '3'services:hello-service:build:context: .dockerfile: Dockerfileimage: py-with-np:v6volumes:- /opt/appdata/python:/pyports:- "8080:8080"command: python /py/test.pystdin_open: truetty: true
解释
: build: . 指示 docker-compose 根据当前目录下的 Dockerfile 构建 Docker 镜像。 image:
py-with-np:v1 指定构建的镜像的名称和标签。 volumes 是一个卷映射,与之前 docker run 命令中的 -v
参数相同。
如果你想在 docker-compose 中运行容器并保持其交互性,例如一个交互式 Python shell,你应该在 docker-compose.yml 文件中添加一个 stdin_open 和 tty 属性,这两个属性都设置为 true。这与 docker run 的 -i 和 -t 选项相对应。
- 使用 docker-compose 运行容器:
首先,在命令行中转到 docker-compose.yml 所在的目录。接着,使用以下命令启动服务:
docker-compose up --build
docker-compose up 启动服务。
–build 参数确保在运行服务之前构建或重新构建服务的镜像。
4. 问题
-it怎么办?
由于在docker-compose.yml中添加了 stdin_open: true tty: true,但仍然不能够启动
只能用用docker run -it 镜像名,暂且用用了
5. 删除不必要的image和container
# 查看容器
docker ps -a
# 停止容器
docker stop ID
# 删除容器
docker rm ID
# 查看镜像
docker images
# 删除镜像
docker rmi ID # 但是可能两个images有相同的ID
docker rmi name:V1