Docker进阶使用 ========================================================================================================================== 镜像操作 一、使用现有容器制作镜像 docker commit 示例: docker commit -a "xuekaixin jinweiayy@gmail.com" -m "test commit. httpd busybox" -p busybox-test-01 \ registry.cn-hangzhou.aliyuncs.com/xuekaixin/test_repo:latest docker push registry.cn-hangzhou.aliyuncs.com/xuekaixin/test_repo:latest docker run -d -i -t --name "container-test-01" registry.cn-hangzhou.aliyuncs.com/xuekaixin/xuekaixin:busybox-0.1 httpd -f -h /web 二、 使用现有容器制作镜像(使用-c选项,启动默认知行某命令) docker commit -p -a "xuekaixin [:] FROM @ digest为镜像的哈希码 MAINTAINER 说明:用于Dockerfile制作者提供额外信息(已废弃) 格式: MAINTAINER "authtor author@qq.com" LABEL 说明:为镜像提供各种元数据 LABEL key=value key=value ... COPY 说明:用于从docker主机复制文件至创建的镜像中。 格式: COPY ... COPY ["",""... ] 注意: 1、路径或文件名支持使用通配符 2、dest建议使用绝对路径 3、src必须是dockerfilework目录中的文件 4、如果src为目录,则其内部的文件及目录会被递归复制 5、如果指定了多个src或者src中使用的通配符,则dest必须是一个目录,且必须以 / 结尾 6、如果dset不存在,则会被自动创建 ADD 说明:类似于COPY指令,AND支持使用URL路径。此外,还支持tar类型的文件,会将压缩文件展开复制到目标路径 格式: ADD ... ADD ["",""... ] 注意: 1、如果src为URL且dest不以/结尾,则src指定的文件将被下载并被创建为dest 2、如果dest以/结尾,则直接被下载到dest目录下 3、通过URL获取的tar文件不会被自动展开 4、src是一个本地系统上的tar压缩文件时,此压缩文件被自动展开为一个目录 WORKDIR 说明:用于为Dockerfile中的所有URL、CMD、COPY和ADD设定工作目录。指容器内执行时的路径 格式: WORKDIR 示例: WORKDIR /usr/local/ ADD nginx-1.14.0.tar.gz ./ VOLUME 说明:用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其他容器上的卷 格式: VLOUME 注意:如果挂载点目录下存在文件,则docker run命令会在卷挂载完成后将这些存在的文件复制到挂载到卷中 EXPOSE 说明:用于为容器打开指定要监听的端口以实现与外部通信 格式: EXPOSE [/] [][/] .. 注意: 1、用于指定协议,tcp或者udp,默认为tcp协议 2、启动容器时如果不指定-P选项,则使用EXPOSE指令暴露的端口不是真正意义上的暴露端口 ENV 说明:用于制作镜像时所需要的环境变量,可被Dockerfile中的ENV、ADD、COPY后的指令所引用 定义格式: ENV # key之后的内容都被视为key的值,这种格式只能设置一个环境变量 ENV = ... # 可一次设置多个变量。value中使用反斜线可转义空格或换行,也可以对value加引号标识 引用格式: $Variable_Name ${Variable_Name} RUN 说明:指定在构建镜像的过程中要运行的程序,可以是任何命令 格式: RUN RUN ["","",""] 注意: 1、第一种格式运行的命令是一个shell命令,且以/bin/sh -c来执行,这意味着此进程在容器中的PID不为1,不能接受Unix信号, 使用docker stop container时不能接收到SIGTERM信号 2、第二种格式是一个JSON格式的数组。表示要运行的命令,后面的表示参数。这种格式不会使用/bin/sh来执行。 如果需要使用shell来执行,不能使用shell的特性。可以使用 RUN ["/bin/sh -c","","[aram1]"] CMD 说明:类似于RUN命令,区别于运行时间不同。RUN指令表示在构建镜像时执行的命令,而CMD表示构建的镜像启动为容器时执行的命令。 CMD设置的命令可被在docker run启动时指定的所执行的命令选项覆盖。Dockerfile中可存在多个CMD指令,但仅之后一个生效。 格式: CMD CMD ["","",""] CMD ["",""] # 为 ENTRYPOINT 提供额外的参数,此时 ENTRYPOINT 必须使用 Exec 格式 注意: 1、CMD 此种方式将使用/bin/sh启动命令进程,并默认使用exec的方式启动进程,将命令进程PID替换为1 2、CMD ["","",""] 这种格式不会使用/bin/sh来执行 ENTRYPOINT 说明:类似于CMD命令,用于为容器指定默认运行程序 格式: ENTRYPIONT ENTRYPIONT ["","",""] 注意: 1、此指令启动的程序不会被 docker run 命令行指定的参数覆盖,而且命令行指定的参数还会传递给ENTRPOINT指定的命令 2、在docker run命令行中使用参数 --entrypoint string可以覆盖ENTRYPOINT命令指定的参数 USER 说明:用于指定运行image时或运行Dockerfile中的任何RUN、CMD、或ENTRYPOINT指令指定的程序时的用户名或UID,默认是root用户 (指容器内) 格式: USER | 注意: UID必须为/etc/passwd中的某用户的有效UID HEALTHCHECK 说明:自 1.12 版本之后,Docker 引入了原生的健康检查实现,可以在Dockerfile中声明应用自身的健康检测配置 格式: HEALTHCHECK [选项] CMD <命令> # 设置检查容器健康状况的命令 HEALTHCHECK NONE # 如果基础镜像有健康检查指令,使用这行可以屏蔽掉 选项: --interval=<间隔> # 两次健康检查的间隔,默认为 30 秒 --timeout=<间隔> # 健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒 --retries=<次数> # 当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次 --start-period=<间隔> # 应用的启动的初始化时间,在启动过程中的健康检查失效不会计入,默认 0 秒,(从17.05)引入 注意: 1、在Dockerfile中 HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效 2、在 HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 格式,和 exec 格式 Dockerfile练习示例 示例一: # First Dockerfile FROM busybox:latest ENV auth="xuekaixin" mail="jinweiayy@163.com" CopySouPath="/web/index.html" CopyDesPath="/" LABEL author=$auth mail=$mail COPY $CpoySouPath $CopyDesPath # ADD https://nginx.org/download/nginx-1.14.0.tar.gz /usr/local/ ADD nginx-1.14.0.tar.gz /usr/ WORKDIR /usr/local/ ADD nginx-1.14.0.tar.gz ./ VOLUME /testdata EXPOSE 80/tcp 示例二: # First Dockerfile FROM centos:latest COPY nginx-1.14.0.tar.gz /usr/local/ EXPOSE 80/tcp RUN mkdir /usr/local/nginx && \ cd /usr/local/nginx && \ tar -xf /usr/local/nginx-1.14.0.tar.gz -C /usr/local/nginx && \ rm -rf nginx-1.14.0.tar.gz && \ yum -y --nogpgcheck install epel-release.noarch gcc make pcre pcre-devel openssl openssl-devel zlib zlib-devel gzip gzip-devel && \ cd /usr/local/nginx && \ yum clean all && \ cd nginx-1.14.0 && \ ./configure --prefix=/usr/local/nginx && \ make && \ make install COPY index.html /web/ COPY nginx.conf /usr/local/nginx/conf CMD /usr/local/nginx/sbin/nginx 五、RUN、CMD、ENTRYPOINT区别 两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令,Shell 格式和 Exec 格式。 RUN 执行命令并创建新的镜像层,RUN 经常用于安装软件包。 CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换。 ENTRYPOINT 配置容器启动时运行的命令。 总结: 1、RUN、CMD、ENTRYPOINT的使用都有两种格式,shell 和 Exec 格式。当使用 shell 格式时,执行命令时会调用/bin/sh来执行, shell的特性可以被使用。而使用Exec时,是直接调用命令,shell特性不能被识别。当使用 shell 格式时,启动容器时之后会 将运行的程序的PID替换为1。 2、RUN 是在构建镜像时指定所要执行的命令,CMD 和 ENTRYPOINT 是镜像启动为容器时指定所要执行的命令。 3、当启动容器时,指定容器运行的程序,则会覆盖 CMD 指定的命令。 4、Dockerfile中的多个CMD指令只有最后一个生效。 ========================================================================================================================== Docker私有registry (docker-distribution) 一、基本知识 1、Docker registry 使用 https 传输镜像。 2、Docker 为了快速创建私有 regisry,Docker 提供了一个程序包 docker-distribution。 二、安装使用docker-distribution 1、安装 yum install docker-distribution 2、启动服务 systemctl start docker-distribution 3、默认情况下,客户端push镜像是使用https协议,修改docker客户端 vim /etc/docker/daemon.json "insecure-registries": ["10.53.252.90:80"] ========================================================================================================================== Docker私有registry (Harbor) [mysqld] skip_name_resolve = 1 bind_address = 10.53.220.91 binlog_format = MIXED max_binlog_size = 1073741824 expire_logs_days = 0 sync_binlog = 0 log_basename = Master default_storage_engine = InnoDB innodb_file_per_table = ON autocommit = 1 transaction‐isolation = REPEATABLE‐READ general_log = 1 general_log_file = query.log log_output = file long_query_time = 10 slow_query_log = ON log_slow_rate_limit = 1 log_slow_verbosity = query_plan,innodb,explain log_warnings = 1 [client] host = localhost user = 'root' password = '123' !includedir /etc/my.cnf.d ==========================================================================================================================