Docker技术文档
导学

一、Docker的介绍和安装
1.容器技术介绍
什么是container(容器)?
容器是一种快速的打包技术
Package Software into Standardized Units for Development,Shipment and Deployment
- 标准化
- 轻量级
- 易移植
Linux Container容器技术的诞生(2008年)就解决了IT世界里"集装箱运输"的问题。Linux Container(简称LXC)它是一种内核轻量级的操作系统层虚拟化技术。Linux Container主要由Namespace和Cgroup两大机制来保证实现
- Namespace命名空间主要用于资源的隔离
- Cgroup就负责资源管理控制作用,比如进程组使用CPU/MEM的限制,进程组的优先级控制,进程组的挂起和恢复等等。

2.Docker的安装与介绍

Windows安装
- 安装Docker Windows版本,需要开启BIOS 虚拟化
使用 PowerShell 启用 Hyper-V 在 Windows 上启用 Hyper-V | Microsoft Learn
- 以管理员身份打开 PowerShell 控制台。
- 运行以下命令
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
如果未找到此命令,请确保你以管理员身份运行 PowerShell。
- 安装完成时,请重新启动。
使用 CMD 和 DISM 启用 Hyper-V
部署映像服务和管理工具 (DISM) 可帮助配置 Windows 和 Windows 映像。 在众多应用程序中,DISM 可以在操作系统运行时启用 Windows 功能。
使用 DISM 启用 Hyper-V 角色
- 以管理员身份打开 PowerShell 或 CMD 会话。
- 输入以下命令
DISM /Online /Enable-Feature /All /FeatureName:Microsoft-Hyper-V

有关 DISM 的详细信息,请参阅 DISM 技术参考。
通过“设置”启用 Hyper-V 角色
- 导航到“控制面板”。
- 选择“程序”,然后选择“程序和功能”。
- 选择“打开或关闭 Windows 功能”。
- 选择“Hyper-V”,然后选择“确定”。

安装完成后,系统会提示你重启计算机。
Docker安装
Docker Desktop: The #1 Containerization Tool for Developers | Docker
下载后打开
验证CMD
docker version
安装 Windows10 WSL2 环境和 Docker#
如果大家使用Windows10的话,比较建议大家安装WSL2
我在Youtube和B站上有相关的系列视频,感兴趣的可以观看(观看地址在下面)
Windows10 WSL2环境的搭建系列视频
youtube
B站
Mac 安裝
请下载安装 Docker Desktop for Mac, 注意版本
https://docs.docker.com/docker-for-mac/install/
- intel芯片,请选择 Mac with intel chip
- M1芯片,请选择 Mac with Apple chip
Linux安装
适用于所有Linux版本
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh 需要sudo 权限
脚本会判断linux版本,选择合适命令去安装
验证
sudo docker version
启动docker
sudo systemctl start docker
二、容器快速上手
1.Docker基本命令
docker version 查看版本
Client: Docker Engine - Community
Version: 26.1.4 //docker版本
API version: 1.45 //API版本
Go version: go1.21.11
Git commit: 5650f9b
Built: Wed Jun 5 11:32:04 2024
OS/Arch: linux/amd64 //操作系統版本/CPU架构
Context: default
Server: Docker Engine - Community
Engine:
Version: 26.1.4
API version: 1.45 (minimum version 1.24)
Go version: go1.21.11
Git commit: de5c9cf
Built: Wed Jun 5 11:31:02 2024
OS/Arch: linux/amd64 //操作系統版本/CPU架构
Experimental: false
containerd:
Version: 1.6.33
GitCommit: d2d58213f83a351ca8f528a95fbd145f5654e957
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
常用命令示例
run
创建并启动一个新的容器
docker run -d -p [外部端口]:[内部端口] [镜像名]
exec
在运行中的容器中执行命令
docker exec -it [容器名] [命令]
ps
列出所有容器
docker ps
列出所有正在运行的容器
docker ps -a
build
docker build -t [镜像名] .
docker build -t my_image_name .
pull
从Docker Hub下载一个镜像
docker pull [镜像名]
docker pull nginx
push
将镜像上传到Docker Hub
docker push [用户名]/[镜像名]
docker push my_account/my_image_name
images
docker images
login
docker login
logout
docker logout
search
docker search [关键词]
docker search nginx
version
显示Docker版本信息
docker version
info
显示系统范围的信息
docker info
其他命令示例
attach
将本地的标准输入、输出和错误流附加到正在运行的容器
docker attach [容器名]
docker attach my_container
commit
根据容器的更改创建一个新的镜像
docker commit [容器名] [新镜像名]
docker commit my_container my_new_image
cp
在容器与本地文件系统之间复制文件或目录
docker cp [本地路径] [容器名]:[容器内路径]
docker cp /local/file.txt my_container:/container/path/
create
创建一个新的容器
docker create -p [外部端口]:[内部端口] [镜像名]
docker create -p 8080:80 nginx
diff
检查容器文件系统的文件或目录的变化
docker diff [容器名]
docker diff my_container
events
获取来自服务器的实时事件
docker events
export
导出容器的文件系统作为一个tar存档文件
docker export [容器名] > [文件名].tar
docker export my_container > container.tar
history
显示镜像的历史记录
docker history [镜像名]
docker history nginx
import
从tarball导入内容以创建文件系统镜像
cat [文件名].tar | docker import - [新镜像名]
cat container.tar | docker import - my_new_image
inspect
返回Docker对象的底层信息
docker inspect [对象名]
docker inspect my_container
kill
终止一个或多个正在运行的容器
docker kill [容器名]
docker kill my_container
load
从tar存档或STDIN加载一个镜像
docker load < [文件名].tar
docker load < image.tar
logs
获取容器的日志
docker logs [容器名]
docker logs my_container
pause
暂停一个或多个容器中的所有进程
docker pause [容器名]
docker pause my_container
port
列出容器的端口映射或特定映射
docker port [容器名]
docker port my_container
rename
重命名一个容器
docker rename [旧容器名] [新容器名]
docker rename old_name new_name
restart
重启一个或多个容器
docker restart [容器名]
docker restart my_container
rm
删除一个或多个容器
docker rm [容器名]
docker rm my_container
rmi
删除一个或多个镜像
docker rmi [镜像名]
docker rmi my_image
save
将一个或多个镜像保存为tar存档
docker save -o [文件名].tar [镜像名]
docker save -o image.tar my_image
start
启动一个或多个已停止的容器
docker start [容器名]
docker start my_container
stats
显示容器资源使用情况的实时流
docker stats [容器名]
docker stats my_container
stop
停止一个或多个正在运行的容器
docker stop [容器名]
docker stop my_container
tag
创建指向源镜像的目标镜像标签
docker tag [源镜像名] [目标镜像名]
docker tag my_image my_account/my_image_name
top
显示容器中的运行进程
docker top [容器名]
docker top my_container
unpause
解除暂停一个或多个容器中的所有进程
docker unpause [容器名]
docker unpause my_container
update
更新一个或多个容器的配置
docker update [选项] [容器名]
docker update --restart always my_container
wait
阻塞直到一个或多个容器停止,然后打印它们的退出代码
docker wait [容器名]
2.镜像和容器
image镜像
- Docker image是一个
read-only文件 - 这个文件包含文件系统,源码,库文件,依赖,工具等一些运行application所需要的文件
- 可以理解成一个模板
- docker image具有分层的概念
container容器
- “一个运行中的docker image”
- 实质是复制image并在image最上层加上一层
read-write的层 (称之为container layer,容器层) - 基于同一个image可以创建多个container

3.创建容器
创建容器:image不存在会自动取docker hup 上下载
docker container run nginx
当前正在运行的container
docker container ls
删除容器
docker rm [容器ID]
查看容器
docker ps -a
docker ps
停止容器
docker stop [容器名/id]
4.命令技巧批量操作
注意:不能直接删除正在运行的容器
批量停止容器
docker stop [容器名/id] [容器名/id] [容器名/id]
docker ps -aq (之列出id)
docler stop $(docker ps -qa) //批量停止容器
批量删除
docker rm $(docker ps -aq)
5.容器的attached和detached
docker run -p 80:80 nginx
docker run -d -p 80:80 nginx -d detached 后台执行
docker attach [id] 进入attach模式 非后台执行模式
6.容器的交互模式
docker logs [id] 打印容器日志
docker logs -f [id] 动态跟踪日志
docker run -it [名称/ubuntu] sh 使用交互式模式运行
可以直接进入容器的shell
exit 退出shell 容器也会停止
docker exec -it [id] sh 进入正在运行的容器的内部
exit 退出shell 容器不会停止
7.容器和虚拟机

容器不是Mini虚拟机
- 容器其实是进程Containers are just processes
- 容器中的进程被限制了对CPU内存等资源的访问
- 当进程停止后,容器就退出了
容器的进程process
以下是在Ubuntu20.04中演示,因Windows环境下的Docker和Linux具有一些差异。pstree 命令需要额外安装,可以使用 yum install psmisc 或者 sudo apt-get install psmisc 安装
➜ ~ docker container run -d nginx
57fe4033dd7e1e620a0b6a7b83b85d4f8f98772f0ce585624c384de254826fd0
➜ ~ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57fe4033dd7e nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 80/tcp festive_proskuriakova
➜ ~ docker container top 57f
UID PID PPID C STIME TTY TIME CMD
root 7646 7625 0 12:14 ? 00:00:00 nginx: master process nginx -g daemon off;
systemd+ 7718 7646 0 12:14 ? 00:00:00 nginx: worker process
➜ ~
➜ ~
➜ ~ ps -aef --forest
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 May14 ? 00:00:00 /init
root 157 1 0 May14 ? 00:00:00 /init
root 523 157 0 May14 ? 00:02:32 \_ /usr/bin/dockerd -p /var/run/docker.pid
root 545 523 0 May14 ? 00:25:55 | \_ containerd --config /var/run/docker/containerd/containerd.toml --log-level info
root 7625 157 0 12:14 ? 00:00:00 \_ /usr/bin/containerd-shim-runc-v2 -namespace moby -id 57fe4033dd7e1e620a0b6a7b83b85d4f8f98772f0ce585624c384de254826fd0 -address /var/run/d
root 7646 7625 0 12:14 ? 00:00:00 \_ nginx: master process nginx -g daemon off;
systemd+ 7718 7646 0 12:14 ? 00:00:00 \_ nginx: worker process
root 6442 1 0 May18 ? 00:00:00 /init
root 6443 6442 0 May18 ? 00:00:00 \_ /init
penxiao 6444 6443 0 May18 pts/2 00:00:01 \_ -zsh
penxiao 7770 6444 0 12:15 pts/2 00:00:00 \_ ps -aef --forest
➜ ~
➜ ~ pstree -halps 7718
init,1
└─init,157
└─containerd-shim,7625 -namespace moby -id 57fe4033dd7e1e620a0b6a7b83b85d4f8f98772f0ce585624c384de254826fd0 -address /var/run/docker/containerd/containerd.sock
└─nginx,7646
└─nginx,7718
查看容器进程
docker top [id]
通过容器可以创建多个进程
ps aux | grep nginx
pstree -halps 9930 查看进程
docker container run 背后发生了什么?
$ docker container run -d --publish 80:80 --name webhost nginx
- 在本地查找是否有nginx这个image镜像,但是没有发现
- 去远程的image registry查找nginx镜像(默认的registry是Docker Hub)
- 下载最新版本的nginx镜像 (nginx:latest 默认)
- 基于nginx镜像来创建一个新的容器,并且准备运行
- docker engine分配给这个容器一个虚拟IP地址
- 在宿主机上打开80端口并把容器的80端口转发到宿主机上
- 启动容器,运行指定的命令(这里是一个shell脚本去启动nginx)
三、镜像的创建管理和发布
1.镜像的获取方式
- pull from
registry(online) 从registry拉取- public(公有)
- private(私有)
- build from
Dockerfile(online) 从Dockerfile构建 - load from
file(offline) 文件导入 (离线)

2.Docker Image Registry
账号:1372065855@qq.com
密码:yanpeng2580
3.从Registry拉取镜像
镜像的基本操作
docker image
镜像的拉取Pull Image
默认从Docker Hub拉取,如果不指定版本,会拉取最新版
docker pull nginx
指定版本
docker pull nginx:1.20.0
从Quay上拉取镜像
docker pull quay.io/bitnami/nginx
镜像的查看
docker image ls
镜像的删除
docker image rm 0922eabe1625
显示特定镜像的详细信息
docker image inspect [ImageID]
注意:删除镜像必须要删除运行过镜像的容器。
4.镜像的导出和导入 (offline)
导出镜像文件
docker image save nginx:1.20.0 -o nginx.image
导入镜像文件
docker image load -i .\nginx.image
5.Dockerfile 介绍
https://docs.docker.com/engine/reference/builder/
- Dockerfile是用于构建docker镜像的文件
- Dockerfile里包含了构建镜像所需的“指令”
- Dockerfile有其特定的语法规则
举例:执行一个Python程序
容器即进程,所以镜像就是一个运行这个进程所需要的环境。
假如我们要在一台ubuntu 22.04上运行下面这个hello.py的Python程序
hello.py的文件内容:
print("hello docker")
第一步,准备Python环境
apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.10 python3-pip python3.10-dev
第二步,运行hello.py
$ python3 hello.py
hello docker
一个Dockerfile的基本结构
FROM ubuntu:22.04 //docker image 基础镜像(虚拟机)
RUN apt-get update && \ //安装依赖以及包
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.10 python3-pip python3.10-dev
ADD hello.py / //添加到镜像根目录Hello.py文件
CMD ["python3", "/hello.py"] //执行Hello.py
6.镜像的构建和分享
构建DockerFile
docker image build -t hello .
-t: 标签名称
.: 当前目录
如何把镜像上传到Dockerhub
打包镜像
docker image build -t [账号ID]/[名称]:[版本号]
PUSH
- 登录
docker login
- push
docker image push [账号ID]/[名称]:[版本号]
拉取
docker pull [账号ID]/[名称]:[版本号]
运行
docker run [账号ID]/[名称]:[版本号]
7.通过commit创建镜像
把当前容器打包成镜像,可以保存容器内更改过的数据
docker container commit [容器ID] [账号ID]/[名称]:[版本号]
docker container commit [容器ID] [账号ID]/[名称]:[版本号] python3 /hello.py
8.关于 scratch 镜像
Scratch是一个空的Docker镜像。
通过scratch来构建一个基础镜像。
hello.c
#include <stdio.h>
int main()
{
printf("hello docker\n");
}
编译成一个二进制文件
$ gcc --static -o hello hello.c
$ ./hello
hello docker
$
Dockerfile
FROM scratch [这里是空镜像]
ADD hello /
CMD ["/hello"]
构建
$ docker build -t hello .
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello latest 2936e77a9daa 40 minutes ago 872kB
运行
$ docker container run -it hello
hello docker
4.1
