跳转到内容

Docker镜像和容器管理

课程介绍

Docker镜像和容器管理是使用Docker的核心内容,掌握镜像和容器的管理方法可以更好地使用Docker。本课程将详细讲解Docker镜像和容器的管理方法,包括镜像的拉取、构建、推送,容器的创建、启动、停止、删除等内容,帮助你掌握Docker镜像和容器的管理技巧。

1. 镜像管理

1.1 查看本地镜像

查看本地存储的Docker镜像。

命令

bash
# 查看本地镜像
docker images

# 查看本地镜像(详细信息)
docker images --digests

# 查看本地镜像(仅显示ID)
docker images -q

# 查看本地镜像(过滤)
docker images ubuntu

# 查看本地镜像(格式化输出)
docker images --format "{{.Repository}}:{{.Tag}} {{.Size}}"

1.2 拉取镜像

从Docker Hub或其他镜像仓库拉取镜像。

命令

bash
# 拉取最新版本镜像
docker pull ubuntu

# 拉取指定版本镜像
docker pull ubuntu:20.04

# 拉取指定仓库镜像
docker pull registry.cn-hangzhou.aliyuncs.com/library/ubuntu:20.04

# 拉取镜像(显示进度)
docker pull --progress=plain ubuntu:20.04

1.3 构建镜像

使用Dockerfile构建自定义镜像。

命令

bash
# 构建镜像
docker build -t myapp .

# 构建镜像(指定Dockerfile)
docker build -t myapp -f Dockerfile.custom .

# 构建镜像(指定标签)
docker build -t myapp:v1.0.0 .

# 构建镜像(显示详细信息)
docker build -t myapp --progress=plain .

# 构建镜像(使用缓存)
docker build -t myapp --cache-from myapp:latest .

1.4 推送镜像

将镜像推送到Docker Hub或其他镜像仓库。

命令

bash
# 登录Docker Hub
docker login

# 标记镜像
docker tag myapp username/myapp:v1.0.0

# 推送镜像
docker push username/myapp:v1.0.0

# 推送镜像到指定仓库
docker push registry.cn-hangzhou.aliyuncs.com/username/myapp:v1.0.0

1.5 删除镜像

删除本地存储的Docker镜像。

命令

bash
# 删除指定镜像
docker rmi ubuntu:20.04

# 删除多个镜像
docker rmi ubuntu:20.04 nginx:latest

# 强制删除镜像
docker rmi -f ubuntu:20.04

# 删除所有未使用镜像
docker image prune

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

1.6 镜像历史

查看镜像的构建历史。

命令

bash
# 查看镜像历史
docker history ubuntu:20.04

# 查看镜像历史(详细信息)
docker history --no-trunc ubuntu:20.04

1.7 镜像导出和导入

导出和导入Docker镜像。

命令

bash
# 导出镜像
docker save -o ubuntu_20.04.tar ubuntu:20.04

# 导入镜像
docker load -i ubuntu_20.04.tar

# 导出镜像(流式)
docker save ubuntu:20.04 | gzip > ubuntu_20.04.tar.gz

# 导入镜像(流式)
gunzip -c ubuntu_20.04.tar.gz | docker load

2. 容器管理

2.1 创建容器

创建Docker容器。

命令

bash
# 创建容器(不启动)
docker create --name mycontainer ubuntu:20.04

# 创建容器(指定端口映射)
docker create --name mycontainer -p 80:80 nginx

# 创建容器(指定挂载卷)
docker create --name mycontainer -v /data ubuntu:20.04

# 创建容器(指定环境变量)
docker create --name mycontainer -e ENV=production ubuntu:20.04

# 创建容器(指定网络)
docker create --name mycontainer --network bridge ubuntu:20.04

2.2 启动容器

启动Docker容器。

命令

bash
# 启动容器
docker start mycontainer

# 启动多个容器
docker start mycontainer1 mycontainer2

# 启动容器(附加到容器)
docker start -a mycontainer

# 启动容器(重新创建)
docker start --restart=always mycontainer

2.3 查看容器

查看Docker容器。

命令

bash
# 查看运行中的容器
docker ps

# 查看所有容器
docker ps -a

# 查看容器(仅显示ID)
docker ps -q

# 查看容器(过滤)
docker ps -f name=mycontainer

# 查看容器(格式化输出)
docker ps --format "{{.Names}} {{.Status}}"

# 查看容器(最新创建)
docker ps -l

2.4 停止容器

停止Docker容器。

命令

bash
# 停止容器
docker stop mycontainer

# 停止多个容器
docker stop mycontainer1 mycontainer2

# 停止所有运行中的容器
docker stop $(docker ps -q)

# 强制停止容器
docker kill mycontainer

2.5 删除容器

删除Docker容器。

命令

bash
# 删除容器
docker rm mycontainer

# 删除多个容器
docker rm mycontainer1 mycontainer2

# 强制删除容器
docker rm -f mycontainer

# 删除所有停止的容器
docker container prune

# 删除所有容器
docker rm -f $(docker ps -a -q)

2.6 进入容器

进入运行中的Docker容器。

命令

bash
# 进入容器(bash)
docker exec -it mycontainer bash

# 进入容器(sh)
docker exec -it mycontainer sh

# 进入容器(执行命令)
docker exec -it mycontainer ls -la

# 进入容器(后台执行)
docker exec -d mycontainer touch /tmp/test.txt

2.7 查看容器日志

查看Docker容器的日志。

命令

bash
# 查看容器日志
docker logs mycontainer

# 查看容器日志(实时)
docker logs -f mycontainer

# 查看容器日志(最新100行)
docker logs --tail 100 mycontainer

# 查看容器日志(带时间戳)
docker logs --timestamps mycontainer

# 查看容器日志(详细信息)
docker logs --details mycontainer

2.8 查看容器信息

查看Docker容器的详细信息。

命令

bash
# 查看容器信息
docker inspect mycontainer

# 查看容器信息(格式化输出)
docker inspect --format "{{.NetworkSettings.IPAddress}}" mycontainer

# 查看容器信息(指定字段)
docker inspect -f "{{.State.Status}}" mycontainer

2.9 容器端口映射

查看Docker容器的端口映射。

命令

bash
# 查看容器端口映射
docker port mycontainer

# 查看容器端口映射(指定端口)
docker port mycontainer 80

2.10 容器资源限制

限制Docker容器的资源使用。

命令

bash
# 限制容器CPU使用
docker run -d --name mycontainer --cpus 1 ubuntu:20.04

# 限制容器内存使用
docker run -d --name mycontainer --memory 1g ubuntu:20.04

# 限制容器CPU和内存
docker run -d --name mycontainer --cpus 1 --memory 1g ubuntu:20.04

# 限制容器CPU份额
docker run -d --name mycontainer --cpu-shares 512 ubuntu:20.04

3. 实战案例

案例1:构建和运行自定义镜像

场景:构建一个包含Web应用的自定义镜像,并运行容器。

步骤

bash
# 1. 创建Dockerfile
cat > Dockerfile << EOF
FROM ubuntu:20.04

RUN apt-get update && apt-get install -y nginx

COPY index.html /var/www/html/

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]
EOF

# 2. 创建index.html
cat > index.html << EOF
<!DOCTYPE html>
<html>
<head>
    <title>Docker Test</title>
</head>
<body>
    <h1>Hello Docker!</h1>
</body>
</html>
EOF

# 3. 构建镜像
docker build -t mywebapp .

# 4. 查看镜像
docker images

# 5. 运行容器
docker run -d --name mywebapp -p 8080:80 mywebapp

# 6. 查看容器
docker ps

# 7. 访问应用
curl http://localhost:8080

# 8. 停止容器
docker stop mywebapp

# 9. 删除容器
docker rm mywebapp

# 10. 删除镜像
docker rmi mywebapp

案例2:管理多个容器

场景:管理多个Docker容器。

步骤

bash
# 1. 运行Nginx容器
docker run -d --name nginx -p 80:80 nginx

# 2. 运行MySQL容器
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mysql:8.0

# 3. 运行Redis容器
docker run -d --name redis -p 6379:6379 redis

# 4. 查看所有容器
docker ps -a

# 5. 停止所有容器
docker stop nginx mysql redis

# 6. 启动所有容器
docker start nginx mysql redis

# 7. 查看容器日志
docker logs nginx

# 8. 进入MySQL容器
docker exec -it mysql mysql -u root -p

# 9. 删除所有容器
docker rm -f nginx mysql redis

案例3:容器数据持久化

场景:使用Docker卷实现容器数据持久化。

步骤

bash
# 1. 创建Docker卷
docker volume create myvolume

# 2. 查看Docker卷
docker volume ls

# 3. 运行容器并挂载卷
docker run -d --name mycontainer -v myvolume:/data ubuntu:20.04

# 4. 进入容器
docker exec -it mycontainer bash

# 5. 在容器中创建文件
touch /data/test.txt

echo "Hello Docker Volume" > /data/test.txt

# 6. 退出容器
exit

# 7. 停止并删除容器
docker stop mycontainer
docker rm mycontainer

# 8. 重新运行容器并挂载相同的卷
docker run -d --name mycontainer2 -v myvolume:/data ubuntu:20.04

# 9. 进入新容器
docker exec -it mycontainer2 bash

# 10. 查看文件是否存在
cat /data/test.txt

# 11. 退出容器
exit

# 12. 删除容器和卷
docker stop mycontainer2
docker rm mycontainer2
docker volume rm myvolume

4. 常见问题

问题1:容器启动失败

问题:Docker容器启动失败。

解决方法

bash
# 查看容器日志
docker logs container-name

# 检查容器配置
docker inspect container-name

# 重新运行容器
docker run -d --name container-name image-name

问题2:镜像拉取失败

问题:Docker镜像拉取失败。

解决方法

bash
# 检查网络连接
ping google.com

# 更换Docker镜像源
sudo vim /etc/docker/daemon.json

# 重新拉取镜像
docker pull image-name

问题3:容器端口映射失败

问题:Docker容器端口映射失败。

解决方法

bash
# 检查端口是否被占用
netstat -tuln | grep port

# 更换端口映射
docker run -d --name container-name -p 8080:80 image-name

# 检查容器状态
docker ps

问题4:容器数据丢失

问题:Docker容器数据丢失。

解决方法

bash
# 使用Docker卷
docker run -d --name container-name -v volume-name:/data image-name

# 使用绑定挂载
docker run -d --name container-name -v /host/path:/container/path image-name

# 备份容器数据
docker cp container-name:/path/to/data /host/path

课程总结

这节课我们学习了Docker镜像和容器管理。

核心内容:

  • 镜像管理(查看本地镜像、拉取镜像、构建镜像、推送镜像、删除镜像、镜像历史、镜像导出和导入)
  • 容器管理(创建容器、启动容器、查看容器、停止容器、删除容器、进入容器、查看容器日志、查看容器信息、容器端口映射、容器资源限制)
  • 实战案例(构建和运行自定义镜像、管理多个容器、容器数据持久化)
  • 常见问题

重要命令:

  • docker images:查看本地镜像
  • docker pull:拉取镜像
  • docker build:构建镜像
  • docker push:推送镜像
  • docker rmi:删除镜像
  • docker create:创建容器
  • docker start:启动容器
  • docker ps:查看容器
  • docker stop:停止容器
  • docker rm:删除容器
  • docker exec:进入容器
  • docker logs:查看容器日志
  • docker inspect:查看容器信息

Docker镜像和容器管理是使用Docker的核心内容,掌握这些知识后,我们将在后续课程中学习Dockerfile编写、Docker网络和存储等内容。

课后练习

练习1(基础)

拉取Ubuntu 20.04镜像,并运行一个容器。

练习2(进阶)

构建一个包含Web应用的自定义镜像,并运行容器。

练习3(拓展)

使用Docker卷实现容器数据持久化。

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径