dos啥也不会

以需求为导向学习

docker的基本使用

本篇内容仅做备忘用,如无特殊说明,都是指Linux下的docker软件

修改镜像标签

从镜像仓库拉取的镜像默认名称是[repository]:[tag]这种形式,如果需要将镜像上传到其他仓库,或者方便日常使用,可以使用docker tag命令修改镜像标签.以下示例从harbor.example.com拉取一个镜像并上传至10.0.0.101服务器上运行在1234端口的私有仓库.如果

1
2
3
docker pull harbor.example.com/group/image:1.0
docker tag harbor.example.com/group/image[:1.0] 10.0.0.101:1234/newgroup/newimage[:1.1]
docker push 10.0.0.101:1234/newgroup/newimage:1.1

docker配置的一些坑

使用私有仓库前需要先配置私有仓库地址.如果仓库使用http或者自签https证书,需要将仓库设置为不安全的仓库

数据卷

如果dockerfile中使用VOLUME关键字指定了数据卷,或者在启动容器时没用指定宿主机路径,则会自动生成一个匿名数据卷

使用数据卷与使用宿主机目录有一定区别,当使用宿主机的时候可以挂载文件或者目录,当使用数据卷的时候可以挂载数据卷或者目录.当且仅当数据卷为空时,如果容器目标目录非空,docker引擎会将目标目录中的文件复制到数据卷中.

数据卷也可事先创建,并指定名称,这种数据卷被称为命名卷,匿名卷在生命周期上与命名卷有一点不同,当容器启时添加了--rm参数,则容器删除的时候会同步删除未被其他容器挂载的匿名卷,而命名卷只会在手动删除且没有容器使用的时候才会被删除

数据卷默认存放在宿主机上,但是也支持不同的驱动用于将数据存放在nfs或者其他设备上

1
2
3
4
# 显示当前所有数据卷
docker volume ls
# 清理未使用的数据卷
docker volume prune

容器内权限

默认情况下容器内的进程是以root身份运行的,当有外部应用需要与容器内应用以文件的方式交互时,可能会有问题.比如容器内程序产生的日志文件普通用户无法读取,或者在挂载了公共文件或目录时会遭到容器内程序的意外修改或未授权读取,从而影响宿主机的正常运行

日志问题

默认配置下docker会将容器内进程的标准输出和错误输出保存在json文件中,使用docker logs命令时会展示日志内容.但是docker并不会做日志切分和日志大小限制,这样就会又概率因为日志文件撑爆服务器磁盘.如果需要修改日志的配置可以参考官方文档修改/etc/docker/daemon.json这个配置文件

dind

dind即docker in docker,官方提供了docker:dind镜像,但是日常使用的时候也可以将docker可执行文件和docker.socket挂载到容器内实现
如果采用第二种方法,则需要注意

  1. 容器内需要有libltdl7依赖
  2. 容器内用户需要归属宿主机docker组或将宿主机docker.socket文件的权限修改为大于666

tini

tini是一个轻量级的init进程,在容器启动时,tini会作为第一个进程启动,适用于在容器环境下管理进程
如果容器会多个子进程,则可以使用tini提升容器稳定性