记录docker构建优化
记录一次node项目优化方案优化前: 以ubuntu发行版为基础镜像 不带小版本号 每次构建都从头构建(这里也推荐将package*json先copy过来进行install再copy . .,如果文件没变化,那就使用缓存,不重新构建) 优化后: 建立runtime基础镜像(包含提前安装好的基础依赖和环境, 包括node_modules),并使用alpine为基础镜像发行版 使用nexus管理项目包(docker/npm/maven) 指定具体版本号(只有 major version,没有指定 minor version、patch version。当该基础镜像 minor 或 patch 版本更新后,如果本地的镜像缓存也被清除了,那么打包就会使用新版本的基础镜像) 构建 Docker 镜像的时候,会缓存 Dockerfile 中尚未更改的所有步骤。所以,如果新构建时更改任何指令,将后的指令步骤将会重新来不再使用缓存。举例来说,就是指令 3 发生了变更,其后的 4-n 就会重跑并重新生成缓存。因此,编写 Dockerfile...
加快docker构建java项目速度
前提 Python、Node.js、Go项目使用docker构建镜像的时候,在有 Docker cache 的情况下,连续构建镜像的速度是可以很快的。 一般的优化方式是先安装依赖模块,然后再编译打包代码库。这样安装依赖的 image layer 可以被 Docker 缓存,下次再构建就不用安装依赖。 但目前主流的java打包(这里不说像GraalVM等技术)方式都是将源码和依赖包打在一起, 这导致无法充分利用缓存层加快镜像的构建速度 思路 按照node项目打包思路, 先copy package*文件进行构建, 再copy源码 这里以springboot项目举例 先弄一份初始化springboot start工程放在所需项目里 然后需要写两份dockerfile文件 第一份用来copy springboot start工程以及pom文件 然后执行maven命令打包, 这里我们不需要源码正确与否, 因为我们已经将pom内的jar包打到了本地 第二份dockerfile以第一份镜像为基准, 将基础镜像的springboot...
Docker-compose网络
默认网络 默认情况下,compose中的多个服务会加入一个名为default的网络。这些服务在default网络中是互通的。该default网络的全称是以compose文件所在文件夹名字做为前缀。比如文件夹为hello_world的compose。其一组服务对应的网络名为:hello_world_default。 这组service在该网络中,以compose文件中的第二组端口通信。 12345678910version: "3"services: web: build: . ports: - "8000:8000" db: image: postgres ports: - "8001:5432" 比如上述配置中,在hello_world_default网络中,web服务使用8000端口和db服务的5432端口通信。第一组端口8000和8001是宿主机访问web和db服务的端口。 使用已存在的网络1234docker network create...
docker-compose中的特殊符号问题
$美元符号 docker-compose和$$语法均受支持。 不支持扩展的外壳样式功能,例如${VARIABLE-default}和${VARIABLE/foo/bar}。 当配置需要美元符号时,可以使用$$(双美元符号)。 这也可以防止Compose插值。 所以写作: $${Time.now},其计算结果为${Time.now}
docker-compose-volumes的说明
docker-compose里两种设置volumes方式绝对路径的12345ghost: image: ghost volumes: - ./ghost/config.js:/var/lib/ghost/config.js 卷标的123456789101112131415161718192021222324252627version: "3.2"services: ch: build: context: . dockerfile: clickhouse.Dockerfile cache_from: - yandex/clickhouse-server:latest ports: - "8123:8123" volumes: - ch_db:/var/lib/clickhouse networks: - clickhouse# restart: always tabix: ...
开启2375远程访问
在/usr/lib/systemd/system/docker.service,配置远程访问。主要是在[Service]这个部分,加上下面两个参数: 123456cd /usr/lib/systemd/systemvi docker.serviceExecStart=ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock 使用如下命令进行连接 1docker -H tcp://ip:2375 exec -it <容器> bash
制作centos镜像并保持后台运行
手段有很多,只要保证后台是运行状态中即可1. 添加shell脚本: tail -f xxx文件,利用tail -f追逐更改日志,保证xxx文件有,即可(没有前面可以先touch xxx文件)2.添加tty: true来启用交互来维持后台运行,在docker-compose和k8s yaml中都有对应项, k3s中测试不好使,没找到原因,docker-compose测试倒是ok
镜像清理脚本
12345678910111213141516171819202122232425262728293031323334#!/usr/bin/env bash#删除过期镜像,保留最新${retain}个版本(需要确保版本号确实是越新的越大)retain=1cdate=$(date '+%Y-%m-%d_%H:%M:%S')# 镜像中的关键字keyword="docker.io"# 先删除异常停止的docker容器docker rm -f $(docker ps -a | grep Exited | awk '{print $1}')# 先删除名称或标签为none的镜像docker rmi -f $(docker images | grep '<none>' | awk '{print $3}')for service in $(docker images | grep...
Docker命令记录(长期)
Docker命令大全配置docker登陆时命令非明文环境变量的登录方式(通过/etc/profile设置PASSWORD变量),以下示例从变量读取密码,然后使用STDIN将其传递给docker login命令: 1echo "$PASSWORD" | docker login --username <xxx> --password-stdin ${REGISTRY_ADDRESS} Docker命令记录(长期)ctr为镜像打tag1ctr images tag oldimage:v1 newimage:v2 docker为镜像打tag1docker tag oldimage:v1 newimage:v2 从容器里面拷文件到宿主机1docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径 从宿主机拷文件到docker容器里面1docker cp 要拷贝的文件路径...
ENTRYPOINT和CMD
ENTRYPOINT和CMD都是让用户指定一个可执行程序, 这个可执行程序在container启动后自动启动 执行运行一个没有调用ENTRYPOINT或者CMD的docker镜像, 一定返回错误 12$ docker run alpineFATA[0000] Error response from daemon: No command specified 覆盖 首先两者都可以执行命令覆盖, 覆盖的情况如下 在写Dockerfile时, ENTRYPOINT或者CMD命令会自动覆盖基础镜像的ENTRYPOINT或者CMD命令. 在docker镜像运行时, 用户也可以在命令指定具体命令, 覆盖在Dockerfile里的命令. CMD: CMD命令可以直接接命令进行覆盖ENTRYPOINT: 使用--entrypoint参数覆盖默认的ENTRYPOINT 因为CMD命令很容易被docker run命令的方式覆盖, 所以, 如果你希望你的docker镜像的功能足够灵活, 建议在Dockerfile里调用CMD命令 执行命令的两种方法shell表示法:1CMD...