Docker新手教程:从安装到部署你的第一个容器
Docker 新手教程:从安装到部署你的第一个容器
Docker 已经成为现代软件开发和部署中不可或缺的工具。它通过容器化技术,提供了一种轻量级、可移植、自包含的环境,使得应用程序在任何地方都能以相同的方式运行。无论你是开发人员、运维工程师还是技术爱好者,学习 Docker 都将极大地提升你的工作效率和技能。
本教程将从零开始,手把手教你安装 Docker,理解 Docker 的核心概念,并最终部署你的第一个容器。让我们开始 Docker 之旅吧!
1. Docker 是什么?为什么使用 Docker?
在深入安装和使用之前,我们需要先理解 Docker 是什么,以及它为什么如此受欢迎。
1.1. 什么是 Docker?
Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
你可以将 Docker 容器想象成一个轻量级的、独立的“盒子”。这个“盒子”里包含了运行应用程序所需的一切:代码、运行时环境、系统工具、系统库、设置等。无论你将这个“盒子”放在哪里(开发者的笔记本电脑、测试服务器、生产环境的云服务器),它都能以完全相同的方式运行。
1.2. 为什么使用 Docker?
Docker 的优势在于它解决了软件开发和部署中长期存在的一些痛点:
- 环境一致性: Docker 确保了应用程序在不同环境(开发、测试、生产)中的一致性。不再有“在我机器上可以运行”的问题。
- 快速部署: Docker 容器启动速度非常快(通常在几秒钟内),远快于传统的虚拟机。
- 资源隔离: 每个 Docker 容器都有自己的文件系统、进程空间和网络接口,彼此隔离,互不干扰。
- 轻量级: Docker 容器共享宿主机的操作系统内核,因此比虚拟机更加轻量级,占用资源更少。
- 可移植性: Docker 容器可以在任何支持 Docker 的平台上运行,无需修改。
- 版本控制: Docker 镜像可以进行版本控制,方便回滚到之前的版本。
- 社区支持: Docker 拥有庞大的社区和丰富的生态系统,提供了大量的预构建镜像和工具。
2. Docker 安装
Docker 支持多种平台,包括 Linux、Windows 和 macOS。下面我们将分别介绍在这些平台上的安装方法。
2.1. Linux 平台安装 (以 Ubuntu 为例)
大多数 Linux 发行版都提供了 Docker 的软件包。这里以 Ubuntu 为例,介绍安装步骤:
-
更新软件包索引:
bash
sudo apt update -
安装依赖包:
bash
sudo apt install apt-transport-https ca-certificates curl software-properties-common -
添加 Docker 的官方 GPG 密钥:
bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg -
设置 Docker 稳定版仓库:
bash
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null -
再次更新软件包索引:
bash
sudo apt update -
安装 Docker Engine:
bash
sudo apt install docker-ce docker-ce-cli containerd.io -
验证安装:
bash
sudo docker run hello-world如果看到 "Hello from Docker!" 的输出,说明安装成功。
-
(可选)将当前用户添加到 docker 用户组,避免每次都输入sudo
sudo usermod -aG docker $USER
然后,注销并重新登录,或者重启系统,以使更改生效。
2.2. Windows 平台安装
在 Windows 上安装 Docker,推荐使用 Docker Desktop。Docker Desktop 是一个易于安装的应用程序,它包含了 Docker Engine、Docker CLI 客户端、Docker Compose、Docker Content Trust、Kubernetes 和 Credential Helper。
-
下载 Docker Desktop:
访问 Docker 官网 https://www.docker.com/products/docker-desktop 下载适用于 Windows 的 Docker Desktop 安装程序。 -
安装 Docker Desktop:
双击下载的安装程序,按照提示进行安装。安装过程中可能需要启用 Hyper-V 或 WSL 2(Windows Subsystem for Linux 2)。 -
启动 Docker Desktop:
安装完成后,Docker Desktop 会自动启动。你可以在系统托盘中找到 Docker 图标。 -
验证安装:
打开 PowerShell 或命令提示符,运行以下命令:bash
docker run hello-world如果看到 "Hello from Docker!" 的输出,说明安装成功。
2.3. macOS 平台安装
在 macOS 上安装 Docker,同样推荐使用 Docker Desktop。
-
下载 Docker Desktop:
访问 Docker 官网 https://www.docker.com/products/docker-desktop 下载适用于 macOS 的 Docker Desktop 安装程序。 -
安装 Docker Desktop:
双击下载的 .dmg 文件,将 Docker 图标拖动到 Applications 文件夹中。 -
启动 Docker Desktop:
在 Applications 文件夹中找到 Docker 并启动。 -
验证安装:
打开终端,运行以下命令:bash
docker run hello-world如果看到 "Hello from Docker!" 的输出,说明安装成功。
3. Docker 核心概念
在开始使用 Docker 之前,我们需要了解一些核心概念:
- 镜像 (Image): Docker 镜像是一个只读的模板,它包含了运行应用程序所需的所有内容,例如代码、运行时、库、环境变量和配置文件。你可以将镜像看作是应用程序的“快照”。
- 容器 (Container): Docker 容器是镜像的运行实例。每个容器都是隔离的、安全的,并且包含了运行应用程序所需的一切。你可以启动、停止、删除和移动容器。
- 仓库 (Registry): Docker 仓库是用来存储和分享 Docker 镜像的地方。Docker Hub (https://hub.docker.com/) 是官方的公共仓库,包含了大量的预构建镜像。你也可以创建自己的私有仓库。
- Dockerfile: Dockerfile 是一个文本文件,它包含了一系列指令,用于自动化构建 Docker 镜像。通过 Dockerfile,你可以定义镜像的基础镜像、安装依赖、复制文件、设置环境变量等。
- Docker Compose: Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件,你可以配置应用程序的服务、网络和卷,然后使用一个命令启动整个应用程序。
4. Docker 基本操作
安装好 Docker 并了解了核心概念后,我们可以开始学习一些基本的 Docker 操作。
4.1. 搜索镜像
可以使用 docker search
命令在 Docker Hub 上搜索镜像。例如,搜索 Nginx 镜像:
bash
docker search nginx
4.2. 拉取镜像
使用 docker pull
命令从 Docker Hub 或其他仓库拉取镜像。例如,拉取官方的 Nginx 镜像:
bash
docker pull nginx
如果不指定tag,默认是latest
4.3. 查看本地镜像
使用 docker images
命令查看本地已有的镜像:
bash
docker images
4.4. 运行容器
使用 docker run
命令从镜像创建并运行一个容器。例如,运行一个 Nginx 容器:
bash
docker run -d -p 8080:80 nginx
-d
参数表示在后台运行容器。-p 8080:80
参数表示将容器的 80 端口映射到主机的 8080 端口。
现在,你可以在浏览器中访问 http://localhost:8080
,看到 Nginx 的默认欢迎页面。
4.5. 查看正在运行的容器
使用 docker ps
命令查看正在运行的容器:
bash
docker ps
4.6. 查看所有容器(包括已停止的)
使用 docker ps -a
命令查看所有容器,包括已停止的:
bash
docker ps -a
4.7. 停止容器
使用 docker stop
命令停止一个正在运行的容器。你需要指定容器的 ID 或名称:
bash
docker stop <container_id_or_name>
4.8. 启动容器
使用 docker start
命令启动一个已停止的容器:
bash
docker start <container_id_or_name>
4.9. 进入容器
使用 docker exec
命令进入一个正在运行的容器,通常用于调试或执行命令:
bash
docker exec -it <container_id_or_name> bash
或者
bash
docker exec -it <container_id_or_name> /bin/sh
-it
参数表示以交互模式进入容器。bash
或/bin/sh
是要在容器中执行的命令(通常是 shell)。
4.10. 删除容器
使用 docker rm
命令删除一个已停止的容器:
bash
docker rm <container_id_or_name>
如果要删除正在运行的容器,需要先停止容器,或者使用-f
参数强制删除
4.11. 删除镜像
使用 docker rmi
命令删除一个本地镜像:
bash
docker rmi <image_id_or_name>
注意,如果要删除的镜像有容器正在使用,需要先删除容器
5. 构建你自己的 Docker 镜像
虽然 Docker Hub 上有大量的预构建镜像,但在实际工作中,你通常需要构建自己的镜像,以满足特定的需求。
5.1. 编写 Dockerfile
Dockerfile 是构建 Docker 镜像的关键。它是一个文本文件,包含了一系列指令,用于描述如何构建镜像。
下面是一个简单的 Dockerfile 示例,用于构建一个基于 Python 的 Web 应用镜像:
```dockerfile
使用官方 Python 运行时作为基础镜像
FROM python:3.9-slim-buster
设置工作目录
WORKDIR /app
复制 requirements.txt 文件到容器中
COPY requirements.txt ./
安装依赖
RUN pip install --no-cache-dir -r requirements.txt
复制应用程序代码到容器中
COPY . .
设置环境变量
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
暴露端口
EXPOSE 5000
定义启动命令
CMD ["flask", "run"]
```
FROM
指令指定基础镜像。WORKDIR
指令设置工作目录。COPY
指令复制文件到容器中。RUN
指令在容器中执行命令。ENV
指令设置环境变量。EXPOSE
指令暴露端口。CMD
指令定义容器启动时执行的命令。
5.2. 构建镜像
在 Dockerfile 所在的目录下,使用 docker build
命令构建镜像:
bash
docker build -t my-python-app .
-t
参数指定镜像的名称和标签(例如my-python-app:latest
)。.
表示 Dockerfile 在当前目录下。
5.3. 运行自定义镜像
构建完成后,你可以像运行其他镜像一样运行你的自定义镜像:
bash
docker run -d -p 5000:5000 my-python-app
6. 部署你的第一个容器(示例:Node.js 应用)
现在,让我们来部署一个简单的 Node.js 应用作为你的第一个容器。
6.1. 准备 Node.js 应用
创建一个名为 app.js
的文件,内容如下:
```javascript
const http = require('http');
const hostname = '0.0.0.0';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello from Dockerized Node.js App!\n');
});
server.listen(port, hostname, () => {
console.log(Server running at http://${hostname}:${port}/
);
});
```
创建一个名为 package.json
的文件,内容如下:
json
{
"name": "dockerized-nodejs-app",
"version": "1.0.0",
"description": "A simple Node.js app for Docker demo",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {}
}
6.2. 编写 Dockerfile
创建一个名为 Dockerfile
的文件,内容如下:
```dockerfile
使用官方 Node.js 运行时作为基础镜像
FROM node:16
设置工作目录
WORKDIR /usr/src/app
复制 package.json 和 package-lock.json 文件到容器中
COPY package*.json ./
安装依赖
RUN npm install
复制应用程序代码到容器中
COPY . .
暴露端口
EXPOSE 3000
定义启动命令
CMD [ "npm", "start" ]
```
6.3. 构建镜像
在包含 app.js
、package.json
和 Dockerfile
的目录下,运行以下命令构建镜像:
bash
docker build -t my-nodejs-app .
6.4. 运行容器
bash
docker run -d -p 3000:3000 my-nodejs-app
现在,你可以在浏览器中访问 http://localhost:3000
,看到 "Hello from Dockerized Node.js App!" 的输出。
恭喜你!你已经成功部署了你的第一个容器!
7. 进阶学习
本教程只是 Docker 的入门指南,还有很多高级主题值得学习,例如:
- Docker Compose: 用于定义和运行多容器应用程序。
- Docker Volumes: 用于持久化数据,即使容器被删除,数据也不会丢失。
- Docker Networking: 用于容器之间的通信和连接外部网络。
- Docker Swarm: Docker 的内置容器编排工具。
- Kubernetes (K8s): 一个更强大的容器编排平台,与 Docker 兼容。
- CI/CD 集成: 将 Docker 集成到持续集成和持续交付流程中。
建议你继续深入学习 Docker 的官方文档、教程和最佳实践,不断提升你的 Docker 技能。
希望本教程能帮助你入门 Docker,祝你在容器化的道路上一切顺利!