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!

这个命令做了三件事:

  1. 本地找有没有叫 hello-world 的镜像,没有
  2. 去 Docker Hub 下载
  3. 用这个镜像启动一个容器,跑完退出

核心概念:镜像 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 builddocker run
开发时本地跑全套环境 docker-compose.yml → docker-compose up -d
部署到服务器 服务器装 Docker → docker run 同样的命令

容器不神秘,就是把你的应用变成随地可跑的标准单元

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐