• WHAT - 容器化系列(二)- docker


    一、前言

    WHAT - 容器化系列(一) 我们简单介绍过 Docker 的产生过程以及它从根本上解决本地环境和 PaaS 环境不一致的问题。Docker大大简化了容器的创建、管理和分发,使得容器技术迅速普及,并引发了DevOps和微服务架构的革命。

    因此Docker在容器化发展进程具备非常重要的意义,我们今天主要来介绍Docker。在Docker的生态系统中,理解Docker镜像和Docker容器及其关系是至关重要的。

    二、Docker镜像:可运行软件包

    Docker镜像是一种轻量级、独立的可执行软件包,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

    镜像是只读的,并且通常基于层次结构,每一层代表镜像的某个历史状态。

    特点:

    • 只读性:镜像是不可变的,一旦创建就不能更改。
    • 层次结构:镜像由多个层组成,每层都是前一层的增量更新,这样可以提高存储和传输效率。
    • 可移植性和一致性:镜像可以在任何支持Docker的环境中运行,确保应用在不同环境下的一致性。

    三、Docker容器:可执行环境

    Docker容器是基于镜像创建的一个可运行的实例。它是一个轻量级、独立的可执行环境,包含应用程序及其依赖项,并且运行在一个隔离的进程空间中。

    容器可以被启动、停止、移动和删除,每个容器都是独立的。

    特点:

    • 可写层:每个容器在镜像的基础上创建时,会增加一个可写层,允许容器在运行时进行更改。
    • 隔离性:容器通过操作系统级虚拟化技术(如Namespaces和cgroups)实现资源的隔离和控制。
    • 临时性:容器的生命周期是短暂的,通常用于运行应用程序的一个实例。

    四、容器和镜像的关系

    容器和镜像之间的关系可以比作面向对象编程中的类和对象:

    • 镜像是类:它定义了容器的蓝图或模板,包含所有需要的文件和设置。
    • 容器是对象:它是镜像的实例,实际运行中的实体。

    容器镜像好比是一个编译好的、打包好的程序文件,容器就是用这个程序文件运行的程序进程。

    五、创建镜像的过程

    创建Docker镜像的过程主要包括编写Dockerfile和使用Docker命令构建镜像。

    以下是详细步骤:

    5.1 编写Dockerfile

    Dockerfile 是一个文本文件,包含了构建镜像的所有指令。这些指令定义了镜像的基础镜像、安装的依赖、复制的文件、设置的环境变量以及启动容器时运行的命令等。

    Dockerfile 示例

    以下是一个简单的示例Dockerfile,用于创建一个包含Nginx服务器的镜像:

    # 使用官方Nginx基础镜像
    FROM nginx:alpine
    
    # 维护者信息
    LABEL maintainer="yourname@example.com"
    
    # 复制本地目录下的文件到镜像中的指定目录
    COPY ./index.html /usr/share/nginx/html/index.html
    
    # 暴露端口
    EXPOSE 80
    
    # 启动Nginx服务
    CMD ["nginx", "-g", "daemon off;"]
    

    5.2 构建Docker镜像

    编写完Dockerfile后,可以使用docker build命令构建镜像。

    命令格式

    docker build -t <镜像名>:<标签> <Dockerfile所在目录>
    

    示例命令

    # 构建镜像并命名为mynginx:latest
    # docker build -t mynginx:v1.1 .
    docker build -t mynginx:latest .
    

    5.3 查看构建的镜像

    构建完成后,可以使用docker images命令查看本地的镜像列表。

    docker images
    

    5.4 运行Docker容器

    构建完镜像后,可以使用docker run命令基于该镜像创建并运行容器。

    命令格式

    docker run -d --name <容器名> -p <主机端口>:<容器端口> <镜像名>:<标签>
    

    示例命令

    # 运行基于mynginx:latest镜像的容器,映射端口80
    docker run -d --name mynginx_container -p 80:80 mynginx:latest
    

    5.5 验证容器运行状态

    可以使用docker ps命令查看正在运行的容器列表。

    docker ps
    

    5.6 推送镜像到镜像仓库(可选)

    如果需要将镜像分享给其他人或在不同环境中使用,可以将镜像推送到Docker Hub或其他私有镜像仓库。

    1. 登录Docker Hub

    docker login
    docker login -u admin <DockerHub域名>
    # 示例:docker login -u admin mycontainer myregistry.com
    

    2. 标记镜像

    docker tag mynginx:latest <DockerHub用户名>/mynginx:latest
    # 示例:docker tag mynginx:latest mycontainer myregistry.com/myapp/mynginx:latest
    

    3. 推送镜像

    docker push <DockerHub用户名>/mynginx:latest
    # 示例 docker push mycontainer myregistry.com/myapp/mynginx:latest
    

    总结

    创建Docker镜像的过程主要包括以下步骤:

    1. 编写Dockerfile:定义镜像的构建步骤和内容。
    2. 构建镜像:使用docker build命令构建镜像。
    3. 查看镜像:使用docker images命令查看本地镜像列表。
    4. 运行容器:使用docker run命令基于镜像创建并运行容器。
    5. 验证容器:使用docker ps命令查看容器运行状态。
    6. 推送镜像(可选):将镜像推送到镜像仓库,以便共享和使用。

    通过以上步骤,可以创建和管理Docker镜像,从而实现应用程序的容器化部署。

    六、创建容器的过程

    6.1 基本过程:选择镜像、启动容器、运行应用

    1. 选择镜像:通过Docker命令选择一个已有的镜像或从Docker Hub等仓库中拉取一个镜像。
    2. 启动容器:基于选定的镜像,Docker引擎创建一个容器实例,并在镜像的基础上添加一个可写层。
    3. 运行应用:容器启动后,镜像中的应用程序在隔离的环境中运行。

    6.2 示例

    假设有一个名为myapp的Docker镜像,以下是基于这个镜像创建并运行容器的过程:

    # 拉取镜像(如果镜像已存在,可以跳过这一步)
    docker pull myapp
    
    # 基于镜像创建并运行容器
    docker run -d --name mycontainer myapp
    
    # 查看正在运行的容器
    docker ps
    
    # 进入容器
    docker exec -it mycontainer /bin/bash
    
    # 停止容器
    docker stop mycontainer
    
    # 删除容器
    docker rm mycontainer
    

    七、docker run 命令

    7.1 镜像来源

    在前面我们提供过下面两个例子:

    # 1. 本地build后run
    docker build -t mynginx:latest .
    docker run -d --name mynginx_container -p 80:80 mynginx:latest
    
    # 2. 拉取远端镜像run
    docker pull myapp
    docker run -d --name mycontainer myapp
    

    对于远端镜像,在Docker中,可以直接通过docker run命令指定远端镜像,而不需要先使用docker pull命令拉取镜像。Docker会在本地没有指定镜像的情况下自动从远端仓库(例如Docker Hub)拉取镜像,然后运行容器。

    以下是如何直接指定远端镜像的示例:

    # 直接指定远端镜像并运行容器
    docker run -d --name mycontainer myapp
    

    在这个命令中,如果myapp镜像不存在于本地,Docker会自动从Docker Hub拉取镜像并运行容器。

    如果需要指定具体的镜像版本或标签,可以在镜像名后面加上标签(例如myapp:latestmyapp:v1.0)。

    # 直接指定带标签的远端镜像并运行容器
    docker run -d --name mycontainer myapp:latest
    

    另外,如果镜像托管在私有仓库或组织名下,需要包括仓库地址或组织名:

    # 指定私有仓库中的镜像并运行容器
    docker run -d --name mycontainer myregistry.com/myapp:latest
    
    # 指定组织名下的镜像并运行容器
    docker run -d --name mycontainer myorg/myapp:latest
    

    7.2 主要参数说明

    docker run 是 Docker 中用于创建并运行容器的主要命令。这个命令有许多参数,可以用来配置容器的运行方式。以下是一些常用的 docker run 参数及其说明:

    基本参数

    1. -d--detach

      • 作用:以后台模式运行容器。
      • 示例docker run -d nginx
    2. --name

      • 作用:为容器指定一个名称。
      • 示例docker run --name mycontainer nginx
    3. -p--publish

      • 作用:将容器的端口映射到主机的端口。
      • 示例docker run -p 8080:80 nginx
    4. -e--env

      • 作用:设置环境变量。
      • 示例docker run -e MYVAR=myvalue nginx
    5. -v--volume

      • 作用:挂载主机目录或数据卷到容器。
      • 示例docker run -v /host/path:/container/path nginx
    6. --rm

      • 作用:容器停止后自动删除容器。
      • 示例docker run --rm nginx
    7. -it

      • 作用:以交互模式运行容器并绑定终端。
      • 示例docker run -it ubuntu /bin/bash

    网络相关参数

    1. --network

      • 作用:指定容器的网络模式。
      • 示例docker run --network bridge nginx
    2. --link

      • 作用:连接到其他容器。
      • 示例docker run --link another_container nginx

    资源限制

    1. --cpus

      • 作用:限制容器使用的CPU数量。
      • 示例docker run --cpus="1.5" nginx
    2. --memory

      • 作用:限制容器使用的内存。
      • 示例docker run --memory="512m" nginx

    其他参数

    1. --restart

      • 作用:定义容器的重启策略。
      • 示例docker run --restart=always nginx
    2. --env-file

      • 作用:从文件中读取环境变量。
      • 示例docker run --env-file ./env.list nginx
    3. --entrypoint

      • 作用:覆盖镜像的默认入口点。
      • 示例docker run --entrypoint /bin/bash ubuntu
    4. -u--user

      • 作用:以指定用户运行容器。
      • 示例docker run -u 1001 nginx
    5. --log-driver

      • 作用:指定容器的日志驱动。
      • 示例docker run --log-driver=syslog nginx

    完整示例

    结合多个参数的完整示例:

    docker run -d --name mynginx -p 8080:80 -v /mydata:/data --env MYVAR=myvalue --network mynetwork --restart=always nginx
    
    • -d:以后台模式运行容器。
    • --name mynginx:为容器指定名称为 mynginx
    • -p 8080:80:将主机的8080端口映射到容器的80端口。
    • -v /mydata:/data:将主机目录 /mydata 挂载到容器的 /data 目录。
    • --env MYVAR=myvalue:设置环境变量 MYVARmyvalue
    • --network mynetwork:将容器连接到 mynetwork 网络。
    • --restart=always:设置容器重启策略为总是重启。
    • nginx:使用 nginx 镜像。

    总结

    docker run 命令提供了丰富的参数选项,允许用户精细控制容器的运行方式。通过组合不同的参数,可以满足各种应用场景的需求。

    八、其他常见 docker 命令

    以下是一些常见的Docker命令及其功能介绍:

    1. 查看容器:

      docker ps
      

      这个命令列出当前正在运行的容器。

    2. 启动或停止容器:

      docker start <容器ID或名称>
      docker stop <容器ID或名称>
      

      通过这些命令可以启动或停止指定的容器。

    3. 删除容器:

      docker rm <容器ID或名称>
      

      这个命令用于删除指定的容器。

    4. 在容器中执行命令:

      docker exec -it <容器ID或名称> <命令>
      

      这个命令允许你在正在运行的容器中执行特定的命令。

    5. 分析容器的配置:

      docker inspect <容器ID或名称>
      

      这个命令会返回指定容器的详细配置信息,包括网络设置、挂载的卷、环境变量等。

    6. 查看容器标准输出日志:

      docker logs <容器ID或名称>
      

      这个命令用于查看容器的标准输出日志,可以用来调试和监视容器的运行情况。

    7. 查看镜像:

      docker images
      

      这个命令列出本地系统中的Docker镜像列表。

    8. 删除镜像:

      docker rmi <镜像ID或名称>
      

      这个命令用于删除指定的Docker镜像。

  • 相关阅读:
    Java全栈开发第一阶段--01.Java语言概述(开发环境搭建)
    mysql内置功能(走开发的看)
    备战十一届大唐杯国赛预选赛
    ESP32网络编程-TCP客户端数据传输
    水浸监测新方法,简单实用,你值得拥有!
    纯手码优质JAVA面试八股文
    洛谷刷题:循环结构
    最小生成树算法
    2023年系统规划与设计管理师-第一章信息的综合知识
    信号:singal
  • 原文地址:https://blog.csdn.net/weixin_58540586/article/details/139394182