Docker 入门:从安装到跑起第一个容器
·
Docker 入门:从安装到跑起第一个容器
不是原理课——每步都动手,看完就能跑起来。
容器是什么,一句话
把你写的程序 + 它依赖的所有东西(库、配置文件)打成包,去哪都能跑,环境一模一样。开发机能跑,服务器就能跑。
第一步:安装 Docker
# Ubuntu
sudo apt update
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
# CentOS
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce
sudo systemctl start docker
sudo systemctl enable docker
验证装好了没:
docker version
如果报 permission denied(必须用 root 或自己在 docker 组):
sudo usermod -aG docker $USER
newgrp docker # 立即生效,不需要重新登录
第二步:跑起第一个容器
docker run hello-world
输出:
Hello from Docker!
这个命令做了三件事:
- 本地找有没有叫
hello-world的镜像,没有 - 去 Docker Hub 下载
- 用这个镜像启动一个容器,跑完退出
核心概念:镜像 vs 容器
docker images # 已下载的镜像(类似安装包)
docker ps # 正在运行的容器
docker ps -a # 所有容器,包括已退出的
用类比记:
- 镜像 = 安装包 ISO
- 容器 = 装完跑起来的系统
- 一个镜像可以启动多个容器
第三步:跑一个 Nginx 持久运行
docker run -d --name mynginx -p 8080:80 nginx
参数拆解:
| 参数 | 含义 |
|---|---|
-d |
后台运行 |
--name mynginx |
给容器起个名字,方便后面操作 |
-p 8080:80 |
本机 8080 端口映射到容器的 80 端口 |
nginx |
镜像名 |
验证:
curl http://localhost:8080
浏览器打开也一样,看到 Nginx 欢迎页。
第四步:容器生命周期管理
docker ps # 看正在运行的
docker stop mynginx # 停止
docker start mynginx # 重新启动
docker restart mynginx # 重启
docker rm mynginx # 删除(得先 stop)
docker rm -f mynginx # 强制删除(运行中也删)
看容器内部
# 看日志
docker logs mynginx
# 实时看
docker logs -f mynginx
# 只看最后 20 行
docker logs --tail 20 mynginx
# 进入容器内部
docker exec -it mynginx bash
-it 是交互式终端的意思,进去后就是容器里的 Linux 了,可以随便操作。exit 退出。
第五步:写一个 Dockerfile,把自己的代码打包
项目结构
myapp/
├── app.py
└── Dockerfile
app.py:
from http.server import HTTPServer, BaseHTTPRequestHandler
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-Type', 'text/html')
self.end_headers()
self.wfile.write(b'<h1>Hello Docker</h1>')
HTTPServer(('0.0.0.0', 3000), Handler).serve_forever()
Dockerfile:
FROM python:3.11-slim
WORKDIR /app
COPY app.py .
EXPOSE 3000
CMD ["python", "app.py"]
逐行解释
| 指令 | 干什么 |
|---|---|
FROM |
基于哪个镜像。slim 是精简版,体积小 |
WORKDIR |
容器里的工作目录,没有就创建 |
COPY |
把本地的文件复制到容器里 |
EXPOSE |
声明这个容器会监听 3000 端口 |
CMD |
容器启动时要执行的命令 |
构建并运行
# 在 myapp 目录下
docker build -t myapp:v1 .
# 跑起来
docker run -d --name myapp -p 3000:3000 myapp:v1
# 验证
curl http://localhost:3000
# 输出:<h1>Hello Docker</h1>
第六步:挂载目录,改代码不用重建
开发时改一次代码就要 docker build 一次很烦。把本地目录挂到容器里:
docker run -d --name myapp \
-p 3000:3000 \
-v $(pwd):/app \
myapp:v1
-v $(pwd):/app — 把当前目录映射到容器的 /app。本地改了代码,容器里立即生效。
第七步:docker-compose 跑一套 Web + MySQL
单个容器还行,多个服务配合(Web + 数据库 + Redis)手动 docker run 很麻烦。
docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
启动:
docker-compose up -d
两条服务一起跑起来了。停止:
docker-compose down
加上 -v 会同时删掉数据卷(清空数据库):
docker-compose down -v
常用命令速查
# 镜像相关
docker images # 本地有哪些镜像
docker pull nginx:alpine # 下载镜像
docker rmi myapp:v1 # 删除镜像
docker build -t name:tag . # 构建镜像
# 容器相关
docker ps # 运行的容器
docker ps -a # 全部容器
docker stop <name> # 停止
docker start <name> # 启动
docker restart <name> # 重启
docker rm <name> # 删除
docker rm -f <name> # 强制删除
# 查看
docker logs -f <name> # 实时日志
docker exec -it <name> bash # 进入容器
docker inspect <name> # 查看详细配置
# 清理
docker system prune -a # 清掉没用的镜像、容器、网络
Docker Hub:公共镜像仓库
https://hub.docker.com 上有各类官方镜像。下载时可以用 :tag 指定版本:
docker pull nginx:1.25-alpine # 指定版本 + alpine(超小)
docker pull mysql:8.0
docker pull redis:7-alpine
docker pull node:20-slim
alpine 是超精简版 Linux(约 5M),没有 bash 只有 sh,进去用 sh 不是 bash。
总结
学会了就能干这些事:
| 要做的事 | 对应命令 |
|---|---|
| 试一个软件跑跑看 | docker run mysql:8.0 |
| 把自己的服务打包 | 写 Dockerfile → docker build → docker run |
| 开发时本地跑全套环境 | docker-compose.yml → docker-compose up -d |
| 部署到服务器 | 服务器装 Docker → docker run 同样的命令 |
容器不神秘,就是把你的应用变成随地可跑的标准单元。
更多推荐




所有评论(0)