第一个容器
嘿!长安又来了!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服务器!
在传统方式下,你需要:
- 下载nginx
- 安装nginx
- 配置nginx
- 启动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的魔力:
- 运行了hello-world:验证Docker安装
- 启动了nginx:一行命令搞定Web服务器
- 学会了容器操作:启动、停止、删除、进入
- 尝试了各种环境: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,包你学会!💪
🌐 有问题来这里:编程指南
