Docker 镜像和容器的区别详解
在使用 Docker 时,经常会涉及到 Docker 镜像和容器的概念。这两个概念的理解对于正确使用 Docker 来说是非常重要的。本文将详细讲解 Docker 镜像和容器的区别及其使用方法。
Docker 镜像
Docker 镜像是一种可执行软件包,其中包含了运行应用程序所需的所有内容:代码、库、环境变量和依赖项。Docker 镜像可以看作是应用程序和其依赖关系的静态副本。Docker 镜像可以从 Docker Hub 或自己构建生成。
Docker 镜像的构建
Docker 镜像的构建可以有以下几种方法:
- 从 Dockerfile 构建
在 Dockerfile 中定义 Docker 镜像的配置信息,然后使用 docker build
命令构建出镜像。例如,下面是一个简单的 Dockerfile 示例:
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y python3
COPY . /app
WORKDIR /app
CMD ["python3", "app.py"]
其中 FROM
指定了使用的镜像基础,RUN
执行 shell 命令,COPY
将本地文件复制到镜像中,WORKDIR
设置工作目录,CMD
定义容器启动后要运行的命令。
- 从现有镜像中构建
可以使用 docker pull
命令从 Docker Hub 上下载已存在的镜像,然后使用 docker tag
命令给镜像重新命名。例如:
$ docker pull nginx:latest
$ docker tag nginx:latest my-nginx:latest
Docker 镜像的管理
Docker 镜像的管理可以有以下几种方法:
- 查看镜像
使用 docker images
命令可以列出当前所有镜像:
$ docker images
- 删除镜像
使用 docker rmi
命令可以删除指定的镜像:
$ docker rmi my-nginx:latest
Docker 容器
Docker 容器是 Docker 镜像的运行实例,可以看作是 Docker 镜像的一个进程。容器提供了一个隔离的运行环境,多个容器可以以隔离的方式在同一主机上运行。
Docker 容器的创建
Docker 容器的创建可以有以下几种方法:
- 使用
docker run
命令
使用 docker run
命令可以创建并运行一个容器。例如:
$ docker run -it --name my-container ubuntu:18.04 /bin/bash
其中 -it
参数表示使用交互模式创建容器,--name
参数指定容器名,ubuntu:18.04
指定所使用的镜像,在容器中运行 /bin/bash
命令。
- 使用
docker create
和docker start
命令
使用 docker create
命令创建容器,使用 docker start
命令启动容器。例如:
$ docker create --name my-container ubuntu:18.04 /bin/bash
$ docker start -a my-container
其中 -a
参数表示附加到容器标准输出,使我们可以查看容器的输出。
Docker 容器的管理
Docker 容器的管理可以有以下几种方法:
- 查看容器
使用 docker ps
命令可以列出正在运行的容器:
$ docker ps
使用 docker ps -a
命令可以列出所有容器。
- 停止容器
使用 docker stop
命令可以停止指定的容器:
$ docker stop my-container
- 删除容器
使用 docker rm
命令可以删除指定的容器:
$ docker rm my-container
Docker 镜像和容器的区别
Docker 镜像和容器的关系类似于面向对象编程中的类和实例。镜像是一个静态的程序集,相当于类,容器是基于镜像创建的动态实例,相当于实例。因此,Docker 镜像和容器其实是两个不同的概念。
使用 Docker 镜像来创建 Docker 容器。镜像是一个静态的程序集,包含构建应用程序和依赖所需的所有内容。镜像只读,无法修改。可以使用不同的镜像来创建多个容器。
Docker 容器是 Docker 镜像的运行实例。容器可以被创建、启动、停止、删除。容器可以使用所依赖的 Docker 镜像中的程序和工具,也可以与其他容器和主机交互。
示例说明
示例1:从Dockerfile构建Docker镜像
以下是一个简单的示例,介绍如何从 Dockerfile 构建 Docker 镜像:
-
首先在本地创建一个名称为
docker-demo
的空文件夹,用于存放 Dockerfile 和应用程序代码。 -
在
docker-demo
文件夹中创建一个名为Dockerfile
的文件,文件中的内容如下:
FROM node:12
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
该 Dockerfile 使用 Node.js 12 作为基础镜像,在 /app
目录下创建工作目录并复制应用程序文件,安装所需的依赖项,然后设置容器的默认启动命令为 npm start
。
- 在
docker-demo
文件夹中创建一个名为package.json
的文件,并将以下内容复制到其中:
{
"name": "docker-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.1"
}
}
该文件定义了应用程序名称、版本号、描述等信息,同时定义了开启应用程序所需的依赖包(这里仅包含 Express.js)。
- 在
docker-demo
文件夹中创建一个名为index.js
的文件,并将以下内容复制到其中:
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
该文件用于定义一个简单的 Express.js 应用程序,监听端口 3000,并在打开浏览器访问 http://localhost:3000 时向浏览器返回 "Hello World!"。
- 执行以下命令,使用以上代码构建 Docker 镜像:
$ cd /path/to/docker-demo
$ docker build -t my-docker-demo .
其中 -t
参数指定镜像名称,并将镜像名称设置为 my-docker-demo
。
- 执行以下命令,使用以上镜像启动一个容器:
$ docker run -d --name my-docker-demo -p 3000:3000 my-docker-demo
其中 -d
参数表示使用后台模式运行容器,--name
参数指定容器名称,-p
参数将容器的 3000 端口映射到主机的 3000 端口。
- 打开浏览器访问 http://localhost:3000,可以看到 "Hello World!" 输出。
示例2:使用 Docker Compose 同时启动多个 Docker 容器
以下是一个简单的示例,介绍如何使用 Docker Compose 同时启动多个 Docker 容器:
-
创建一个名称为
docker-compose-demo
的新文件夹,并在其中创建一个名为docker-compose.yml
的文件。 -
在
docker-compose.yml
文件中定义两个服务:
version: "3"
services:
web:
build: ./
ports:
- "80:80"
db:
image: mariadb:10.4
environment:
MYSQL_ROOT_PASSWORD: example
其中 web
服务使用当前目录下的 Dockerfile 来构建镜像,将容器的 80 端口映射到主机的 80 端口;db
服务使用 mariadb:10.4 镜像,并定义了 MySQL 的 root 密码为 example
。
- 在当前目录下创建一个名为
index.html
的文件,并将以下内容复制到其中:
<!DOCTYPE html>
<html>
<head>
<title>Docker Compose Demo</title>
</head>
<body>
<h1>Hello from Docker Compose!</h1>
</body>
</html>
这是一个简单的 HTML 页面,用于在浏览器中测试 web
服务。
- 执行以下命令,使用 Docker Compose 启动服务:
$ docker-compose up -d
其中 -d
参数表示使用后台模式运行服务。
-
在浏览器中访问 http://localhost,可以看到 "Hello from Docker Compose!" 输出。
-
执行以下命令,停止并删除服务:
$ docker-compose down
以上就是 Docker 镜像和容器的区别详解及其使用方法的完整攻略,同时包含了两个简单的示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Docker 镜像和容器的区别详解 - Python技术站