Docker快速入门
前言
Docker是什么?
Docker是一种开源的容器化平台,用于构建、部署和运行应用程序。它通过使用容器来实现应用程序的隔离和封装,使得应用程序可以在不同的计算环境中以一致的方式运行。
容器是一种轻量级的虚拟化技术,它可以将应用程序及其所有依赖项打包到一个独立的、可移植的容器中。这个容器包含了应用程序所需的所有文件、库、环境变量和配置信息。与传统的虚拟机不同,容器不需要运行完整的操作系统,而是共享主机操作系统的内核,因此它们更加轻量级和高效。
为什么要用Docker?
Docker提供了一个简单而强大的命令行工具和API,使得用户可以轻松地创建、启动、停止和管理容器。它还提供了一个容器镜像的机制,允许用户将容器打包成可重复部署的组件。这些容器镜像可以通过Docker Hub等容器注册中心进行共享和分发,从而加速开发和部署过程。
使用Docker Hub上别人的镜像
要使用Docker Hub上别人的镜像,可以按照以下步骤进行操作:
- 在Docker Hub上搜索所需的镜像。可以在Docker Hub网站(https://hub.docker.com)上使用搜索框来查找特定的镜像,也可以使用
docker search
命令在命令行中进行搜索。 - 选择合适的镜像。浏览搜索结果并找到满足你需求的镜像。通常,镜像名称和标签(tag)的组合用于标识特定版本的镜像。选择适当的标签,可以是最新版本或特定的版本号。
- 下载镜像。使用
docker pull
命令下载所需的镜像。 - 运行容器。使用
docker run
命令来创建并运行一个容器实例。指定下载的镜像名称和其他必要的选项。 - 根据需要进行配置。根据你的应用程序需求,可以使用适当的
docker run
命令选项来配置容器。
docker run
:docker run
命令用于创建并运行一个新的Docker容器。它的主要作用是在容器中启动一个新的应用程序实例。当你运行docker run
命令时,Docker会执行以下操作:
- 创建一个新的容器实例。
- 基于指定的镜像构建容器的文件系统。
- 在容器内运行指定的命令或应用程序。
例如,以下命令将创建一个名为my-container
的新容器,并在其中运行my-image
镜像的默认命令:
bash
docker run --name my-container my-image
使用docker exec
命令,你可以在运行中的Docker容器内部执行任意的命令。
当你运行docker exec
命令时,Docker会执行以下操作:
- 在指定的容器内部执行指定的命令。
- 可以使用交互模式(
-it
选项)或后台模式(默认)运行命令。 - 不会创建新的容器实例,而是在已存在的容器中添加新的执行环境。
如果你有一个名为my-container
的容器,并且想要在其中执行ls
命令来列出容器内的文件和目录,你可以运行以下命令:
docker exec my-container ls
你还可以使用-it
选项以交互模式运行命令,就像在终端中一样。例如:
docker exec -it my-container bash
这将在my-container
容器内部启动一个交互式的Bash会话。
举个栗子
我要用hexo来部署博客,但是我懒得配置环境,那么我就可以选择Docker免去安装环节。
docker pull spurin/hexo
https://hub.docker.com/r/spurin/hexo
这是一个别人已经发布的docker image,我把它拉下来。
使用docker create
命令创建Docker容器:
bash
docker create --name=hexo-blog\
-e HEXO_SERVER_PORT=4000 \
-e GIT_USER="Your Name" \
-e GIT_EMAIL="your.email@domain.tld" \
-v /blog/domain.com:/app \
-p 4000:4000 \
spurin/hex
其中,
--name=hexo-blog
:通过--name
选项指定了容器的名称。容器名称用于唯一标识容器实例。
-p 4000:4000
:通过-p
选项将主机的端口4000
映射到容器的端口4000
。这样,可以通过主机的4000
端口访问容器内运行的应用程序。
-v /blog/domain.com:/app
:通过-v
选项将主机上的目录/blog/domain.com
挂载到容器内的/app
目录。这意味着主机上的/blog/domain.com
目录中的文件将在容器内的/app
目录中可见和可访问。
-e HEXO_SERVER_PORT=4000
:通过-e
选项设置了环境变量HEXO_SERVER_PORT
的值为4000
。这个环境变量能在容器内的应用程序中使用。
Docker,启动!!!!:
bash
docker start hexo-blog
可以看到启动后的docker里面有了个linux一样的目录,app目录下把本地的文件夹挂载进了容器里面。
可以通过docker正常使用hexo了。
进入
bash
docker exec -it hexo-blog bash
生成
bash
docker exec -it hexo-blog hexo g
docker exec
:这是Docker命令的一部分,用于在运行中的容器内部执行命令。-it
:这是docker exec
命令的选项之一,用于以交互模式运行命令并分配一个伪终端(pseudo-TTY)。这使得在容器内部执行命令时可以进行交互式的输入和输出。hexo-blog
:这是容器的名称或容器ID。通过指定容器名称或ID,docker exec
命令可以确定要在哪个容器内部执行命令。hexo g
:这是要在容器内部执行的命令。在这个例子中,hexo g
是一个命令行命令,它将在容器内部运行Hexo命令行工具的generate
命令(简写为g
)。这个命令用于生成静态网站内容。
Docker的常用命令
- 镜像相关命令:
docker images
:列出本地所有的镜像。docker pull <镜像名>
:从容器注册中心(如Docker Hub)下载指定的镜像。docker push <镜像名>
:将本地的镜像推送到容器注册中心。docker rmi <镜像名>
:删除指定的镜像。
- 容器相关命令:
docker ps
:列出当前正在运行的容器。docker ps -a
:列出所有的容器,包括停止运行的容器。docker run <镜像名>
:创建并运行一个新容器。docker start <容器ID或名称>
:启动一个已经创建的容器。docker stop <容器ID或名称>
:停止一个正在运行的容器。docker rm <容器ID或名称>
:删除一个已经停止的容器。docker exec -it <容器ID或名称> <命令>
:在运行的容器中执行指定命令。
- 日志和查看命令:
docker logs <容器ID或名称>
:查看容器的日志输出。docker inspect <容器ID或名称>
:查看容器的详细信息,包括IP地址、端口映射等。docker stats
:实时显示运行容器的资源使用情况。
- 构建和管理镜像命令:
docker build -t <镜像名> <Dockerfile路径>
:根据Dockerfile构建一个新的镜像。docker tag <现有镜像名> <新镜像名>
:为现有镜像添加一个标签。docker commit <容器ID或名称> <新镜像名>
:根据容器创建一个新的镜像。
可以使用docker --help
命令查看完整的Docker命令列表和帮助信息。
构建Docker
构建Docker镜像的主要步骤是编写一个称为Dockerfile的文本文件,并使用Docker命令来执行构建过程。
下面是一个简单的Docker镜像构建的示例流程:
- 创建一个空目录,作为构建上下文(build context)。
- 在该目录下创建一个名为
Dockerfile
的文本文件。 - 使用文本编辑器打开
Dockerfile
文件,并按照以下格式编写构建指令:
dockerfile
# 基础镜像
FROM <基础镜像>
# 设置工作目录
WORKDIR /app
# 复制应用程序文件到容器中
COPY <本地文件路径> <容器目标路径>
# 安装应用程序依赖
RUN <命令>
# 暴露容器端口
EXPOSE <端口号>
# 定义容器启动时执行的命令
CMD <命令>
在上述Dockerfile
中,你需要替换以下内容:
<基础镜像>
:选择适合你应用程序的基础镜像,例如ubuntu:latest
或node:14
。<本地文件路径>
:指定本地应用程序文件的路径。这可以是单个文件或整个目录。<容器目标路径>
:指定将文件复制到容器中的目标路径。<命令>
:在构建过程中需要执行的命令,例如安装软件包、运行脚本等。<端口号>
:将容器内的端口映射到主机上的端口,以便访问应用程序。
- 保存并关闭
Dockerfile
文件。 - 在终端中,使用
cd
命令切换到包含Dockerfile
的目录。 - 执行以下命令来构建Docker镜像:
bash
docker build -t <镜像名> .
在上述命令中,你需要替换<镜像名>
为你想要给镜像命名的名称,可以是任何合法的名称。.
表示构建上下文的路径,这里指的是当前目录。
- Docker将根据
Dockerfile
中的指令执行构建过程,并下载所需的基础镜像、复制文件、执行命令等。构建过程可能需要一些时间,具体取决于镜像大小和指令复杂性。 - 构建完成后,可以使用
docker images
命令查看已构建的镜像列表,找到刚才构建的镜像。