docker 容器化时的几个小技巧
1 使用make文件:make file可以简化平时打的命令,并且可以将命令托管到github,改动也比较容易表现
PORT = 8081
IMAGE=127.0.0.1:5000/base-image
TAG=latest
NAME=my-project-$(PORT)
prepare:
wget http://am1.php.net/distributions/php-7.2.12.tar.gz -P install/
wget https://nginx.org/download/nginx-1.14.0.tar.gz -P install/
docker-context:
build: docker-context
docker build -t $(IMAGE):$(TAG) .
build72: docker-context
docker build -t $(IMAGE):php72 -f Dockerfile72 .
run:
docker run -d -p $(PORT):80 -v $(shell pwd)/html:/tool/nginx-1.14.0/html --name $(NAME) $(IMAGE):$(TAG)
debug:
docker run -ti -p $(PORT):80 -v $(shell pwd)/html:/tool/nginx-1.14.0/html --name $(NAME) $(IMAGE):$(TAG) /bin/bash
clean:
docker stop ${NAME}
docker rm ${NAME}
logs:
docker logs ${NAME}
publish:
docker push ${IMAGE}
prod-pre:
git clone https://github/xxxxx.git html
cp env/prod.env html/.env
prod-up:
docker-compose -f docker-compose-prod.yml up -d
docker exec my-project-80 /tool/nginx-1.14.0/html/init-prod.sh
prod-start:
docker-compose -f docker-compose-prod.yml start
docker exec my-project-80 /tool/nginx-1.14.0/html/start-prod.sh
prod-stop:
docker-compose -f docker-compose-prod.yml stop
prod-rebuild:
docker exec my-project-80 /tool/nginx-1.14.0/html/start-prod.sh
prod-down:
docker-compose -f docker-compose-prod.yml down
2 调试
docker run -d -p 8081:80 -v .:/tool/nginx-1.14.0/html --privileged=true --restart=always --name test 127.0.0.1:5000/my-project:latest
# Debug
docker run -it -p 8081:80 -v .:/tool/nginx-1.14.0/html --privileged=true --name test 127.0.0.1:5000/my-project:latest /bin/bash
docker run 命令使用 -it 可以直接进入容器,进行调试之类的很方便
同样,如果容器在运行中,可以使用docker exec 容器名 /bin/bash
减少镜像大小的方法
使用适量的基础镜像:选择一个合适的基础镜像作为起点,可以根据应用程序的需求选择官方提供的轻量级镜像,如Alpine Linux。这样可以避免使用庞大的基础镜像,减少镜像的体积。
最小化安装软件包:在容器中只安装必要的软件包和依赖项,避免不需要的组件。可以通过在Dockerfile中使用尽量精确的软件包安装命令,避免使用通配符,以减少镜像的大小。
使用多阶段构建(Multi-stage builds):如果应用程序有编译阶段和运行阶段,可以使用多阶段构建来减少镜像的大小。在构建阶段中安装编译工具和依赖项,完成编译后,将构建好的二进制文件复制到最终的运行阶段。这样可以避免将编译工具和源代码包含在最终的镜像中,减小镜像的体积。
# Stage 1: 编译阶段 FROM golang:1.16-alpine AS builder WORKDIR /app # 将源代码复制到容器中 COPY . . # 执行编译命令 RUN go build -o myapp # Stage 2: 运行阶段 FROM alpine:latest WORKDIR /app # 从编译阶段复制编译好的二进制文件到最终镜像中 COPY --from=builder /app/myapp . # 指定容器启动时执行的命令 CMD ["./myapp"]
合并多个命令:在 Dockerfile 中,可以将多个命令合并为一个 RUN 命令,这样可以避免创建多个镜像层,减少镜像的层数,从而减小镜像的大小。
RUN yum -y update \ && yum install -y wget gcc make \ && yum install -y openssl-devel \ && yum install -y zlib-devel pcre-devel \ && yum -y install libxml2-devel curl-devel libjpeg-devel libpng-devel freetype-devel freetype \ && yum install -y epel-release \ && yum install -y supervisor \ && curl --silent --location https://rpm.nodesource.com/setup_8.x | bash - \ && yum install -y nodejs \ && yum install -y gmp-devel \ && yum install -y git \ && yum install -y sqlite \ && yum install -y sqlite-devel \ && yum install -y oniguruma \ && yum install -y oniguruma-devel \ && mkdir -p /tool \ && mkdir -p /install \ && yum install -y crontabs
删除不需要的文件和缓存:在镜像构建过程中,确保在使用完文件后将其删除,避免不必要的文件留在镜像中。另外,可以使用
apt-get
或yum
命令后跟clean
或autoclean
来清理软件包管理器的缓存文件,减小镜像的大小。使用压缩和归档:在复制文件到镜像中时,可以将文件压缩为 tar 归档格式,然后在容器中解压缩。这样可以减小镜像的体积,并提高文件复制的效率。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: