目录
- 一、前言
- 二、Docker镜像:可运行软件包
- 三、Docker容器:可执行环境
- 四、容器和镜像的关系
- 五、创建镜像的过程
-
- [5.1 编写Dockerfile](#5.1 编写Dockerfile)
- [5.2 构建Docker镜像](#5.2 构建Docker镜像)
- [5.3 查看构建的镜像](#5.3 查看构建的镜像)
- [5.4 运行Docker容器](#5.4 运行Docker容器)
- [5.5 验证容器运行状态](#5.5 验证容器运行状态)
- [5.6 推送镜像到镜像仓库(可选)](#5.6 推送镜像到镜像仓库(可选))
-
- [1. 登录Docker Hub](#1. 登录Docker Hub)
- [2. 标记镜像](#2. 标记镜像)
- [3. 推送镜像](#3. 推送镜像)
- 总结
- 六、创建容器的过程
-
- [6.1 基本过程:选择镜像、启动容器、运行应用](#6.1 基本过程:选择镜像、启动容器、运行应用)
- [6.2 示例](#6.2 示例)
- [七、docker run 命令](#七、docker run 命令)
- [八、其他常见 docker 命令](#八、其他常见 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镜像的过程主要包括以下步骤:
- 编写Dockerfile:定义镜像的构建步骤和内容。
- 构建镜像 :使用
docker build
命令构建镜像。 - 查看镜像 :使用
docker images
命令查看本地镜像列表。 - 运行容器 :使用
docker run
命令基于镜像创建并运行容器。 - 验证容器 :使用
docker ps
命令查看容器运行状态。 - 推送镜像(可选):将镜像推送到镜像仓库,以便共享和使用。
通过以上步骤,可以创建和管理Docker镜像,从而实现应用程序的容器化部署。
六、创建容器的过程
6.1 基本过程:选择镜像、启动容器、运行应用
- 选择镜像:通过Docker命令选择一个已有的镜像或从Docker Hub等仓库中拉取一个镜像。
- 启动容器:基于选定的镜像,Docker引擎创建一个容器实例,并在镜像的基础上添加一个可写层。
- 运行应用:容器启动后,镜像中的应用程序在隔离的环境中运行。
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:latest
或myapp: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
参数及其说明:
基本参数
-
-d
或--detach
- 作用:以后台模式运行容器。
- 示例 :
docker run -d nginx
-
--name
- 作用:为容器指定一个名称。
- 示例 :
docker run --name mycontainer nginx
-
-p
或--publish
- 作用:将容器的端口映射到主机的端口。
- 示例 :
docker run -p 8080:80 nginx
-
-e
或--env
- 作用:设置环境变量。
- 示例 :
docker run -e MYVAR=myvalue nginx
-
-v
或--volume
- 作用:挂载主机目录或数据卷到容器。
- 示例 :
docker run -v /host/path:/container/path nginx
-
--rm
- 作用:容器停止后自动删除容器。
- 示例 :
docker run --rm nginx
-
-it
- 作用:以交互模式运行容器并绑定终端。
- 示例 :
docker run -it ubuntu /bin/bash
网络相关参数
-
--network
- 作用:指定容器的网络模式。
- 示例 :
docker run --network bridge nginx
-
--link
- 作用:连接到其他容器。
- 示例 :
docker run --link another_container nginx
资源限制
-
--cpus
- 作用:限制容器使用的CPU数量。
- 示例 :
docker run --cpus="1.5" nginx
-
--memory
- 作用:限制容器使用的内存。
- 示例 :
docker run --memory="512m" nginx
其他参数
-
--restart
- 作用:定义容器的重启策略。
- 示例 :
docker run --restart=always nginx
-
--env-file
- 作用:从文件中读取环境变量。
- 示例 :
docker run --env-file ./env.list nginx
-
--entrypoint
- 作用:覆盖镜像的默认入口点。
- 示例 :
docker run --entrypoint /bin/bash ubuntu
-
-u
或--user
- 作用:以指定用户运行容器。
- 示例 :
docker run -u 1001 nginx
-
--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
:设置环境变量MYVAR
为myvalue
。--network mynetwork
:将容器连接到mynetwork
网络。--restart=always
:设置容器重启策略为总是重启。nginx
:使用nginx
镜像。
总结
docker run
命令提供了丰富的参数选项,允许用户精细控制容器的运行方式。通过组合不同的参数,可以满足各种应用场景的需求。
八、其他常见 docker 命令
以下是一些常见的Docker命令及其功能介绍:
-
查看容器:
bashdocker ps
这个命令列出当前正在运行的容器。
-
启动或停止容器:
bashdocker start <容器ID或名称> docker stop <容器ID或名称>
通过这些命令可以启动或停止指定的容器。
-
删除容器:
bashdocker rm <容器ID或名称>
这个命令用于删除指定的容器。
-
在容器中执行命令:
bashdocker exec -it <容器ID或名称> <命令>
这个命令允许你在正在运行的容器中执行特定的命令。
-
分析容器的配置:
bashdocker inspect <容器ID或名称>
这个命令会返回指定容器的详细配置信息,包括网络设置、挂载的卷、环境变量等。
-
查看容器标准输出日志:
bashdocker logs <容器ID或名称>
这个命令用于查看容器的标准输出日志,可以用来调试和监视容器的运行情况。
-
查看镜像:
bashdocker images
这个命令列出本地系统中的Docker镜像列表。
-
删除镜像:
bashdocker rmi <镜像ID或名称>
这个命令用于删除指定的Docker镜像。