一、Docker基础应用

1、镜像管理

docker search centos——搜索镜像
docker search centos -f stars=100——按星级搜索镜像
docker pull centos——拉取镜像
查看本地镜像
docker images
docker image ls
docker image list
查看镜像详情
docker image inspect [name|id]
删除镜像
docker rmi [name|id]
docker rmi -f [name|id]——强制删除
docker rmi $(docker image -q)——更具镜像id全部删除
只查看所有镜像的id
docker image -q
查看镜像制作过程
docker history docker search centos——搜索镜像
docker search centos -f stars=100——按星级搜索镜像
docker pull centos——拉取镜像
查看本地镜像
docker images
docker image ls
docker image list
查看镜像详情
docker image inspect [name|id]
删除镜像
docker rmi [name|id]
docker rmi -f [name|id]——强制删除
docker rmi $(docker image -q)——更具镜像id全部删除
只查看所有镜像的id
docker image -q
查看镜像制作过程
docker history [name|id]
dive [name|id]
镜像打标签
docker tag 原有镜像名 新的镜像名

2、容器管理

#创建容器,但不运行
docker create -it [id|iname] -i 捕获标准输入输出 -t分配一个虚拟终端
#启动未运行的容器
docker start [cid|cname]
#创建运行的容器
docker run -it [id|iname]
#进入容器
docker attach [cid|cname]
#退出容器
ctrl + p + q (退出容器,但是容器不停止)
	ctrl + d     (退出容器,但是容器停止)
##常用的容器管理的方法
	docker run -itd [id|name]		#创建容器并运行
启动参数:
	--name	自定义名字
	-p	hostPort:cPort
	-P	随机映射
	-v	hostPath:cpath 数据持久化
	-e	环境变量
	-d	后台运行
docker exec -it [cid|cname] /bin/bash	#进入容器	
#查看整在运行的容器
docker ps
#查看所有容器
docker ps -a
#查看最近启动的容器
docker ps -l
#之查看所有容器id
docker ps -a -q
#查看容器详细信息
inspect inspect [name|id]
	
#关闭容器
docker stop [name|id]
docker kill [name|id]
#删除容器
docker rm [name|id]
docker rm $(docker ps -qa)		#删除所有容器
docker rm $(docker ps -qf status=exited)		#根据格式删除所有容器
#重启容器
docker restart [name|id]
#暂停容器
docker pause [name|id]
#恢复容器
docker unpause [name|id]
#动态显示容器的资源消耗情况
docker stats [name|id]
#修改容器名
docker rename [name|id] new--name
#显示容器映射情况
docker port [name|id]
#监控容器的运行
docker logs [name|id]			#查看容器的运行日志
--tail										#指定查看最后几条日志
-t												#对日志条目附加时间戳
-f												#动态查看容器日志
docker top [name|id]		#显示一个运行的容器里面的进程信息
docker events [name|id]		#实时输出事件
docker wait [name|id]		#捕捉容器停止时的退出码
docker diff [name|id]		#查看容器内发生改变的文件
C ——对应文件内容的改变
A ——对应文件或目录的创建删除
#宿主机和容器之间相互copy文件
docker cp (options) container:path localpath
docker cp (options) localpath container:path

3、容器打包

将容器的文件系统打包成tar文件,也就是把正在运行的容器直接导出为tar包的镜像文件

#第一种
docker export -o cname.tar cname
#第二种
docker export cname > 镜像
#导出镜像文件到其他宿主机
docker import cname.tar cname
拓展(好用)
docker commit [cid|cname] new--name 

4、惊现迁移

保存一台宿主机上的镜像为tar文件,然后可以导入到其他的宿主机上:

镜像打包
docker save -o cname.tar cname
docker save cname > cname.tar
镜像导入
docker load -i cname.tar
docker load < cname.tar

5、镜像、容器深度操作

#显示镜像摘要
docker images --digests
#过滤镜像
docker iamges [-f|--fileter] "key=value"
#镜像格式化输出
docker images --format "{{.ID}}\t{{Repository}}"
.ID--镜像ID
.Repository--镜像仓库
.Tag--镜像标签
.Digest--镜像hash值
.CreateSince--创建镜像后的时间
.CreatedAt--创建镜像的时间
.Size--镜像大小
#容器格式化输出
docker ps --format "{{.ID}}\t{{.Command}}"
.ID--容器ID
.Image--镜像ID
.Command--执行的命令
.CreatedAt--容器创建的时间
.RunningFor--运行时长
.Ports--暴露的端口
.Status--容器状态
.Names--容器名称
.Lebel--分配给容器的所有标签

二、Dockerfile

dockerfile是一个包含用于组合影响的命令的文本文档。docker通过读取dockerfile中的指令自动生成镜像;

语法: docker build -t 镜像名:版本 -f 构建目录

1、dockerfile的基本结构

基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令;

2、Dockerfile中常用的一些指令

FROM:指定的基础镜像,必须为第一个命令
MAINTAINER:维护者信息
LABEL:用于未经想添加元数据
RUN:构建镜像时执行的命令
ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络文件不会被解压),可以访问网络资源,类似wget
COPY:类似ADD,但是只能拷贝本地文件,且不会解压
CMD:构建容器后调用,也就是在容器启动时才进行调用
ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去“application”,只使用参数
ENV:设置环境变量
EXPOSE:指定域外界交互的端口
VOLUME:用于指定那个持久化目录
WORKDIR:工作目录,类似cd命令
USER:指定运行容器时用户名或UID,后续的RUN也会使用该用户
ARG:用于指定传递给构建运行时的变量
ONBULID:用于设置镜像构建参数

3、CMD与ENTRYPOINT区别

dockerfile中的CMD和ENTRYPOINT都只能存在一个,若存在多个都只会执行最后一个,ENTRYPOINT在执行docker run 命令时给的参数会追加在ENTRYPOINT的参数后,而CMD则会覆盖原先的参数;

CMD和ENTRYPONIT的结合使用:

#设置一个默认的ENTRYPOINT命令

ENTRYPOINT ["/bin/echo","HELLO"]

#设置一个默认的CMD命令,它会被结合到ENTRYPOINT

CMD ["world"]

当你构建并运行这个Dockerfile时,他会输出“Hello,world”

当你在运行容器是制定了其他参数,例如docker run -itd myimage Docker,CMD会被覆盖,输出变为了“Hello,Docker!”

4、dockerfile优化

--使用较小的基础镜像
--合并指令,将多个RUN指令合并为一个,可以减少镜像的层数
--删除缓存和不需要的软件包
--以来多阶段构建:对于需要编译的应用程序,可以使用多阶段构建,将编译工具和编译后的结果分开,从而生成更小、更干净的镜像

三、资源限制

docker的资源限制基本都是基于CPU和内存的资源限制,很少有涉及到限制磁盘IO的场景。

因为是学习场景,这里就涉及到一个专用的系统压力测试工具stress

1、CPU资源限制

(1)、CPU-share

当主机上有多个容器运行时,每个容器占用的CPU时间比例为它的share在总额中的比例。

这种限制的好处就是:能保证CPU尽可能处于运行状态,充分利用CPU资源,而且保证所有容器的相对公平;就是按比例来限制不同容器对CPU的使用。

缺点:无法指定容器使用CPU的确定值

语法:-c --cpu-shares, 它的值是一个整数

(2)限制CPU的核数

参数: --cpus 后面跟一个浮点数,代表容器最多使用的核数,可以精确到小数点二位,也就是说容器最小可以使用0.01核CPU。

如果设置的--cpus值大于主机的CPU核数,docker会直接报错

如果多个容器都设置了--cpus,并且他们之和超过主机的CPU核数,并不会导致容器失败或者推出,这些荣器之间会竞争使用CPU,具体分配的CPU数量取决于主机运行情况和容器CPUshare值。

(3)CPU绑定

限制容器运行在某些CPU核,一般不推荐在生产中这样使用;

参数:--cpusset-cpus

2、Mem资源限制

docker默认没有对容器内存进行限制,容器可以使用主机提供的所有内存。

那么,不限制内存带来的问题:如果某个容器运行了恶意的内存消耗软件,或者代码有内存泄漏,可能会导致主机内存耗尽,因此导致服务不可用。可以为每个容器设置内存使用的上限,容器会被杀死,而不是耗尽主机的内存;

同时限制内存带来的问题:虽然能保护主机,但是也可能会伤害到容器里的服务。如果为服务设置的内存上限太小,会导致服务还在正常工作的时候就会被“OOM”杀死;如果设置的过大,会因为调度器算法浪费内存。out of memory.

合理的做法就是:

首先为应用做内存压力测试,理解正常业务需求下使用的内存情乱,然后才能进入生产环境使用;
一定要限制容器的内存使用上限,尽量保证主机的资源充足,一旦通过监控发现资源不足,就进行扩容或者对容器进行迁移(如果可以)
尽量不要使用swap,swap会导致内存计算复杂,对调度器非常不友好

使用参数:-m :容器能使用的最大内存大小,最小值为4m

并且,限制容器内存使用为64M,再申请64M资源的情况下,容器正常运行;而如果申请150M内存。会发现容器里的进程被kill掉了(worker 6 got signal 9,signal 9就是kill信号)

3、磁盘IO限制

限制bps、iops

bps——时每秒读写的数量

--device-write-bps /dev/sda:30MB

iops——每秒IO的次数

四、docker网络

首先docker网络模式主要包括四种类型:Bridge、Host、None和Container

Bridge:docker默认的网络模式。在这种模式下,容器通过Docker的虚拟网桥进行通信,容器之间以及容器与宿主机之间都可以相互通信。Bridge模式为每个容器分配至个独立的网络命名空间,容器具有自己的ip地址,并且可以在同一个网段下相互通信。

Host:容器直接使用宿主机的网络栈,容器获得宿主机的IP得知,因此可以访问外部网络,但需要暴漏端口。这种模式适合需要搞网络性能的场景,但安全性较低。使用host网络创建容器:--net host

None:容器没有自己的网络接口,无法进行联网操作,适合于一些不需要网络连接的操作,如备份等;启动容器时,可以通过--network=none,docker容器不会分配局域网ip

创建自定义网络类型,并且指定网段;

docker network create --subnet=192.168.0.0/16 staticnet

可以通过docker network ls查看到网络类型中多了一个staticnet

然后使用新的网络类型创建并启动容器:docker run -itd --net staticnet --ip 192.168.0.2

自定义网络模式:Docker还允许创建自定义网络来实现更灵活的网络配置。在自定义网络模式下,还可以创建一个独立的网络,并将容器链接到该网络中。这样可以在自定义网络中实现容器之间的通信,同时也可以通过网络的连接方式将容器连接到宿主机网络或其他网络;

五、docker-compose

1、概要

默认的模板时docker-compose.yml,其中定义的每个服务可以通过image指令指定镜像或者build指令(Dockerfile)来自动构建。

注意:使用build指令,在Dockerfile中设置的选项(例如:CMD、EXPOSE、VOLUME、ENV等)将会被自动获取,无需再docker-compose.yml中在此设置。如果设置了会被YML覆盖。

2、常用的docker-compose命令

命令描述
docker-compose up -d构建启动容器
docker-compose exec bash登录到容器中
docker-compose down删除所有容器、镜像
docker-compose ps显示所有容器
docker-compose restart重新启动容器
docker-compose run --no-deps --rm php-fpm php -v在php-fpm中部启动关联容器,并容器执行php -v 执行完成后删除容器
docker-compose build构建容器
docker-compose build --no-cache不带缓存的构建
docker-compose logs查看日志
docker-compose logs -f验证文件配置
docker-compose stop 停止容器
3、docker-compose中常用的指令:

image——拉取镜像

build——指定Dockerfile所在文件夹的路径。Compose将会利用它自动构建这个镜像,然后使用这个镜像;

command——覆盖容器启动后默认执行的命令

links——连接到其他服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名(service:alias)格式都可以

external_links——链接到docker-compose.yml外部的容器,甚至并非compose管理的容器。参数格式跟links类似。

ports——暴漏端口信息。使用宿主:容器格式或者仅仅指定容器的端口都可以。

expose——暴漏端口,但不映射到宿主机,只被连接的服务访问。可以制定内部端口为参数。

volumes——卷挂载路径设置。可以设置宿主机路径或加上访问模式

volumes_from——从另一个服务或容器挂在他的所有卷

environment——设置环境变量。只给定名称的变量会自动获取它在Compose主机上的值,可以用来防止泄露不必要的数据

networks——用于设置指定网络,子标签aliases用于设置服务别名,相同的别名可以在不同的网络中拥有不同的设别别名。

此作者没有提供个人介绍
最后更新于 2024-12-29