云计算_Dockerfile与代理

Dockerfile

01. 文件 Dockerfile
02.在Dockerfile文件所在目录 执行构建-- docker build .	
  the current directory (.) as build context 

命令解释
 docker build command builds an image from a Dockerfile
    RUN  CMD  ENTRYPOINT
	ARG  ENV
    ADD  COPY
	VOLUME
	WORKDIR  USER
	LABEL
	EXPOSE   :  docker run -p port:port 命令时任然可以指定容器占用的端口。
	STOPSIGNAL ONBUILD

镜像标签。一个镜像可以有多个标签。打标签时要在LABEL值中包含空格  tag
ENV VAR=1与ENV VAR 1
  可以使用空格或等号将变量名称与值分开。	
ENTRYPOINT (Default Command to Execute at Runtime)
    ENTRYPOINT指令优先级更高 Docker  run的优先级更高
	可以在docker run命令中通过 --entrypoint  覆盖dockerfile文件中的ENTRYPOINT设置
	--entrypoint \ 可以覆盖默认启动
	--创建容器后,通过 dokcer ps查看容器信息时,COMMOND列会显示最终生效的启动命令。
        
    -w 的workdir

取消设置变量”可能意味着两件事:

  将其从环境中删除,  -- 环境中不存在的变量
  或将变量设置为空值。-- 环境中存在但设置为空值的变量
  当您想通过将变量设置为空值来“取消设置”变量时,您必须使用等号语法,否则在构建时会出现错误。
   ENV NOT_SENSITIVE=
   或者 
   ENV NOT_SENSITIVE ""  
 从技术上讲,这是两种不同的操作	
 unset NOT_SENSITIVE作为一个 shell 命令执行除了在这个 shell 中执行的内容之外不会影响其他任何事情
 
 要防止变量出现在 Docker 生成的层中。
   使用docker build --secret=和RUN --mount=type=secret...。

方式

在映像构建期间需要 env vars 但它们不应该持续存在
# set proxy
ARG http_proxy
ARG https_proxy
ENV http_proxy=$http_proxy
ENV https_proxy=$http_proxy 
	
	
# unset proxy
ENV http_proxy=
ENV https_proxy=

编译文件
docker build -t the-image \
    --build-arg http_proxy="$http_proxy" \
    --build-arg https_proxy="$http_proxy" \
    --build-arg no_proxy="$no_proxy" \
    --no-cache \
    .
说明
dockerfile  ARG 多次相同参数名--下一次没有传递出来
ARG http_proxy
 ARG https_proxy

ARG http_prox
ARG https_prox

ARG http_pro
ARG https_pro

Docker 镜像体积优化

有效精简docker镜像,从而提高自动化运维过程中的CI/CD效率,缩短交付时间
方向: 
  基础镜像小
  层级尽量少
  去除不必要
  复用镜像层
  分阶段构建

 1. 基础镜像源的选择
 2. .dockerignore
  .dockerignore文件和.gitrignore文件,也就是制作镜像时排除在外的文件
  创建一个名为.dockerignore的文件,把它放在当前的目录下即可,它的写法跟.gitignore文件很相似--即和Dockerfile相同目录下
   using ADD or COPY 命令时
 3.Dockerfile
     命令: 可以利用 ​​&​​ 来合并多个操作,减少层数	 
	 RUN、COPY、ADD指令会创建层,其他指令会创建临时的中间镜像,不会直接增加构建的镜像大小
 4.分阶段构建
 Multi-stage 构建镜像
  
 5.自动化的镜像瘦身工具docker-slim
   压缩镜像层级  docker-squash  : 压缩的原理是将镜像导出,然后删除所有中间层,将镜像的当前状态保存为单一层,达到压缩层级的效果

本地环境

console中执行
 使用代理执行:
 export http_proxy=http://127.0.0.1:80
 export https_proxy=http://127.0.0.1:80
 取消代理执行:
 export -n http_proxy
 export -n https_proxy
(针对当前窗口生效)

01.Dockerfile文件中使用本地代理(访问宿主机)

ENV http_proxy http://127.0.0.1:3001
ENV https_proxy https://127.0.0.1:3001

gpg: keyserver receive failed: Connection timed out	  
The command '/bin/sh -c apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys654' 
returned a non-zero code: 2

gpg和apt-key 代理的情况
 gpg和apt-key使不会直接读取终端中设置的代理,需要单独设置
 gpg --keyserver-options http-proxy=test.com:8080/" --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys SOMEKEY
 apt-key adv --keyserver-options http-proxy=test.com:8080/" --keyserver hkp://keyserver.ubuntu.com --recv-keys AKEYXXX
 
 Git设置代理
  # 使用代理
  && git config --global http.proxy "http://127.0.0.1:80" \
  && git config --global https.proxy "http://127.0.0.1:80" \
  # 下载
    git clone https://github.com/gperftools/gperftools.git -b gperftools --single-branch \
 #   取消代理
  && git config --global --unset http.proxy \
  && git config --global --unset https.proxy \

02.Docker-run

启动容器时,通过设置–env的flag,将环境变量传入容器
 –env HTTP_PROXY="http://127.0.0.1:3001"
 –env HTTPS_PROXY="https://127.0.0.1:3001"

Dockerfile的命令

01.不同点: 功能不同,运行的时间点不同,作用的有效范围不同,
 docker中arg和env的区别是:
  arg是在build的时候存在的,可以在Dockerfile中当做变量来使用,临时使用一下的变量没必要存环境变量的值就很适合使用 ARG
  而env是容器构建好之后的环境变量,不能在Dockerfile中当参数使用
  02.看	  
     Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"/entrypoint.sh\": permission denied": unknown
    entrypoint.sh  要具有可执行权限  
 03.总结:
 01.相同文件--执行不了--看是否权限不一样
 02.下载文件--下载不了--看本地是否有权限
 03.文件下载到Windows 下,再上传到unix ,非压缩文件会出现 :set ff
  :sef ff=unix

查看镜像的Dockerfile

  docker history [OPTIONS] IMAGE  该命令用于显示镜像的历史,查看镜像的历史变化
    docker history   --no-trunc a6038faa42f1
	
docker inspect [OPTIONS] NAME|ID [NAME|ID...] 该命令用于检查容器或镜像的详细信息。
     docker inspect    a6037faa22f1  

1.docker里面跑显示图像

Docker容器中的输出图像等如何在宿主屏幕上显示呢,可以采用文件挂载或者网络通信的方式
宿主机安装xserver,将docker容器视为客户端,
通过网络或挂载的方式就可以实现将需要显示的图像显示在宿主机显示器
Docker容器内的图形显示到宿主机屏幕

挂载的方式

挂载方式是在使用image创建docker容器时,
通过-v参数设置docker内外路径挂载,使显示 xserver 设备的socket文件在docker内也可以访问。
并通过-e参数设置docker内的DISPLAY参数和宿主机一致。   
 I.宿主机:
      1.主机端查看环境变量中的DISPLAY
         env | grep DISPLAY
  	     如果显: DISPLAY=:0
	  2.安装xserver
        $ sudo apt install x11-xserver-utils	 
      3.xhost + 是开放权限,允许所有用户包括docker访问X11的显示接口
  	    xhost +这个命令,需要宿主机每一次启动的时候都要输入的 出现access control disabled, clients can connect from any host说明操作成功.
  		
 II.Docker 镜像中配置Linux环境变量中DISPLAY
     export DISPLAY=:0 
   或者在
    -v /tmp/.X11-unix:/tmp/.X11-unix \           #共享本地unix端口
   -e DISPLAY=unix$DISPLAY \                    #修改环境变量DISPLAY
 III.验证
    验证方式	 

Docker 配置网络

  和主机共享网络的配置 --network host 
  向/etc/hosts中添加网络配置 --add-host docker_host:172.17.0.2 --add-host master_host:172.17.0.1

参考

Debian/Ubuntu 对gpg和apt-key使用代理--报错解决:gpg: keyserver receive failed: Connection timed out https://blog.csdn.net/zhangpeterx/article/details/94870949
【dockerfile】 docker build 设置代理 https://blog.csdn.net/erhaiou2008/article/details/107837344
 如何在dockerfile中取消设置“ ENV”? https://qa.1r1g.com/sf/ask/3905258661/
  How to unset "ENV" in dockerfile?  https://stackoverflow.com/questions/55789409/how-to-unset-env-in-dockerfile
  https://docs.docker.com/engine/reference/builder/
 本地宿主机器显示Docker 容器中的图像(Docker容器可视化) https://www.cnblogs.com/booturbo/archive/2022/07/31/16536857.html	
posted @ 2022-05-16 21:12  辰令  阅读(760)  评论(0编辑  收藏  举报