长安的Docker教程长安的Docker教程
首页
快速开始
编程指南
首页
快速开始
编程指南
  • 🎯 Docker入门篇

    • 快速开始
    • Docker是什么?
    • 为什么要用Docker?
    • 安装Docker
    • 第一个容器
  • 📦 Docker基础篇

    • Docker镜像详解
    • 容器操作详解
    • 编写Dockerfile
    • 数据卷(Volumes)
    • Docker网络
  • ⚡ Docker进阶篇

    • Docker Compose
    • 多阶段构建
    • Docker性能优化
    • Docker最佳实践
  • 🚀 实战项目

    • 实战:部署Node.js应用
    • 实战:搭建数据库环境
    • 实战:微服务架构
  • 💡 常见问题

    • 常见问题排查
    • 实用技巧

第一个容器

嘿!长安又来了!Docker装好了,现在咱们来运行第一个容器,体验一下Docker的魔力!✨

🎯 准备工作

打开你的终端:

  • Windows:PowerShell或CMD
  • Mac/Linux:Terminal

确认Docker正常运行:

docker --version

看到版本号?OK,咱们开始!

🚀 Hello World - Docker版

第一个命令

来,跟着长安敲:

docker run hello-world

然后回车!

你会看到:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:1234...
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.
 3. The Docker daemon created a new container from that image...
 4. The Docker daemon streamed that output to the Docker client...

...

恭喜你! 你刚刚运行了第一个Docker容器!🎉🎉🎉

发生了什么?

长安给你解释一下刚才发生了什么:

1. 你运行了 docker run hello-world
   ↓
2. Docker在本地找 hello-world 镜像(没找到)
   ↓
3. Docker去Docker Hub下载 hello-world 镜像
   ↓
4. Docker用这个镜像创建了一个容器
   ↓
5. 容器运行,输出了欢迎信息
   ↓
6. 容器退出(工作完成)

就像:

你:给我来个汉堡!
店员:没现成的,我去厨房做一个
     ↓ (做汉堡)
店员:汉堡做好了,给你!
你:谢谢!(吃完)

🌐 来点实际的 - 运行一个Web服务器

Hello World太简单了,咱们来点有意思的——运行一个真正的Web服务器!

运行Nginx

docker run -d -p 8080:80 --name my-nginx nginx

让长安解释一下这个命令:

docker run          # 运行容器
  -d                # 后台运行(detached模式)
  -p 8080:80        # 端口映射:把容器的80端口映射到本机的8080端口
  --name my-nginx   # 给容器起个名字
  nginx             # 使用nginx镜像

你会看到:

Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
...
Status: Downloaded newer image for nginx:latest
7c3e3d4b8f9a2d1e3c4b5a6f7e8d9c0b1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6

最后那一串是容器ID。

验证

打开浏览器,访问:http://localhost:8080

看到nginx欢迎页面了吗? 🎉

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working.
...

牛逼! 你刚刚用一行命令启动了一个Web服务器!

在传统方式下,你需要:

  1. 下载nginx
  2. 安装nginx
  3. 配置nginx
  4. 启动nginx

用Docker?一行命令,10秒搞定! 🚀

📦 查看容器

查看正在运行的容器

docker ps

输出:

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
7c3e3d4b8f9a   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:8080->80/tcp   my-nginx

这个表格告诉你:

  • CONTAINER ID:容器ID(简短版)
  • IMAGE:使用的镜像
  • COMMAND:容器启动时运行的命令
  • CREATED:创建时间
  • STATUS:状态(Up = 运行中)
  • PORTS:端口映射
  • NAMES:容器名字

查看所有容器(包括已停止的)

docker ps -a

你会看到之前运行的hello-world容器:

CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
7c3e3d4b8f9a   nginx         "..."      5 minutes ago    Up 5 minutes                ...       my-nginx
a1b2c3d4e5f6   hello-world   "/hello"   10 minutes ago   Exited (0) 10 minutes ago             eager_darwin

🎮 操作容器

停止容器

docker stop my-nginx

刷新浏览器,nginx访问不了了吧?因为容器停了!

启动容器

docker start my-nginx

刷新浏览器,又能访问了!✅

重启容器

docker restart my-nginx

查看容器日志

docker logs my-nginx

你会看到nginx的访问日志:

172.17.0.1 - - [01/Dec/2024:10:30:45 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0..."
172.17.0.1 - - [01/Dec/2024:10:30:46 +0000] "GET /favicon.ico HTTP/1.1" 404 555 ...

进入容器内部

想进容器里面看看吗?

docker exec -it my-nginx bash

你会看到:

root@7c3e3d4b8f9a:/#

你现在在容器里面了! 就像进入了一个小型Linux系统。

试试这些命令:

# 查看当前目录
pwd
# 输出:/

# 查看nginx配置
cat /etc/nginx/nginx.conf

# 查看nginx进程
ps aux | grep nginx

# 退出容器
exit

太神奇了! 你刚刚进入了容器内部,又退出来了!

🗑️ 删除容器

停止并删除容器

# 先停止
docker stop my-nginx

# 再删除
docker rm my-nginx

或者一行搞定(强制删除):

docker rm -f my-nginx

验证一下:

docker ps -a

my-nginx不见了!

🎨 来点好玩的

1. 运行一个Python环境

不想装Python?用Docker!

docker run -it python:3.11 python

你会看到Python交互式环境:

Python 3.11.6 (main, Oct  2 2023, 13:45:54) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

试试:

>>> print("Hello from Docker!")
Hello from Docker!
>>> 1 + 1
2
>>> exit()

一秒钟就有了Python环境! 不需要安装,不污染系统!

2. 运行一个MySQL数据库

想试试MySQL?

docker run -d \
  --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -p 3306:3306 \
  mysql:8.0

几秒钟后,MySQL就启动了!

连接测试:

docker exec -it my-mysql mysql -uroot -p123456

你会进入MySQL命令行:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

mysql> exit

爽不爽? 几秒钟就有了MySQL数据库!

不要了?删掉:

docker rm -f my-mysql

干净得很!

3. 运行一个Redis

docker run -d --name my-redis -p 6379:6379 redis

测试:

docker exec -it my-redis redis-cli

127.0.0.1:6379> SET name "长安"
OK
127.0.0.1:6379> GET name
"长安"
127.0.0.1:6379> exit

是不是觉得Docker太方便了? 😍

📚 常用命令小抄

长安给你整理了一个命令速查表:

# 运行容器
docker run <镜像名>                # 运行容器
docker run -d <镜像名>             # 后台运行
docker run -it <镜像名>            # 交互式运行
docker run -p 8080:80 <镜像名>     # 端口映射
docker run --name <名字> <镜像名>  # 指定名字

# 查看容器
docker ps                          # 查看运行中的容器
docker ps -a                       # 查看所有容器

# 操作容器
docker start <容器>                # 启动容器
docker stop <容器>                 # 停止容器
docker restart <容器>              # 重启容器
docker rm <容器>                   # 删除容器
docker rm -f <容器>                # 强制删除容器

# 查看信息
docker logs <容器>                 # 查看日志
docker logs -f <容器>              # 实时查看日志
docker exec -it <容器> bash        # 进入容器

# 清理
docker stop $(docker ps -q)        # 停止所有容器
docker rm $(docker ps -aq)         # 删除所有容器

建议保存这个表! 以后经常用得到。

💡 小结

今天长安带你体验了Docker的魔力:

  1. 运行了hello-world:验证Docker安装
  2. 启动了nginx:一行命令搞定Web服务器
  3. 学会了容器操作:启动、停止、删除、进入
  4. 尝试了各种环境:Python、MySQL、Redis

核心命令

docker run      # 运行容器
docker ps       # 查看容器
docker stop     # 停止容器
docker start    # 启动容器
docker rm       # 删除容器
docker logs     # 查看日志
docker exec     # 进入容器

🤔 你可能会问

Q1:容器和镜像有什么区别?

镜像:模板(只读)
容器:镜像的运行实例(可读写)

就像:

  • 镜像 = 游戏安装包
  • 容器 = 游戏运行中的进程

Q2:删除容器会删除镜像吗?

不会! 容器和镜像是分开的。

删除容器:docker rm <容器>
删除镜像:docker rmi <镜像>

Q3:容器停止后,数据还在吗?

在! 但容器删除后,数据就没了(除非你用了数据卷,后面会讲)。

🚀 下一步

现在你会运行容器了,但还有很多疑问对吧?

  • 镜像到底是什么?
  • 怎么管理镜像?
  • 怎么制作自己的镜像?

别急,下一章长安会详细讲解 Docker镜像!


💬 长安的感慨:

还记得我第一次运行Docker容器的时候,那种感觉就像魔法一样!

"什么?一秒钟就启动了一个MySQL?"
"什么?不用安装直接就能用Python?"
"什么?删了就真的干干净净?"

从那天起,我就爱上了Docker。希望你也是!😊

下一章见,继续跟着长安学Docker,包你学会!💪

🌐 有问题来这里:编程指南

在 GitHub 上编辑此页
Prev
安装Docker