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服务器的镜像:

Dockerfile 复制代码
# 使用官方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命令构建镜像。

命令格式

sh 复制代码
docker build -t <镜像名>:<标签> <Dockerfile所在目录>

示例命令

sh 复制代码
# 构建镜像并命名为mynginx:latest
# docker build -t mynginx:v1.1 .
docker build -t mynginx:latest .

5.3 查看构建的镜像

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

sh 复制代码
docker images

5.4 运行Docker容器

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

命令格式

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

示例命令

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

5.5 验证容器运行状态

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

sh 复制代码
docker ps

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

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

1. 登录Docker Hub

sh 复制代码
docker login
docker login -u admin <DockerHub域名>
# 示例:docker login -u admin mycontainer myregistry.com

2. 标记镜像

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

3. 推送镜像

sh 复制代码
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镜像,以下是基于这个镜像创建并运行容器的过程:

sh 复制代码
# 拉取镜像(如果镜像已存在,可以跳过这一步)
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 镜像来源

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

sh 复制代码
# 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)拉取镜像,然后运行容器。

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

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

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

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

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

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

sh 复制代码
# 指定私有仓库中的镜像并运行容器
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

完整示例

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

sh 复制代码
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. 查看容器:

    bash 复制代码
    docker ps

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

  2. 启动或停止容器:

    bash 复制代码
    docker start <容器ID或名称>
    docker stop <容器ID或名称>

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

  3. 删除容器:

    bash 复制代码
    docker rm <容器ID或名称>

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

  4. 在容器中执行命令:

    bash 复制代码
    docker exec -it <容器ID或名称> <命令>

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

  5. 分析容器的配置:

    bash 复制代码
    docker inspect <容器ID或名称>

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

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

    bash 复制代码
    docker logs <容器ID或名称>

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

  7. 查看镜像:

    bash 复制代码
    docker images

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

  8. 删除镜像:

    bash 复制代码
    docker rmi <镜像ID或名称>

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

相关推荐
sam-1231 小时前
k8s上部署redis高可用集群
redis·docker·k8s
Fanstay9852 小时前
在Linux中使用Nginx和Docker进行项目部署
linux·nginx·docker
death bell3 小时前
Docker基础概念
运维·docker·容器
天幕繁星5 小时前
docker desktop es windows解决vm.max_map_count [65530] is too low 问题
windows·elasticsearch·docker·docker desktop
想学习java初学者6 小时前
Docker Compose部署Kafka(非Zookeeper)
docker·容器·kafka
尝尝你的优乐美6 小时前
Docker部署Vue项目原来可以那么好用
前端·nginx·docker
迷茫运维路7 小时前
docker搭建Jenkins2.346.3版本及常用工具集成配置(ldap、maven、ansible、npm等)
运维·docker·jenkins·cicd
我叫乐多你养我啊7 小时前
Windows远程连接Docker服务
笔记·docker
mit6.82410 小时前
[Docker#5] 镜像仓库 | 命令 | 实验:搭建Nginx | 创建私有仓库
linux·后端·docker·云原生
牛右刀薛面10 小时前
麒麟V10,arm64,离线安装docker和docker-compose
运维·docker·容器·麒麟·鲲鹏