docker 无法访问部署服务怎么解决?
docker container exec -it 容器名称 sh 连接容器。 docker container start 容器名称 启动容器。
yum -y install bridge-utils brctl show docker0 检查docker0的连接的网卡接口。
sysctl -w net.ipv4.ip_forward=1 临时修改内核参数。
docker底层使用了哪些Linux技术?请举例说明。 - iptables 实现流量转发NAT - chroot 改变根目录 - cgoups 资源限制 - namespace 资源隔离 - overlayFS 联合文件系统
docker所用的各网络插件的优缺点
macvlan 优点:无需安装第三方播件。内核直接支持。
缺点:需要手动分配IP地址解夫地址中突问题,默认该网络无法联网,因此需要单独配置—块能用于上网的网卡。
overlay 优点:无需手动分配IP地址
缺点:需要单独安装consul服务,还需要修改docker的配置文件指定consul服务,
falnnel 优点:无需手动分配IP地址
缺点:需要单独安装etcd服务,还需要惨改docker启动脚本。
Dockerfile优化思路: 1.编译速度
指定基础镜像建议是本地存在或者是国内的镜像;
修改国内的软件源
尽量利用Dockerfile构建的镜像缓存技术:
将不经常修改的指令往前放
【FROM
MAINTAINER
LABEL
EXPOSE
WORKDIR
VOLUME】
指定基础镜像建议是本地存在或者是国内的镜像;将经常修改的指令往后放;
【RUN
COPY
ADD
CMD
ENTRYPOINT】
使用".dockerignore" 参考链接: Dockerfile reference | Docker Docs
2.镜像体积
删除无用的缓存;
卸载无用的软件;
使用较小的基础镜像,比如将centos基础环境改为Ubuntu或者alpine镜像。
常用Dockerfile指令 FROM(该参数必须指定): 1.指定基础镜像,必须放在首行!(注意,scratch是保留字,并不是镜像!如果使用了该关键字表示不依赖于任何镜像。) 2.导入ONBUILD指令代码 3.起别名,用做多阶段构建。 RUN: 在容器中运行指令。
COPY: 将宿主机的文件拷贝到容器中。如果容器目录不存在,则会自动创建。 也可以在多阶段拷贝数据。使用"--form"指定源。
ADD: 与COPY作用不同的是,可以解压tar包文件并删除源文件。
ENV: 将变量传递给容器,容器运行时会有该变量。 在容器启动或创建时可以使用-e,--env选项替换默认值。
ARG : 在编译阶段生效的变量。容器运行时不会存在该变量! 在编译的时候可以使用"--build-arg"选项替换默认值。 VOLUME: 对容器的指定路径生成随机存储卷。
EXPOSE: 暴露容器内的端口,外部使用随机端口映射时,可以暴露此处定义的服务端口,通常建议暴露的端口和服务有关。 将来用户使用"-P"(大写)时,就可以根据容器暴露的端口自动做映射啦。
MAINTAINER(Deprecated): 管理者标识,用于声明作者的信息。 官方已废弃(Deprecated),可能在未来的docker版本中移除它,因此我推荐大家使用更加灵活的LABEL指令。 LABEL: 为镜像打标签。基于KEY=VALUE方式打标签。
CMD: 如果用户启动容器时未指定COMMAND时,则使用改指令作为默认的COMMAND。 如果用户启动容器时指定COMMAND时,则该指令会被无视(忽略)。换句话说,该指令可以在容器启动时会被覆盖。 如果CMD和ENTRYPOINT都不指定,则默认为FROM指令的COMMAND。 如果FROM的值为scratch,则没有COMMAND,启动时需要用户自己指定。
ENTRYPOINT: 如果用户启动时未指定COMMAND时,则使用该指令作为默认的COMMAND。 如果用户启动时指定COMMAND时,则用户指定的COMMAND将作为参数传递给该指令。换句话说,该指令可以在容器启动时不会覆盖。 如果CMD和ENTRYPOINT一起使用时,CMD指令会当做参数传递,当然,我们也可以在容器启动时手动修改参数以覆盖CMD指令。 如果CMD和ENTRYPOINT都不指定,则默认为FROM指令的COMMAND,如果FROM的值为scratch,则没有COMMAND,启动时需要用户自己指定。
USER: 指定容器的运行用户,若不指定,默认为root用户,比如ES服务可能会用到。 值得注意的是,运行的服务使用普通用户运行的话,要注意权限问题
WORKDIR: 指定容器的工作目录,当用户连接到容器时,就默认在该目录,若不指定,则默认在"/"路径。 相当于"docker [container] run -w /path/to/workdir ..."
ONBUILD: 基础镜像触发器,构建镜像会构建触发器的相关指令,即当有其他镜像引用该镜像时会调用触发器。
HEALTHCHECK: 用做容器的健康检查,当容器内服务运行正常时,当容器指定了健康检查时,除了正常状态外,它还具有健康状态。 此状态最初为"starting". 每当健康检查通过时,它就会变成"healthy"(无论它以前处于什么状态)。 在连续失败一定次数后,就变成了"unhealthy"。 --interval=DURATION (default: 30s) 容器启动后,间隔多长时间进行健康检查,默认时30秒。也可以是分钟,比如"--interval=5m"。 --timeout=DURATION (default: 30s) 如果单次运行检查花费的时间超过指定的秒数,则认为检查失败,默认超时时间时30秒。 --start-period=DURATION (default: 0s) 启动服务的延迟检查时间,即在这个时间段内检查失败将不记录最大的重试次数。默认为0,表示不延迟检查。 (1)若在这个时间段内检查服务是健康的,则其状态会直接变更为"healthy", (2)若在这个时间段内检查失败将不记录最大的重试次数。 --retries=N (default: 3) 重试检查失败的次数,默认值为3.
SHELL: 调用系统命令的shell。这对Windows很有用,Linux无需使用,默认就是linux的shell。 如果有需要可以指定Windows的shell哟,如下所示,支持powershell和CMD。 SHELL ["powershell", "-command"], SHELL ["cmd", "/S", "/C"]
容器重启策略 always unless-stopped on-failure no
docker容器状态有哪些?
Up: 正在运行
Exit: 容器的COMMAND指定运行结束或者被kill。
Created: 容器被创建但没有运行。
Pause: 容器处于暂停状态,不会对外提供服务。
docker网络类型/模式
单机网络类型 none bridge host container custom network
跨主机网络类型 macvlan falnnel+etcd consul+overlay
你觉得Docker有哪些优缺点? 优点:
部署方便,效率高
资源使用率高,必须虚拟机更加轻量级
简化运维工作?比如: 便于环境迁移
隔离性强?相对于将所有应用部署到同一个节点。
生态好,有很多官方提供的镜像。 缺点:
安全性没有虚拟机强,进程级虚拟化;
基于编排功能较弱,故障冗余差,无法实现故障自愈?很难实现自动伸缩?
docker怎么动态查看容器状态?如何更新容器的资源限制?比如CPU和内存限制? docker stat ... docker update ...
docker与continerd有什么区别? 相同点:
都可以管理容器,镜像;
containerd和docker底层其实都会通过runc创建容器;
不同点:
docker内置了containerd,换句话说,可以使用docker来集成containerd,以实现containerd的功能; containerd生态没有docker完整。
containerd没有CNI插件,没有提供网络,docker有内置的网络类型。
containerd有namespace,可以实现资源隔离,docker并没有;
标签:容器,面试题,指定,指令,COMMAND,整理,镜像,docker From: https://blog.csdn.net/Cannotbelievesa/article/details/137597180