主题
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.041.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.01.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.041.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 load2. 容器管理
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.042.2 启动容器
启动Docker容器。
命令:
bash
# 启动容器
docker start mycontainer
# 启动多个容器
docker start mycontainer1 mycontainer2
# 启动容器(附加到容器)
docker start -a mycontainer
# 启动容器(重新创建)
docker start --restart=always mycontainer2.3 查看容器
查看Docker容器。
命令:
bash
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 查看容器(仅显示ID)
docker ps -q
# 查看容器(过滤)
docker ps -f name=mycontainer
# 查看容器(格式化输出)
docker ps --format "{{.Names}} {{.Status}}"
# 查看容器(最新创建)
docker ps -l2.4 停止容器
停止Docker容器。
命令:
bash
# 停止容器
docker stop mycontainer
# 停止多个容器
docker stop mycontainer1 mycontainer2
# 停止所有运行中的容器
docker stop $(docker ps -q)
# 强制停止容器
docker kill mycontainer2.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.txt2.7 查看容器日志
查看Docker容器的日志。
命令:
bash
# 查看容器日志
docker logs mycontainer
# 查看容器日志(实时)
docker logs -f mycontainer
# 查看容器日志(最新100行)
docker logs --tail 100 mycontainer
# 查看容器日志(带时间戳)
docker logs --timestamps mycontainer
# 查看容器日志(详细信息)
docker logs --details mycontainer2.8 查看容器信息
查看Docker容器的详细信息。
命令:
bash
# 查看容器信息
docker inspect mycontainer
# 查看容器信息(格式化输出)
docker inspect --format "{{.NetworkSettings.IPAddress}}" mycontainer
# 查看容器信息(指定字段)
docker inspect -f "{{.State.Status}}" mycontainer2.9 容器端口映射
查看Docker容器的端口映射。
命令:
bash
# 查看容器端口映射
docker port mycontainer
# 查看容器端口映射(指定端口)
docker port mycontainer 802.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.043. 实战案例
案例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 myvolume4. 常见问题
问题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卷实现容器数据持久化。