话说,默子已经很久没有写技术博客了,今天写一篇关于Docker的入门知识指南作为练手吧。
同时自己也再回忆一下一些基础的知识
部分内容由
ChatGPT
辅助生成,默子审核添加
什么是Docker
Docker是一种容器
化平台,用于轻松打包、分发和运行应用程序。
它基于容器
技术,可以将应用程序及其依赖项封装到一个容器
中,实现了快速部署和跨平台的优势。
这里的容器
可以简单理解为一个特别轻量化级的虚拟机,并且是配置好了各种应用服务和环境变量的。
Docker的特点以及与虚拟机的不同点
Docker相对于传统虚拟机有以下特点:
- 轻量级:容器共享主机的内核,因此比虚拟机更轻量。
- 快速启动:容器几乎可以瞬间启动,而虚拟机通常需要较长的启动时间。(几秒vs几分钟)
- 高度可移植性:容器可以在不同的环境中运行,保持一致性。
- 资源有效利用:容器可以更有效地利用系统资源。
基本Docker知识
什么是容器
容器
是一个独立运行的应用程序包,包括应用程序和其所有依赖项,例如库、环境变量等。
容器
是Docker的核心概念,它们可以在不同的环境中进行部署,而不会影响其运行。
什么是镜像
镜像是容器的模板,包含了用于创建容器的文件系统、环境配置和应用程序代码。镜像是只读的,用于创建容器实例。
DockerHub是什么
DockerHub是一个Docker的镜像
仓库,可以用于存储和分享Docker镜像
。它是一个社区驱动的平台,包含了大量的公共镜像
供使用。
常见Docker指令
Docker提供了丰富的命令行工具,用于管理容器和镜像。一些常见的Docker指令包括docker run
、docker build
、docker pull
等。
指令 | 描述 | 示例 |
---|---|---|
docker pull | 从DockerHub下载镜像到本地 | docker pull ubuntu:20.04 |
docker build | 使用Dockerfile构建自定义镜像 | docker build -t my-custom-image . |
docker run | 运行容器实例 | docker run -d -p 8080:80 nginx |
docker stop | 停止运行中的容器 | docker stop container_id |
docker ps | 显示运行中的容器列表 | docker ps |
docker images | 列出本地镜像列表 | docker images |
docker exec | 在运行中的容器中执行命令 | docker exec -it container_id /bin/bash |
docker rm | 删除容器 | docker rm container_id |
docker rmi | 删除镜像 | docker rmi image_id |
docker-compose up | 使用Docker Compose启动多个容器服务 | docker-compose up -d |
Dockerfile详解
Dockerfile是一个文本文件,包含了用于构建Docker镜像的指令。
它可以定义基础镜像、安装依赖、配置环境等,是自动化构建镜像的关键。
可以理解为是一个 定义环境配置流水线
的工具
比如我要制作一个Ubuntu20.04环境下的Python环境,那就应该编写这样的Dockerfile
# 使用Ubuntu 20.04作为基础镜像
FROM ubuntu:20.04
# 安装Python 3和pip
RUN apt-get update && apt-get install -y python3 python3-pip
# 将工作目录设置为/app
WORKDIR /app
# 将当前目录下的所有文件复制到工作目录中
COPY . /app
# 使用pip安装应用程序依赖
RUN pip3 install -r requirements.txt
# 暴露应用程序的端口
EXPOSE 8080
# 定义启动命令
CMD ["python3", "app.py"]
Dockerfile中的关键字以及它们的详细解释和用法:
关键字 | 解释和用法 |
---|---|
FROM | 用于指定基础镜像,即构建新镜像的起点。语法通常为 FROM image[:tag] ,可以使用官方或自定义的镜像。示例:FROM ubuntu:20.04 表示使用Ubuntu 20.04作为基础镜像。 |
RUN | 用于在镜像中执行命令,通常用于安装软件包、更新包列表、配置环境等。语法通常为 RUN command ,可以在Dockerfile中包含多个RUN指令。示例:RUN apt-get update && apt-get install -y python3 用于更新包列表并安装Python 3。 |
WORKDIR | 用于设置工作目录,定义在镜像中执行命令的默认目录。语法通常为 WORKDIR /path/to/directory 。示例:WORKDIR /app 将工作目录设置为/app。 |
COPY | 用于将文件或目录从主机复制到镜像中的指定目录。语法通常为 COPY source destination ,可以复制多个文件或目录。示例:COPY . /app 将当前目录下的所有文件复制到工作目录/app。 |
EXPOSE | 用于指定容器要监听的端口号,但不会实际映射端口到主机。语法通常为 EXPOSE port ,可以指定多个端口。示例:EXPOSE 8080 表示容器将监听8080端口。 |
CMD | 用于定义容器启动后要执行的默认命令,通常是应用程序的入口点。语法可以为CMD [“command”, “arg1”, “arg2”]或CMD command arg1 arg2。示例:CMD ["python3", "app.py"] 定义了容器启动时要运行的Python应用程序。 |
更多的关键字可以从这里查到 Dockerfile reference
可持久化容器
可持久化容器是指可以保存状态和数据的Docker容器,通常使用卷(Volume)或绑定挂载(Bind Mounts)来实现数据持久性。
可持久化容器是Docker中的一个关键概念,它们允许容器在停止或删除后保留其状态和数据,以便随后的使用。
-
卷(Volume):卷是Docker中用于持久化数据的一种机制。它们是Docker主机上的目录或文件,可以被容器挂载(mount)到容器的特定路径上。卷的数据在容器删除后仍然存在,并且可以与其他容器共享。卷的创建和管理可以通过Docker命令行或Docker Compose配置文件进行。
示例创建卷的Docker命令:
docker volume create mydata
示例将卷挂载到容器的路径:
docker run -d -v mydata:/app/data my-container
-
绑定挂载(Bind Mounts):绑定挂载允许将主机上的目录或文件直接挂载到容器中,从而实现数据的持久化。绑定挂载通常用于开发和测试环境,可以方便地将本地文件与容器共享。
示例使用绑定挂载的Docker命令:
docker run -d -v /host/path:/container/path my-container
可持久化容器对于需要持久化数据的应用程序非常重要,例如数据库容器、文件存储容器等。
它们确保数据在容器生命周期内得以保留,并且可以被多个容器或主机访问。
一个案例实践
在学习Docker时,可以尝试创建一个简单的Docker容器,例如运行一个Web应用程序或数据库,以加深对Docker的理解。
比如,我们可以尝试创建一个运行Node.js Web应用程序的Docker容器。
- 编写Node.js应用程序:首先,您可以编写一个简单的Node.js Web应用程序。
以下是一个示例的Node.js应用程序代码,将它保存为app.js
文件:
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('你好,欢迎来到默子的博客\n');
});
const port = 3000;
server.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
- 创建Dockerfile:接下来,创建一个名为
Dockerfile
的文件,用于构建Docker镜像。以下是一个简单的Dockerfile示例:
# 使用Node.js 14作为基础镜像
FROM node:14
# 将工作目录设置为/app
WORKDIR /app
# 复制应用程序文件到工作目录
COPY app.js .
# 安装Node.js应用程序依赖
RUN npm install
# 暴露应用程序的端口
EXPOSE 3000
# 定义启动命令
CMD ["node", "app.js"]
- 构建Docker镜像:在Dockerfile所在的目录中,打开终端并运行以下命令以构建镜像。确保已经安装了Docker。
docker build -t my-node-app .
这将根据Dockerfile中的指令构建一个名为my-node-app
的Docker镜像。
- 运行Docker容器:运行以下命令以在Docker容器中运行您的Node.js应用程序:
docker run -d -p 3000:3000 my-node-app
这将在后台运行一个容器,并将主机的端口3000映射到容器的端口3000。
- 访问Web应用程序:在浏览器中访问
http://localhost:3000
参考资料
以下是一些有关Docker的参考资料,可以帮助大家更深入地学习:
原博客传送门:【学习记录】Docker入门指南