Docker常用命令
docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-e设置环境变量;-e username=yjy
--name为容器指定一个名称;--name=yjy
-p指定端口映射,格式为:主机(宿主)端口:容器端口 -p 80:8080
-t为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-i以交互模式运行容器,通常与 -t 同时使用;
-d后台运行容器,并返回容器ID;
-v宿主机目录:容器目录。将宿主机目录挂载到容器内。
docker cp
复制容器内的文件到宿主机
docker start
启动一个或多个已经被停止的容器
docker stop
停止一个运行中的容器
docker restart
重启容器
docker rm
删除容器
docker pause
暂停容器中所有的进程;
docker unpause
恢复容器中所有的进程;
docker exec
在运行的容器中执行命令
docker exec -it mynginx /bin/sh /root/runoob.sh
docker logs
获取容器的日志;
docker ps
列出UP的容器;docker ps -a列出所有容器。包括Exited等状态的容器;
docker top
查看容器中运行的进程信息,支持 ps 命令参数;
docker inspect
获取容器/镜像的元数据;
docker login
登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub;
docker logout
登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub;
docker tag
标记本地镜像,将其归入某一仓库;
docker push
将本地的镜像上传到镜像仓库,要先登陆到镜像仓库;
docker pull
从镜像仓库中拉取或者更新指定镜像;
docker search
从Docker Hub查找镜像;
docker images
列出本地镜像;
docker rmi
删除本地一个或多少镜像;
docker build
命令用于使用 Dockerfile 创建镜像。
docker build -t runoob/ubuntu:v1 .
会默认使用当前目录的Dockerfile进行编译镜像,编译后的镜像名为runoob/ubuntu:v1
docker history
查看指定镜像的创建历史
docker history runoob/ubuntu:v3
docker save
将指定镜像保存成 tar 归档文件。-i参数指定输入的文件。
docker load -i my_ubuntu_v3.tar
docker info
显示 Docker 系统信息,包括镜像和容器数。
docker version
显示 Docker 版本信息。
Docker的存储驱动
Docker支持AUFS、Btrfs、Device mapper、OverlayFS、ZFS五种存储驱动;
写时复制(CoW)
所有驱动都用到的技术------写时复制(CoW)。CoW就是copy-on-write,表示只在需要写时才去复制,这个是针对已有文件的修改场景。比如基于一个image启动多个Container,如果为每个Container都去分配一个image一样的文件系统,那么将会占用大量的磁盘空间。而CoW技术可以让所有的容器共享image的文件系统,所有数据都从image中读取,只有当要对文件进行写操作时,才从image里把要写的文件复制到自己的文件系统进行修改。写操作会在每个容器的文件系统里生成一个复本,每个容器修改的都是自己的复本,相互隔离,相互不影响。使用CoW可以有效的提高磁盘的利用率。
用时分配(allocate-on-demand)
而写时分配是用在原本没有这个文件的场景,只有在要新写入一个文件时才分配空间,这样可以提高存储资源的利用率。比如启动一个容器,并不会为这个容器预分配一些磁盘空间,而是当有新文件写入时,才按需分配新空间。
Overlay VS Device mapper
devicemapper将所有的镜像和容器存储在自己的虚拟块设备上,所有的操作都是直接对块进行操作,而不是文件。当要写入一个新文件时,在容器的镜像内为其分配新的块并写入数据,这个叫用时分配。当要修改已有文件时,再使用CoW为容器快照分配块空间,将要修改的数据复制到在容器快照中新的块里再进行修改。
overlay是基于文件级的存储。只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层。当需要修改一个文件时,使用CoW将文件从只读的lower复制到可写的upper进行修改,结果也保存在upper层。
Overlay是文件级存储,Device mapper是块级存储,当文件特别大而修改的内容很小,Overlay不管修改的内容大小都会复制整个文件,对大文件进行修改显示要比小文件要消耗更多的时间,而块级无论是大文件还是小文件都只复制需要修改的块,并不是整个文件,在这种场景下,显然device mapper要快一些。因为块级的是直接访问逻辑盘,适合IO密集的场景。而对于程序内部复杂,大并发但少IO的场景,Overlay的性能相对要强一些。
Overlay VS Overlay2
overlay驱动只工作在一个lower OverlayFS层之上,因此需要硬链接来实现多层镜像,但overlay2驱动原生地支持多层lowerOverlayFS镜像(最多128层)。因此overlay2驱动在合层相关的命令(如build和commit)中提供了更好的性能,与overlay驱动对比,消耗了更少的inode。
Docker的网络模式
可以看:[docker的五种网络模式总结]
【docker】CMD ENTRYPOINT 区别 终极解读!_entrypoint:-CSDN博客
安装 Docker 时,它会自动创建 3 个网络。可以使用 docker network ls命令列出这些网络。
这 3 个网络包含在 Docker 实现中。运行一个容器时,可以使用 the --net标志指定您希望在哪个网络上运行该容器。您仍然可以使用这 3 个网络。
-
bridge 网络表示所有 Docker 安装中都存在的 docker0 网络。除非使用docker run --net=选项另行指定,否则 Docker 守护进程默认情况下会将容器连接到此网络。在主机上使用 ifconfig命令,可以看到此网桥是主机的网络堆栈的一部分。
-
none 网络在一个特定于容器的网络堆栈上添加了一个容器。该容器缺少网络接口。
-
host 网络在主机网络堆栈上添加一个容器。容器中的网络配置与主机相同。可以通过主机IP访问,端口也会使用主机端口。所以主机端口不能被占用,否则容器启动会有问题。