Docker学习系列(二):深入理解Docker镜像与容器

Docker学习系列(二):深入理解Docker镜像与容器

在第一篇文章中,我们介绍了Docker的基础概念和基本操作。这一篇将深入探讨Docker镜像和容器的工作原理,并详细讲解常用的Docker命令,帮助你更好地理解和使用Docker。

Docker镜像

什么是Docker镜像?

Docker镜像是一个只读的模板,用于创建Docker容器。每个镜像包含运行应用程序所需的一切,如代码、运行时、库和配置文件。镜像由多个层组成,这些层是基于Union FS(联合文件系统)构建的。镜像的分层设计使得每一层都可以被复用和共享,从而极大地提高了存储和传输的效率。

Docker镜像的工作原理

Docker镜像由一系列分层文件系统组成,每层都基于上一层。每次对镜像的修改都会创建一个新的层,这些层是不可变的。当我们拉取或创建镜像时,Docker会通过层叠技术将这些层组合起来。

常用Docker镜像命令

  1. 拉取镜像:从Docker Hub等镜像仓库中下载镜像。

    docker pull <image_name>
    

    示例:

    docker pull ubuntu
    
  2. 列出本地镜像:查看本地已下载的镜像。

    docker images
    
  3. 删除镜像:删除不再需要的镜像。

    docker rmi <image_id>
    
  4. 查看镜像历史:查看镜像的构建历史。

    docker history <image_id>
    
  5. 保存镜像:将镜像保存为tar文件。

    docker save -o <filename>.tar <image_name>
    
  6. 加载镜像:从tar文件加载镜像。

    docker load -i <filename>.tar
    

创建自定义镜像

通过Dockerfile可以创建自定义镜像。以下是一个简单的Dockerfile例子:

# 使用官方的Python基础镜像
FROM python:3.8-slim

# 设置工作目录
WORKDIR /app

# 复制当前目录的内容到工作目录
COPY . /app

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 设置容器启动时执行的命令
CMD ["python", "app.py"]

构建镜像:

docker build -t my-python-app .

深入理解Dockerfile

Dockerfile是一个包含一系列命令的脚本文件,这些命令告诉Docker如何构建一个镜像。以下是Dockerfile中常用的指令:

  1. FROM:指定基础镜像。

    FROM ubuntu:20.04
    
  2. RUN:在镜像内执行命令。

    RUN apt-get update && apt-get install -y python3
    
  3. COPY:将文件或目录从宿主机复制到镜像内。

    COPY . /app
    
  4. WORKDIR:设置工作目录。

    WORKDIR /app
    
  5. CMD:指定容器启动时执行的命令。

    CMD ["python3", "app.py"]
    
  6. EXPOSE:声明容器监听的端口。

    EXPOSE 80
    
  7. ENV:设置环境变量。

    ENV APP_ENV=production
    
  8. ENTRYPOINT:配置容器启动时运行的主进程。

    ENTRYPOINT ["python3", "app.py"]
    

Docker容器

什么是Docker容器?

Docker容器是镜像的运行实例。容器是一个轻量级、独立、可执行的软件包,包含应用程序及其依赖。容器可以在Docker引擎上运行,具有快速启动、资源隔离和易于管理等特点。

Docker容器的工作原理

容器是通过镜像启动的,每个容器都可以被认为是镜像的一个动态运行时副本。Docker使用Linux内核的命名空间(namespaces)和控制组(cgroups)来实现资源的隔离和限制,从而确保容器间的相互独立性。

常用Docker容器命令

  1. 运行容器:基于镜像创建并启动一个容器。

    docker run -it <image_name> /bin/bash
    

    示例:

    docker run -it ubuntu /bin/bash
    
  2. 列出运行中的容器:查看正在运行的容器。

    docker ps
    
  3. 列出所有容器:查看所有容器,包括停止的容器。

    docker ps -a
    
  4. 停止容器:停止一个正在运行的容器。

    docker stop <container_id>
    
  5. 启动容器:启动一个已经停止的容器。

    docker start <container_id>
    
  6. 重启容器:重启一个容器。

    docker restart <container_id>
    
  7. 删除容器:删除一个已经停止的容器。

    docker rm <container_id>
    
  8. 查看容器日志:查看容器的标准输出和错误输出日志。

    docker logs <container_id>
    
  9. 进入运行中的容器:通过一个交互式shell进入一个正在运行的容器。

    docker exec -it <container_id> /bin/bash
    
  10. 复制文件到容器:将本地文件复制到容器中。

    docker cp <local_path> <container_id>:<container_path>
    
  11. 复制文件从容器:将容器中文件复制到本地。

    docker cp <container_id>:<container_path> <local_path>
    

容器数据管理

容器中的数据管理是一个重要的方面。Docker提供了卷(Volumes)和绑定挂载(Bind Mounts)来管理数据的持久化和共享。

使用卷

卷是由Docker管理的,存储在主机文件系统的特殊位置。卷的优点是易于备份和迁移。

创建并使用卷:

docker volume create my_volume
docker run -d -v my_volume:/app/data my-python-app
使用绑定挂载

绑定挂载允许将主机文件系统的特定路径挂载到容器中。这在开发过程中非常有用,因为可以直接访问和修改代码。

使用绑定挂载运行容器:

docker run -d -v /path/to/local/dir:/app/data my-python-app

Docker网络

Docker提供了多种网络模式来连接容器:

  1. 桥接网络(bridge):默认的网络模式,适用于大多数应用。

    创建一个容器并连接到桥接网络:

    docker run -d --name my_container --network bridge my-python-app
    
  2. 主机网络(host):容器共享宿主机的网络堆栈。

    使用主机网络模式运行容器:

    docker run -d --network host my-python-app
    
  3. 无网络(none):容器没有网络接口。

    使用无网络模式运行容器:

    docker run -d --network none my-python-app
    
  4. 覆盖网络(overlay):用于多主机的Docker集群,依赖Docker Swarm或Kubernetes。

    创建覆盖网络(需要Docker Swarm):

    docker network create -d overlay my_overlay_network
    

实战案例:创建和管理一个Python Web应用

Dockerfile

以下是一个示例的Dockerfile,用于构建一个简单的Python Web应用:

# 使用官方的Python基础镜像
FROM python:3.8-slim

# 设置工作目录
WORKDIR /app

# 复制当前目录的内容到工作目录
COPY . /app

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 设置容器启动时执行的命令
CMD ["python", "app.py"]

项目结构

假设项目目录结构如下:

my-python-app/
│
├── app.py
├── requirements.txt
└── Dockerfile

app.py

这是一个简单的Flask Web应用:

from flask import Flask

app = Flask(__name__)

@app

.route('/')
def hello():
    return "Hello, World!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

requirements.txt

列出应用的依赖:

flask

构建镜像

在项目根目录下执行以下命令构建镜像:

docker build -t my-python-app .

运行容器

使用以下命令运行容器:

docker run -d -p 80:80 my-python-app

此命令将容器的80端口映射到宿主机的80端口。你可以通过浏览器访问http://localhost来查看运行的Web应用。

小结

通过本篇文章,我们深入了解了Docker镜像和容器的工作原理,并详细介绍了常用的Docker命令。我们还通过一个实际案例演示了如何创建和管理一个简单的Python Web应用。掌握这些知识,你就能够更好地管理和使用Docker镜像和容器。下一篇文章将介绍如何使用Docker Compose管理多容器应用,以及如何编写高效的Dockerfile。敬请期待!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄宝良

你的鼓励是我不懈努力的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值