在 WHAT - 容器化系列(一) 我们简单介绍过 Docker 的产生过程以及它从根本上解决本地环境和 PaaS 环境不一致的问题。Docker大大简化了容器的创建、管理和分发,使得容器技术迅速普及,并引发了DevOps和微服务架构的革命。
因此Docker在容器化发展进程具备非常重要的意义,我们今天主要来介绍Docker。在Docker的生态系统中,理解Docker镜像和Docker容器及其关系是至关重要的。
Docker镜像是一种轻量级、独立的可执行软件包,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
镜像是只读的,并且通常基于层次结构,每一层代表镜像的某个历史状态。
特点:
Docker容器是基于镜像创建的一个可运行的实例。它是一个轻量级、独立的可执行环境,包含应用程序及其依赖项,并且运行在一个隔离的进程空间中。
容器可以被启动、停止、移动和删除,每个容器都是独立的。
特点:
容器和镜像之间的关系可以比作面向对象编程中的类和对象:
容器镜像好比是一个编译好的、打包好的程序文件,容器就是用这个程序文件运行的程序进程。
创建Docker镜像的过程主要包括编写Dockerfile和使用Docker命令构建镜像。
以下是详细步骤:
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;"]
编写完Dockerfile后,可以使用docker build
命令构建镜像。
命令格式
docker build -t <镜像名>:<标签> <Dockerfile所在目录>
示例命令
# 构建镜像并命名为mynginx:latest
# docker build -t mynginx:v1.1 .
docker build -t mynginx:latest .
构建完成后,可以使用docker images
命令查看本地的镜像列表。
docker images
构建完镜像后,可以使用docker run
命令基于该镜像创建并运行容器。
命令格式
docker run -d --name <容器名> -p <主机端口>:<容器端口> <镜像名>:<标签>
示例命令
# 运行基于mynginx:latest镜像的容器,映射端口80
docker run -d --name mynginx_container -p 80:80 mynginx:latest
可以使用docker ps
命令查看正在运行的容器列表。
docker ps
如果需要将镜像分享给其他人或在不同环境中使用,可以将镜像推送到Docker Hub或其他私有镜像仓库。
docker login
docker login -u admin <DockerHub域名>
# 示例:docker login -u admin mycontainer myregistry.com
docker tag mynginx:latest <DockerHub用户名>/mynginx:latest
# 示例:docker tag mynginx:latest mycontainer myregistry.com/myapp/mynginx:latest
docker push <DockerHub用户名>/mynginx:latest
# 示例 docker push mycontainer myregistry.com/myapp/mynginx:latest
创建Docker镜像的过程主要包括以下步骤:
docker build
命令构建镜像。docker images
命令查看本地镜像列表。docker run
命令基于镜像创建并运行容器。docker ps
命令查看容器运行状态。通过以上步骤,可以创建和管理Docker镜像,从而实现应用程序的容器化部署。
假设有一个名为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
在前面我们提供过下面两个例子:
# 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:latest
或myapp: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
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
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
结合多个参数的完整示例:
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 ps
这个命令列出当前正在运行的容器。
启动或停止容器:
docker start <容器ID或名称>
docker stop <容器ID或名称>
通过这些命令可以启动或停止指定的容器。
删除容器:
docker rm <容器ID或名称>
这个命令用于删除指定的容器。
在容器中执行命令:
docker exec -it <容器ID或名称> <命令>
这个命令允许你在正在运行的容器中执行特定的命令。
分析容器的配置:
docker inspect <容器ID或名称>
这个命令会返回指定容器的详细配置信息,包括网络设置、挂载的卷、环境变量等。
查看容器标准输出日志:
docker logs <容器ID或名称>
这个命令用于查看容器的标准输出日志,可以用来调试和监视容器的运行情况。
查看镜像:
docker images
这个命令列出本地系统中的Docker镜像列表。
删除镜像:
docker rmi <镜像ID或名称>
这个命令用于删除指定的Docker镜像。