Docker 基础教程:安装与你的第一个容器运行 (编程专家的幽默解说)
各位观众老爷们,欢迎来到“码农脱口秀”现场!我是你们的老朋友,Bug终结者、代码雕刻家、键盘上的舞蹈家——程序猿阿甘!今天,我们要聊一个时髦又实用的话题:Docker!
啥?Docker?是不是听起来像码头工人?没错,它就是码头工人的数字化版本,专门帮你打包、运输、部署各种软件应用。想象一下,你辛辛苦苦写好的代码,在你的电脑上运行得飞起,结果到了测试环境、生产环境,就各种“水土不服”,报错连连,让你抓耳挠腮,恨不得把电脑砸了。这时候,Docker就像一位超级靠谱的搬运工,把你的代码、运行环境、依赖项,全部打包到一个“集装箱”里,保证无论在哪里,都能完美运行,绝不掉链子!😎
今天,阿甘就手把手教你,如何安装Docker,并运行你的第一个容器。别害怕,这比你想象的简单多了!
第一步:准备工作 – 磨刀不误砍柴工
就像盖房子要先打地基,运行Docker也要先安装它。不同的操作系统,安装方式略有不同,咱们一个个来:
1. Windows 篇 (建议使用 WSL2,体验更佳)
-
Docker Desktop for Windows: 官方推荐,功能齐全,但对系统版本有要求 (Windows 10 64-bit Pro, Enterprise, or Education)。
- 下载地址: https://www.docker.com/products/docker-desktop/
- 安装步骤: 双击下载好的安装包,一路“Next”,直到完成。注意:安装过程中可能会提示你启用Hyper-V或WSL2,按照提示操作即可。
- 注意事项: Docker Desktop 对资源消耗较大,如果你的电脑配置不高,可能会有些卡顿。
-
WSL2 (Windows Subsystem for Linux 2): 如果你不想安装Docker Desktop,或者想体验更轻量级的Docker环境,WSL2是个不错的选择。
- 安装步骤:
- 启用 WSL: 以管理员身份运行 PowerShell,执行
wsl --install
命令。 - 安装 Linux 发行版: 从 Microsoft Store 安装你喜欢的 Linux 发行版,比如 Ubuntu。
- 安装 Docker Engine: 进入你安装的 Linux 发行版,按照 Linux 的安装方式安装 Docker Engine。
- 启用 WSL: 以管理员身份运行 PowerShell,执行
- 安装步骤:
2. macOS 篇
- Docker Desktop for Mac: 和 Windows 版类似,功能强大,易于使用。
- 下载地址: https://www.docker.com/products/docker-desktop/
- 安装步骤: 双击下载好的 .dmg 文件,将 Docker 图标拖到 Applications 文件夹。
- 注意事项: Docker Desktop 需要 macOS 10.15 或更高版本。
3. Linux 篇
-
Docker Engine: Linux 系统通常使用 Docker Engine,它是 Docker 的核心组件。
-
安装步骤: 不同 Linux 发行版的安装方式略有不同,这里以 Ubuntu 为例:
- 更新 apt 包索引:
sudo apt-get update
- 安装依赖包:
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
- 添加 Docker 的 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- 设置 Docker 仓库:
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
- 再次更新 apt 包索引:
sudo apt-get update
- 安装 Docker Engine:
sudo apt-get install docker-ce docker-ce-cli containerd.io
- 更新 apt 包索引:
-
其他发行版: 对于 CentOS, Fedora, Debian 等发行版,请参考 Docker 官方文档:https://docs.docker.com/engine/install/
-
安装完成后,我们需要验证一下 Docker 是否安装成功。
打开你的终端 (Windows 下是 PowerShell 或 WSL,macOS 下是 Terminal,Linux 下随意),输入以下命令:
docker version
如果看到类似以下的输出,恭喜你,Docker 已经成功安装!🎉
Client: Docker Engine - Community
Version: 20.10.12
API version: 1.41
Go version: go1.16.15
Git commit: e91ed57
Built: Mon Dec 13 11:45:30 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.12
API version: 1.41 (minimum version 1.12)
Go version: go1.16.15
Git commit: 459d0df
Built: Mon Dec 13 11:43:34 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.12
GitCommit: 7b11cfa7cdbb8bc0218a83f06e2e4ef6b472778f
runc:
Version: 1.0.2
GitCommit: v1.0.2-0-g52b36a2
docker-init:
Version: 0.19.0
GitCommit: de40ad0
第二步:初探 Docker – Hello World!
现在,我们来运行你的第一个 Docker 容器。就像学习编程语言要从“Hello World!”开始一样,我们也要从一个简单的镜像开始。
Docker Hub 是一个公共的 Docker 镜像仓库,里面存放了大量的镜像,你可以把它想象成一个巨大的软件商店。我们今天要使用的镜像,就是官方的 hello-world
镜像。
在终端中输入以下命令:
docker run hello-world
按下回车键,稍等片刻,你可能会看到类似以下的输出:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:c3b39bb44735a8b3a0585ced3a65a847c2f24cdb2d43273c2d9c0441059e1c70
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
恭喜你!你已经成功运行了你的第一个 Docker 容器! 🎉🎉🎉
让我们来解读一下这个过程:
docker run hello-world
命令告诉 Docker 运行hello-world
镜像。- 由于本地没有
hello-world
镜像,Docker 会自动从 Docker Hub 下载它。 - Docker 使用
hello-world
镜像创建一个容器,并运行容器中的程序。 - 容器中的程序输出了 "Hello from Docker!" 等信息。
- 容器运行完毕后,会自动停止。
第三步:深入了解 Docker – 常用命令
运行 hello-world
只是一个开始,Docker 还有很多强大的功能等着你去探索。下面,阿甘为你介绍一些常用的 Docker 命令:
命令 | 功能 | 示例 |
---|---|---|
docker pull |
从 Docker Hub 或其他镜像仓库下载镜像 | docker pull ubuntu:latest (下载最新版本的 Ubuntu 镜像) |
docker images |
列出本地已下载的镜像 | docker images |
docker run |
创建并运行一个容器 | docker run -it ubuntu bash (创建一个 Ubuntu 容器,并进入容器的 bash shell) |
docker ps |
列出正在运行的容器 | docker ps |
docker ps -a |
列出所有容器 (包括已停止的) | docker ps -a |
docker stop |
停止一个正在运行的容器 | docker stop <container_id> (其中 <container_id> 是容器的 ID,可以通过 docker ps 命令查看) |
docker start |
启动一个已停止的容器 | docker start <container_id> |
docker restart |
重启一个容器 | docker restart <container_id> |
docker rm |
删除一个已停止的容器 | docker rm <container_id> |
docker rmi |
删除一个镜像 | docker rmi <image_id> (其中 <image_id> 是镜像的 ID,可以通过 docker images 命令查看) |
docker exec |
在一个正在运行的容器中执行命令 | docker exec -it <container_id> bash (进入容器的 bash shell) |
docker build |
使用 Dockerfile 构建镜像 | docker build -t my-app . (在当前目录下查找 Dockerfile,构建一个名为 my-app 的镜像) |
docker logs |
查看容器的日志 | docker logs <container_id> |
docker push |
将镜像推送到 Docker Hub 或其他镜像仓库 | docker push <your_username>/my-app:latest (将名为 my-app 的镜像推送到你的 Docker Hub 账号) |
docker compose |
使用 docker-compose.yml 文件管理多个容器 | docker-compose up -d (启动 docker-compose.yml 文件中定义的所有服务,并以后台模式运行) |
这些命令就像你的武器库,熟练掌握它们,你就能轻松驾驭 Docker,成为容器世界的霸主!💪
第四步:实战演练 – 运行一个 Web 应用
光说不练假把式,现在我们来做一个更实际的例子:运行一个简单的 Web 应用。
- 创建一个简单的 Python Web 应用 (app.py):
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "<h1>Hello, Docker!</h1>"
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0')
这个 Python 应用使用 Flask 框架,对外提供一个简单的 HTTP 接口,返回 "Hello, Docker!"。
- 创建一个 requirements.txt 文件,声明依赖项:
Flask
- 创建一个 Dockerfile 文件,描述如何构建镜像:
FROM python:3.9-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
这个 Dockerfile 告诉 Docker:
- 使用
python:3.9-slim-buster
镜像作为基础镜像。 - 在容器中创建一个
/app
目录作为工作目录。 - 复制
requirements.txt
文件到/app
目录。 - 使用
pip
安装requirements.txt
中声明的依赖项。 - 复制
app.py
文件到/app
目录。 - 暴露容器的 5000 端口。
- 运行
python app.py
命令启动 Web 应用。
- 构建镜像:
在包含 app.py
, requirements.txt
, Dockerfile
文件的目录下,运行以下命令:
docker build -t my-web-app .
这个命令会根据 Dockerfile 构建一个名为 my-web-app
的镜像。
- 运行容器:
docker run -d -p 8080:5000 my-web-app
这个命令会创建一个 my-web-app
容器,并将容器的 5000 端口映射到主机的 8080 端口。-d
参数表示以后台模式运行容器。
- 访问 Web 应用:
打开你的浏览器,访问 http://localhost:8080
,你应该能看到 "Hello, Docker!" 的字样。
成功了!你已经成功运行了一个 Web 应用在 Docker 容器中! 🎉🎉🎉
第五步:进阶之路 – Docker Compose
如果你需要运行多个容器,并且这些容器之间存在依赖关系,那么 Docker Compose 就是你的最佳选择。
Docker Compose 使用 docker-compose.yml
文件来描述你的应用,你可以将多个容器定义在一个文件中,并使用 docker-compose up
命令一次性启动所有容器。
例如,如果你想运行一个包含 Web 应用和数据库的应用,你可以创建一个 docker-compose.yml
文件:
version: "3.9"
services:
web:
image: my-web-app
ports:
- "8080:5000"
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
这个 docker-compose.yml
文件定义了两个服务:
web
: 使用my-web-app
镜像,将容器的 5000 端口映射到主机的 8080 端口,并且依赖于db
服务。db
: 使用postgres:13
镜像,设置 PostgreSQL 数据库的用户名、密码和数据库名,并且使用db_data
volume 来持久化数据。
要启动这些服务,只需在包含 docker-compose.yml
文件的目录下运行以下命令:
docker-compose up -d
Docker Compose 会自动创建并启动所有容器,并处理容器之间的依赖关系。
第六步:总结与展望
恭喜你!你已经完成了 Docker 的入门学习,掌握了 Docker 的基本概念和常用命令。
Docker 的强大之处在于它的灵活性和可移植性,它可以帮助你:
- 简化开发流程: Docker 可以让你在一致的环境中开发、测试和部署应用,避免环境差异带来的问题。
- 提高资源利用率: Docker 容器比虚拟机更轻量级,可以更有效地利用系统资源。
- 加速应用交付: Docker 可以让你快速打包、部署和扩展应用,缩短应用交付周期。
Docker 是一个不断发展的技术,还有很多高级特性等着你去探索,比如:
- Docker Swarm: 用于管理和编排多个 Docker 容器。
- Kubernetes: 一个更强大的容器编排平台,可以管理大规模的 Docker 集群。
- Docker security: 保证 Docker 容器的安全性。
希望这篇教程能帮助你入门 Docker,并在你的开发工作中发挥作用。记住,学习编程就像学游泳,光看教程是没用的,一定要多动手实践!
最后,阿甘祝你:代码无 Bug,Bug 无处藏,Docker 在手,天下我有! 感谢大家的收看,我们下期再见! 👋