什么是Docker?

Docker把应用+依赖环境打包成一个”容器”,在任何安装了Docker的机器上都能运行。

简单理解

  • 传统部署:代码→服务器(环境配置麻烦)
  • Docker部署:代码→打包成容器→任何服务器(零配置)

安装Docker

Ubuntu/Debian

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 更新包索引
apt update

# 安装依赖
apt install -y ca-certificates curl gnupg lsb-release

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker
apt update
apt install -y docker-ce docker-ce-cli containerd.io

# 启动Docker
systemctl start docker
systemctl enable docker

# 验证
docker --version

CentOS/RHEL

1
2
3
4
5
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker

Docker镜像和容器

镜像(Image):像安装包,只读的(如:nginx镜像)
容器(Container):镜像运行后的实例,可读写的(如:运行中的nginx)


常用命令

镜像操作

1
2
3
4
5
6
7
8
9
10
11
12
13
# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx:latest # latest是最新版本
docker pull nginx:1.21 # 指定版本

# 查看本地镜像
docker images

# 删除镜像
docker rmi nginx:latest
docker rmi $(docker images -q) # 删除所有镜像

容器操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 运行容器
docker run nginx # 运行nginx
docker run -d nginx # -d 后台运行
docker run -p 80:80 nginx # -p 端口映射(主机80->容器80)
docker run --name myweb nginx # --name 指定名称
docker run --restart=always nginx # --restart 自动重启

# 查看容器
docker ps # 运行中的容器
docker ps -a # 所有容器(包括停止的)

# 停止容器
docker stop 容器ID或名称
docker stop $(docker ps -q) # 停止所有运行容器

# 启动容器
docker start 容器ID或名称

# 重启容器
docker restart 容器ID或名称

# 删除容器
docker rm 容器ID或名称
docker rm -f 容器ID或名称 # 强制删除运行中的容器

容器进入和日志

1
2
3
4
5
6
7
8
# 进入容器
docker exec -it 容器ID /bin/bash
docker exec -it 容器ID /bin/sh # 部分镜像没有bash

# 查看日志
docker logs 容器ID
docker logs -f 容器ID # -f 实时查看
docker logs --tail 100 容器ID # 最后100行

实战示例

示例1:运行Nginx服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 拉取并运行
docker run -d -p 80:80 --name nginx-server nginx

# 测试访问
curl localhost:80
# 或浏览器访问 http://服务器IP

# 查看状态
docker ps
docker logs nginx-server

# 停止和删除
docker stop nginx-server
docker rm nginx-server

示例2:运行MySQL数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 运行MySQL
docker run -d \
--name mysql-server \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7

# 参数说明:
# -d - 后台运行
# --name - 容器名称
# -p - 端口映射
# -e - 环境变量(设置root密码)

# 测试连接
docker exec -it mysql-server mysql -uroot -p123456

# 安全删除(提示密码)
docker stop mysql-server
docker rm mysql-server

示例3:部署个人网站

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建网站目录
mkdir -p /var/www/html
echo "<h1>Hello Docker!</h1>" > /var/www/html/index.html

# 运行Nginx,挂载本地目录
docker run -d \
--name mywebsite \
-p 80:80 \
-v /var/www/html:/usr/share/nginx/html \
nginx

# 参数说明:
# -v - 挂载本地目录到容器

# 修改文件,无需重启容器
echo "<h1>Updated!</h1>" > /var/www/html/index.html
# 刷新页面即可看到变化

端口映射

1
2
3
4
5
docker run -p 主机端口:容器端口 镜像

# 示例
docker run -p 8080:80 nginx # 访问localhost:8080 → 容器80
docker run -p 3306:3306 mysql # 访问localhost:3306 → MySQL

数据持久化(挂载)

1
2
3
4
5
6
7
8
9
10
# 挂载目录
docker run -v /宿主机路径:/容器路径 镜像

# 示例:MySQL数据持久化
docker run -d -p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql

# 删除容器后,数据仍在 /data/mysql 目录

查看资源使用

1
2
3
4
5
# 查看容器资源占用
docker stats

# 查看容器详细信息
docker inspect 容器ID

常用技巧

技巧1:清理无用资源

1
2
3
4
5
6
7
8
# 删除停止的容器
docker container prune

# 删除未使用的镜像
docker image prune

# 删除所有无用资源
docker system prune -a

技巧2:导出和导入容器

1
2
3
4
5
# 导出容器为tar文件
docker export 容器ID > container.tar

# 导入镜像
docker import container.tar new-image:tag

技巧3:复制文件

1
2
3
4
5
# 复制文件到容器
docker cp 本地文件 容器ID:/容器路径

# 从容器复制文件
docker cp 容器ID:/容器路径 本地文件

常见问题

Q: 容器无法外网访问?
A: 检查端口映射 -p 参数 和防火墙。

Q: 容器重启后数据丢失?
A: 使用 -v 挂载到本地目录。

Q: 查看容器IP?
A: docker inspect 容器ID | grep IPAddress

Q: 如何修改容器?
A: 先docker commit 旧名称 新名称,再运行新镜像。不过推荐用Dockerfile重新构建。


总结

  • Docker安装:Ubuntu安装命令,启动并enable
  • 镜像:pull拉取,images查看,rmi删除
  • 容器:run运行,ps查看,stop/start控制
  • 常用参数:-d后台,-p端口,-v挂载,--name起名
  • 数据持久化用-v挂载到主机
  • exec -it进入容器,logs查看日志
  • 定期docker system prune清理

下一篇:Docker Compose(多容器编排)。