摘要:Docker这东西吧,看着挺唬人,其实用起来也就那么回事。我刚开始也觉得麻烦,后来发现真香了。这篇文章记录了我从安装到实际使用的全过程,没啥高大上的理论,就是手把手教你怎么用。


目录


在这里插入图片描述

Docker到底是干啥的

说实话,我刚开始接触Docker的时候也挺懵的,这玩意儿到底有啥用?不就是个容器嘛,搞得跟多高大上似的。

用了一段时间后我发现,Docker其实就是解决这个问题的:你在自己电脑上开发得好好的,一到服务器上就跑不起来。为啥?环境不一样啊!Python版本不对、依赖包冲突、配置文件不对……这些破事儿谁遇到谁头大。

Docker的思路很简单:我把你的应用连同它需要的所有环境一起打包,就像一个集装箱一样。不管你在哪台机器上跑,只要装了Docker,就能运行。

我用Docker主要干这几件事:

  1. 本地开发环境:比如我想测试个MySQL,不用在自己电脑上装,直接拉个镜像就跑
  2. 部署应用:打包好应用,扔到服务器上就能用
  3. 隔离服务:每个服务跑在自己的容器里,互不干扰
  4. 快速搭建环境:新人入职,一条命令就能把开发环境搭好

就这么简单。

安装配置一步到位

Windows/Mac 安装

如果你用的是Windows或者Mac,那恭喜你,安装超级简单。

步骤:

  1. 访问 https://www.docker.com/products/docker-desktop
  2. 下载对应系统的版本
  3. 双击安装,一路下一步
  4. 安装完重启电脑
  5. 打开Docker Desktop,看到小鲸鱼图标就成功了

整个过程跟装普通软件没啥区别,5分钟搞定。

Linux 安装

在这里插入图片描述

Linux用户稍微麻烦点,但也不难。我以Ubuntu为例:

# 更新包管理器
sudo apt update

# 安装Docker
sudo apt install docker.io

# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
docker --version

重要提示: 如果你不想每次都输sudo,可以把自己加到docker用户组:

sudo usermod -aG docker $USER

然后注销重新登录就行。

验证安装

装好后,跑个测试命令看看:

docker run hello-world

如果看到"Hello from Docker!"的欢迎信息,说明安装成功了。

我第一次看到这个的时候还挺激动的,虽然就一行字,但意味着我的Docker能正常工作了。

核心概念快速理解

在这里插入图片描述

在开始用之前,你得搞清楚几个基本概念。别怕,我尽量说得通俗点。

镜像(Image)vs 容器(Container)

在这里插入图片描述

这个最容易搞混。

镜像就像是安装包或者模板。比如你想装个MySQL,你得先下载MySQL的安装包对吧?这个安装包就是镜像。

容器是镜像运行起来的实例。就像你安装了MySQL后,运行的那个MySQL服务就是容器。

关系:

  • 一个镜像可以运行多个容器
  • 容器是镜像的可运行实例
  • 镜像是只读的,容器是可读写的

类比:

  • 镜像 = 菜谱
  • 容器 = 按菜谱做出来的菜

Dockerfile

Dockerfile就是个脚本文件,告诉Docker怎么构建你的镜像。

比如你想打包一个Python应用,Dockerfile大概长这样:

# 基于Python 3.9镜像
FROM python:3.9

# 设置工作目录
WORKDIR /app

# 复制代码
COPY . /app

# 安装依赖
RUN pip install -r requirements.txt

# 启动命令
CMD ["python", "app.py"]

就这么简单,每行干一件事,一看就懂。

Docker Compose

如果你要跑多个容器(比如Web应用+数据库),一个个启动太麻烦了。Docker Compose就是用来管理多个容器的。

你写一个docker-compose.yml文件,定义好所有服务,然后一条命令就能全部启动。

实操演示:从零开始

好了,理论说得够多了,来点实际的。

实战一:跑个Nginx网站

咱们先从最简单的开始——用Docker跑个Nginx网站。

步骤1:拉取镜像

docker pull nginx

这个命令会从Docker Hub(镜像仓库)下载Nginx镜像。第一次可能需要等会儿,取决于你网速。

步骤2:运行容器

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

让我解释下这串命令:

  • -d:后台运行(不占终端)
  • -p 8080:80:把容器的80端口映射到本机的8080端口
  • --name my-nginx:给容器起个名字
  • nginx:使用的镜像

步骤3:访问测试

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

如果看到Nginx的欢迎页面,恭喜你,成功了!

我第一次看到自己用Docker跑起来的网站时,还挺有成就感的。虽然就是个默认页面,但意味着我搞定了。

常用命令:

# 查看运行中的容器
docker ps

# 停止容器
docker stop my-nginx

# 启动容器
docker start my-nginx

# 删除容器
docker rm my-nginx

# 查看日志
docker logs my-nginx

实战二:打包自己的应用

在这里插入图片描述

光跑别人的镜像有啥意思,咱们来打包自己的应用。

假设你有个简单的Python Flask应用:

# app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, Docker!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

步骤1:创建Dockerfile

在项目根目录创建Dockerfile(注意没后缀):

FROM python:3.9-slim

WORKDIR /app

COPY app.py .

RUN pip install flask

EXPOSE 5000

CMD ["python", "app.py"]

步骤2:构建镜像

docker build -t my-flask-app .
  • -t my-flask-app:给镜像起个名字
  • .:表示当前目录

构建过程会花点时间,Docker会:

  1. 下载Python基础镜像
  2. 复制你的代码
  3. 安装依赖
  4. 打包成镜像

步骤3:运行容器

docker run -p 5000:5000 my-flask-app

访问 http://localhost:5000,就能看到"Hello, Docker!"了。

我当时的感受:

当我第一次把自己写的应用打包成Docker镜像,然后在另一台电脑上跑起来的时候,真的觉得这玩意儿挺牛的。不用配环境,不用装依赖,一条命令就能跑,太爽了。

实战三:用Docker Compose跑多服务应用

在这里插入图片描述

实际项目中,你肯定不止跑一个服务。比如你有Web应用+数据库+Redis,这时候Docker Compose就派上用场了。

场景: 跑个WordPress博客

步骤1:创建docker-compose.yml

version: '3'

services:
  # MySQL数据库
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppass
    volumes:
      - db_data:/var/lib/mysql

  # WordPress
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppass
      WORDPRESS_DB_NAME: wordpress
    depends_on:
      - db

volumes:
  db_data:

看着有点长?其实挺简单的:

  • 定义了两个服务:db(数据库)和wordpress
  • 配置了环境变量
  • 设置了端口映射
  • 创建了数据卷(持久化数据)

步骤2:启动服务

docker-compose up -d

就这么一条命令,Docker会自动:

  1. 下载MySQL和WordPress镜像
  2. 创建容器
  3. 配置网络
  4. 启动所有服务

步骤3:访问WordPress

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

就能看到WordPress的安装页面了,按提示一步步配置就行。

停止服务:

docker-compose down

我当时的体验:

以前搭WordPress,我得:

  1. 装Apache/Nginx
  2. 装MySQL
  3. 装PHP
  4. 配置各种东西
  5. 下载WordPress
  6. 配置文件
  7. 创建数据库
    ……

现在用Docker Compose,一条命令搞定。而且以后要迁移,直接把整个目录拷走就行,环境都在容器里。

实战四:数据持久化

有个问题你肯定会遇到:容器删了,数据也没了

比如你在容器里创建了数据库,结果一不小心把容器删了,数据全没了。咋办?

解决方案:数据卷(Volume)

数据卷就是把你宿主机(你的电脑)的目录挂载到容器里,这样数据就持久化了。

示例:

docker run -d \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=root123 \
  -v /my/own/datadir:/var/lib/mysql \
  mysql:8.0

这里的-v /my/own/datadir:/var/lib/mysql就是:

  • 把本机的/my/own/datadir目录
  • 挂载到容器的/var/lib/mysql目录

这样即使容器删了,数据还在本机的目录里。

我的血泪教训:

刚开始用Docker的时候,我没注意数据持久化,结果一不小心删了容器,数据库全没了。从那以后,我所有重要的服务都用数据卷。

常见问题和解决方案

用Docker这段时间,我遇到了不少坑,总结一下,希望能帮到你。

问题一:权限问题

现象: 运行Docker命令提示权限不足

解决:

# 把自己加到docker组
sudo usermod -aG docker $USER

# 注销重新登录

或者每次命令前加sudo。

问题二:端口被占用

现象: 启动容器提示端口已被占用

解决:

# 查看谁占用了端口
sudo lsof -i :8080

# 杀掉进程
sudo kill -9 <PID>

# 或者换个端口
docker run -p 8081:80 nginx

问题三:容器启动失败

现象: 容器启动后立即退出

解决:

# 查看日志
docker logs <容器名>

# 进入容器调试
docker run -it <镜像名> /bin/bash

一般日志里会告诉你为啥失败。

问题四:磁盘空间不足

现象: Docker占用了太多磁盘空间

解决:

# 清理未使用的资源
docker system prune -a

# 查看磁盘占用
docker system df

警告: prune -a会删除所有未运行的容器和未使用的镜像,谨慎使用。

问题五:网络连接问题

现象: 容器之间无法通信

解决:

# 创建自定义网络
docker network create mynet

# 启动容器时指定网络
docker run --network=mynet --name=app1 myapp
docker run --network=mynet --name=app2 myapp2

# 现在app1可以通过app2的名字访问app2

问题六:镜像下载慢

现象: pull镜像速度很慢(国内常见)

解决: 配置国内镜像源

编辑/etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com"
  ]
}

然后重启Docker:

sudo systemctl restart docker

一些使用建议

用了一段时间Docker,总结几点心得:

给新手的建议

  1. 别怕犯错:容器删了就删了,重新拉镜像就行,不会搞坏系统
  2. 从简单开始:先跑个Nginx、MySQL试试水,别一上来就搞复杂的
  3. 多看日志:出问题了先看docker logs,一般能找到原因
  4. 学会搜索:99%的问题网上都有答案,善用Google和Stack Overflow

最佳实践

  1. 使用官方镜像:尽量用官方或知名镜像,安全第一
  2. 定期清理:不用的镜像、容器及时删除,省空间
  3. 数据持久化:重要数据一定用volume
  4. 版本控制:镜像指定版本号,别用latest(比如用nginx:1.21而不是nginx
  5. 文档化:把你的Dockerfile和docker-compose.yml写清楚,方便别人(和未来的自己)

学习资源

  • 官方文档:docs.docker.com(英文,但很全)
  • Docker Hub:hub.docker.com(找镜像的地方)
  • Play with Docker:labs.play-with-docker.com(在线练习环境)

总结

Docker这东西吧,刚开始学觉得挺麻烦的,概念多、命令多。但用熟了之后你会发现,真香!

我最看重的几点:

环境一致性:开发、测试、生产环境完全一样
快速部署:一条命令就能部署应用
资源隔离:每个服务跑在自己的容器里,互不干扰
易于迁移:整个应用打包,换台机器照样跑

当然也有不足:

❌ 学习曲线有点陡
❌ 某些场景下性能有损耗
❌ 存储和网络配置相对复杂

但总体来说,Docker确实是提升开发效率的神器。特别是对于后端开发、DevOps来说,基本是必备技能。

我的建议:

别光看,动手试试。按照这篇文章的步骤,从零开始跑个Nginx、打包个应用、用Docker Compose搭个WordPress。动手做一遍,比看十篇文章都有用。

等你用熟了,会发现以前那些环境配置、依赖冲突、部署麻烦的问题,都不是事儿了。


参考资源:

  • Docker官网:docker.com
  • 官方文档:docs.docker.com
  • Docker Hub:hub.docker.com
  • GitHub:github.com/docker

更多推荐