docker镜像:镜像加速;操作镜像:images、history、commit、build、tag、pull、push、rmi、search;base镜像;镜像分层结构;写时复制Copy-on-Write;构建镜像(docker commit、Dockerfile);搭建本地Registry

 

复制代码
配置docker阿里云镜像加速(docker.service文件、daemon.json文件)
=========================================================================
猜测:
    1.启动docker守护进程时,会读取文件docker.service,该文件中的"ExecStart=/usr/bin/dockerd-current xxxxxx",在ps aux |grep docker命令中可以看到
    2.默认只有/lib/systemd/system/docker.service,但是/etc/systemd/system/docker.service(该文件默认不存在)优先级更高
方法1:
    步骤1:cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
    步骤2:chmod 777 /etc/systemd/system/docker.service
    步骤3:修改/etc/systemd/system/docker.service文件的"ExecStart"内容
        ExecStart=/usr/bin/dockerd-current --registry-mirror=https://hub-mirror.c.163.com   #注意,网址最后不要有"/",吃过这个亏,会报错的。。
    步骤4:systemctl daemon-reload     #进行资源重载
           systemctl restart docker    
    步骤5:再次查看进行验证 ps aux |grep docker
-------------------------------------------------------------------------
方法2:修改/etc/docker/daemon.json文件即可
配置docker阿里云镜像加速(docker.service文件、daemon.json文件)
复制代码
复制代码
Docker deamon配置文件deamon.json说明
centos7:/etc/docker/下有key.json daemon.json(若无可以自己生成)
{
    "authorization-plugins": [],//访问授权插件
    "data-root": "",//docker数据持久化存储的根目录
    "dns": [],//DNS服务器
    "dns-opts": [],//DNS配置选项,如端口等
    "dns-search": [],//DNS搜索域名
    "exec-opts": [],//执行选项
    "exec-root": "",//执行状态的文件的根目录
    "experimental": false,//是否开启试验性特性
    "storage-driver": "",//存储驱动器
    "storage-opts": [],//存储选项
    "labels": [],//键值对式标记docker元数据
    "live-restore": true,//dockerd挂掉是否保活容器(避免了docker服务异常而造成容器退出)
    "log-driver": "",//容器日志的驱动器
    "log-opts": {},//容器日志的选项
    "mtu": 0,//设置容器网络MTU(最大传输单元)
    "pidfile": "",//daemon PID文件的位置
    "cluster-store": "",//集群存储系统的URL
    "cluster-store-opts": {},//配置集群存储
    "cluster-advertise": "",//对外的地址名称
    "max-concurrent-downloads": 3,//设置每个pull进程的最大并发
    "max-concurrent-uploads": 5,//设置每个push进程的最大并发
    "default-shm-size": "64M",//设置默认共享内存的大小
    "shutdown-timeout": 15,//设置关闭的超时时限(who?)
    "debug": true,//开启调试模式
    "hosts": [],//监听地址(?)
    "log-level": "",//日志级别
    "tls": true,//开启传输层安全协议TLS
    "tlsverify": true,//开启输层安全协议并验证远程地址
    "tlscacert": "",//CA签名文件路径
    {
    "authorization-plugins": [],//访问授权插件
    "data-root": "",//docker数据持久化存储的根目录
    "dns": [],//DNS服务器
    "dns-opts": [],//DNS配置选项,如端口等
    "dns-search": [],//DNS搜索域名
    "exec-opts": [],//执行选项
    "exec-root": "",//执行状态的文件的根目录
    "experimental": false,//是否开启试验性特性
    "storage-driver": "",//存储驱动器
    "storage-opts": [],//存储选项
    "labels": [],//键值对式标记docker元数据
    "live-restore": true,//dockerd挂掉是否保活容器(避免了docker服务异常而造成容器退出)
    "log-driver": "",//容器日志的驱动器
    "log-opts": {},//容器日志的选项
    "mtu": 0,//设置容器网络MTU(最大传输单元)
    "pidfile": "",//daemon PID文件的位置
    "cluster-store": "",//集群存储系统的URL
    "cluster-store-opts": {},//配置集群存储
    "cluster-advertise": "",//对外的地址名称
    "max-concurrent-downloads": 3,//设置每个pull进程的最大并发
    "max-concurrent-uploads": 5,//设置每个push进程的最大并发
    "default-shm-size": "64M",//设置默认共享内存的大小
    "shutdown-timeout": 15,//设置关闭的超时时限(who?)
    "debug": true,//开启调试模式
    "hosts": [],//监听地址(?)
    "log-level": "",//日志级别
    "tls": true,//开启传输层安全协议TLS
    "tlsverify": true,//开启输层安全协议并验证远程地址
    "tlscacert": "",//CA签名文件路径
    {
    "authorization-plugins": [],//访问授权插件
    "data-root": "",//docker数据持久化存储的根目录
    "dns": [],//DNS服务器
    "dns-opts": [],//DNS配置选项,如端口等
    "dns-search": [],//DNS搜索域名
    "exec-opts": [],//执行选项
    "exec-root": "",//执行状态的文件的根目录
    "experimental": false,//是否开启试验性特性
    "storage-driver": "",//存储驱动器
    "storage-opts": [],//存储选项
    "labels": [],//键值对式标记docker元数据
    "live-restore": true,//dockerd挂掉是否保活容器(避免了docker服务异常而造成容器退出)
    "log-driver": "",//容器日志的驱动器
    "log-opts": {},//容器日志的选项
    "mtu": 0,//设置容器网络MTU(最大传输单元)
    "pidfile": "",//daemon PID文件的位置
    "cluster-store": "",//集群存储系统的URL
    "cluster-store-opts": {},//配置集群存储
    "cluster-advertise": "",//对外的地址名称
    "max-concurrent-downloads": 3,//设置每个pull进程的最大并发
    "max-concurrent-uploads": 5,//设置每个push进程的最大并发
    "default-shm-size": "64M",//设置默认共享内存的大小
    "shutdown-timeout": 15,//设置关闭的超时时限(who?)
    "debug": true,//开启调试模式
    "hosts": [],//监听地址(?)
    "log-level": "",//日志级别
    "tls": true,//开启传输层安全协议TLS
    "tlsverify": true,//开启输层安全协议并验证远程地址
    "tlscacert": "",//CA签名文件路径
      
     "registry-mirrors": [//设置加速源     "http://aad0405c.m.daocloud.io"     ],
}
Docker deamon配置文件deamon.json说明
复制代码

 

复制代码
docker镜像相关操作:images、history、commit、build、tag、pull、push、rmi、search
=============================================================================================================================================
images    显示镜像列表
history   显示镜像构建历史
commit    从容器创建新镜像
build     从 Dockerfile 构建镜像
tag       给镜像打 tag
pull      从 registry 下载镜像
push      将 镜像 上传到 registry
rmi       删除 Docker host 中的镜像,不会删除 registry 的镜像。如果一个镜像对应了多个 tag,只有当最后一个 tag 被删除时,镜像才被真正删除。
search    搜索 Docker Hub 中的镜像;###如果想知道镜像都有哪些 tag,还是得访问 Docker Hub。https://hub.docker.com/###

###其实上面的命令大多都隐藏了一个image,例如:docker pull python == docker image pull python
###docker image inspect redis   #查看镜像分层的方式可以通过docker image inspect 命令

----------------------------------------------------------------------------------------------------------------------------------------------
镜像结构:${registry_name}/${repository_name}/${image_name}:${tag_name}
示例:docker.io/library/alpine:3.10.1

推荐上https://hub.docker.com/搜索镜像

查看本地镜像
    docker images        #注意:本地镜像的总大小,不能是这个命令简单的总和,因为docker分层的关系,不同的镜像可能存在复用的关系。
    docker history 5c57d7889c62     #构建该镜像的历史步骤
    docker image inspect 82f3b5f3c58f    #查看本地镜像的详细信息
搜索镜像
    docker search 镜像名
    docker search python
    #docker没有查看详情的命令,建议官方网站查(http://hub.docker.com),上面有最详细的信息。得出结论后再pull到本地使用
下载镜像(不注明tag将下载最新版本)
    docker pull 镜像名:tag
    docker pull python:3.6  
    docker pull username/mypython:tag  #下载指定用户的开源仓库的镜像
    注意1:操作私有仓库时,不能使用省略路径的方式
    注意2:tag就是tag,虽然你一般看到的是版本的形式,但实际上就只是一串字符串而已
    
上传镜像
    docker push     #上传镜像到自己的docker hub
    1.docker tag 容器ID username/mypython:tag  #将镜像名称重新TAG,username为自己的用户名,mypython则在docker hub中表现为一个仓库,仓库内存放各个tag(即历时版本,并不会进行覆盖)
    2.docker push username/mypython:tag  #上传镜像
生成镜像
    方式1:通过commit将容器保存为一个镜像
        docker commit -a="kuangshen" -m="add webapps app" 容器id tomcat02:1.0
    方式2:(详见Dockerfile)编写dockerfile文件;再使用bulid命令通过dockerfile文件来构建镜像
        docker build -f dockerfile-test-cmd -t cmd-test:0.1 .
操作镜像
    docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签) #重命名镜像 docker tag 170e243861ec mypython:3.6
    docker save 镜像ID > xxxx.tar  #导出镜像,压入到压缩包中
    docker load < xxxx.tar         #导入镜像

删除镜像
    docker rmi 镜像名:tag   #删除镜像
    docker rmi 镜像ID   #删除镜像;当有多个镜像的ID相同时,使用镜像ID删除镜像会失败(例如这个镜像TAG之后,就有多个镜像使用相同的镜像ID了)
    docker rmi -f 镜像ID  #强制删除镜像(若有多个镜像使用相同的镜像ID,则会被全部删除)
docker镜像相关操作:images、history、commit、build、tag、pull、push、rmi、search
复制代码

 

复制代码
base 镜像;docker镜像的分层结构
======================================================================================================
base 镜像有两层含义:
    1.不依赖其他镜像,从 scratch 构建。
    2.其他镜像可以之为基础进行扩展。
能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu, Debian, CentOS 等。


Linux 操作系统由内核空间和用户空间组成:
    内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉。
    用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录。
对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。



不同 Linux 发行版的区别主要就是 rootfs;Linux kernel 差别不大。
即不同linux发行版的区别主要在于用户空间;内核空间的区别不大,即内核区别不大
注意:
    base 镜像只是在用户空间与发行版一致,kernel 版本与发型版是不同的。
    容器只能使用 Host 的 kernel,并且不能修改。

----------------------------------------------------------------------------------------------------
docker镜像的分层结构:host内核+镜像层(多层镜像层)
    容器的分层结构:host内核+镜像层(多层镜像层)+容器层
    镜像分层最大的好处:共享资源,节省空间。


只有容器层是可写的,容器层下面的所有镜像层都是只读的。
写时复制Copy-on-Write:只有当需要修改时才复制一份数据;容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

读取文件:容器层---镜像层(镜像层一般为多层);由上向下查找,一旦找到就复制到内存
添加文件:新文件被添加到容器层
修改文件:由上向下查找;若在镜像层找到文件,则发挥Copy-on-Write特性,复制文件到容器层并修改。
删除文件:由上向下查找;若在镜像层找到文件,则在容器层中记录下此删除操作。
base 镜像;docker镜像的分层结构+写时复制Copy-on-Write
复制代码

 

复制代码
在多个 Docker Host 上使用镜像;docker镜像tag
==============================================================================================================
在多个 Docker Host 上使用镜像:
    1.用相同的 Dockerfile 在其他 host 构建镜像。
    2.将镜像上传到公共 Registry(比如 Docker Hub),Host 直接下载使用。
    3.搭建私有的 Registry 供本地 Host 使用。

---------------------------------------------------------------------------------------------------------
一个特定镜像的名字由两部分组成:repository 和 tag。如果执行 docker build 时没有指定 tag,会使用默认值 latest。
[image name] = [repository]:[tag]

注意latest tag:latest只是一个普通字符串,一般作为最新稳定版本的别名,但这只是一种约定,而不是强制规定。

docker tag myimage-v1.9.1 myimage:1
docker tag myimage-v1.9.1 myimage:1.9
docker tag myimage-v1.9.1 myimage:1.9.1
docker tag myimage-v1.9.1 myimage:latest

docker tag myimage-v1.9.2 myimage:1
docker tag myimage-v1.9.2 myimage:1.9
docker tag myimage-v1.9.2 myimage:1.9.2
docker tag myimage-v1.9.2 myimage:latest
在多个 Docker Host 上使用镜像;docker镜像tag
复制代码

 

复制代码
构建镜像的2种方法(docker commit和Dockerfile);调试 Dockerfile;构建docker镜像时的缓存特性
====================================================================================
Docker 提供了两种构建镜像的方法:
    方式1:通过commit将容器保存为一个镜像
        docker commit -a="作者信息" -m="备注信息" 容器id tomcat02:1.0
    方式2:(详见Dockerfile)编写dockerfile文件;再使用bulid命令通过dockerfile文件来构建镜像
        docker build -f dockerfile-test-cmd -t cmd-test:0.1 .

--------------------------------------------------
docker commit 就是将现有的容器保存为docker镜像;这种方式最直观,但是docker不推荐这种方式
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
不推荐的原因:
    1. 这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。比如要在 debian base 镜像中也加入 vi,还得重复前面的所有步骤。
    2. 更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患。

--------------------------------------------------
Dockerfile(推荐方法)构建镜像,底层也 docker commit 一层一层构建新镜像的。

docker build [OPTIONS] PATH | URL | -
docker build -t image_name .   
    #build时,指定的路径下应该尽可能干净,因为该路径下的所有文件都会被发送给Docker daemon
build时,Dockerfile每执行一行,都会经历创建容器---执行Dockerfile动作---commit镜像+删除容器
    
使用Dockerfile构建镜像步骤:
    1、 编写一个dockerfile文件;注意:dockerfile建议命名为Dockerfile,build时会去自动寻找该文件,就不需要-f指定
    2、 docker build 构建称为一个镜像;docker build -t image_name .   #注意“.”
    3、 docker run运行镜像:docker run -d --name name -p 6688:8000 镜像ID
    4、 docker push发布镜像(DockerHub 、阿里云仓库)

    vim dockerfile-test-cmd
    docker build -f dockerfile-test-cmd -t cmd-test:0.1 .        #默认使用Dockerfile进行构建,可以使用-f参数指定文件
    docker run cmd-test:0.1
    
--------------------------------------------------
根据镜像查看Dockerfile:
    1.登录https://hub.docker.com/查找镜像
    2.使用docker history命令查看构建历史记录
        以下2个命令未实测:
            docker history  --format "{{.CreatedBy}}" --no-trunc=true $DockerImage |sed "s/\/bin\/sh\ -c\ \#(nop)\ //g"|sed "s/\/bin\/sh\ -c/RUN/g" | tac
            docker history hello-world --format "{{.CreatedBy}}" --no-trunc=true  |sed "s/\/bin\/sh\ -c\ \#(nop)\ //g"|sed "s/\/bin\/sh\ -c/RUN/g" | tac

====================================================================================
调试 Dockerfile:
    当Dockerfile build时,执行失败时,那么中间状态的镜像会保存下来,此时可以使用该镜像run容器,再进行调试。
docker history可以查看镜像的构建历史
<missing>表示无法获取 IMAGE ID,通常从 Docker Hub 下载的镜像会有这个问题。

====================================================================================
镜像的缓存特性:docker build时,docker会尽可能利用缓存,来提升打包效率,在build日志中也会体现出来,关键字"Using cache"
docker build 命令中加上 --no-cache 参数:在构建镜像时不使用缓存
构建镜像的2种方法(docker commit和Dockerfile);调试 Dockerfile;构建docker镜像时的缓存特性
复制代码

 

复制代码
Dockerfile语法;Shell 格式+Exec 格式;RUN vs CMD vs ENTRYPOINT
==================================================================================================
FROM                            #指定 base 镜像。
MAINTAINER                        #设置镜像的作者,可以是任意字符串。
COPY                            #将文件从 build context 复制到镜像。COPY 支持两种形式:1.COPY src dest;2.COPY ["src", "dest"];注意:src 只能指定 build context 中的文件或目录。
ADD                                #与 COPY 类似;不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。
ENV                                #设置环境变量,环境变量可被后面的指令使用。
EXPOSE                            #指定容器中的进程会监听某个端口,Docker 可以将该端口暴露出来。
VOLUME                            #将文件或目录声明为 volume。
WORKDIR                            #为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。
RUN                                #在容器中运行指定的命令。
CMD                                #容器启动时运行指定的命令。可以有多个,但只有最后一个生效;CMD 可以被 docker run 之后的参数替换。
ENTRYPOINT                        #容器启动时运行指定的命令。可以有多个,但只有最后一个生效。CMD 或 docker run 之后的参数会被当做参数传递给 ENTRYPOINT。

ONBUILD                           # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。


示例:
    FROM centos                                              #基础镜像,一切从这里开始构建
    MAINTAINER cheng<1204598429@qq.com>
    COPY README /usr/local/README                            #复制文件
    ADD jdk-8u231-linux-x64.tar.gz /usr/local/               #复制解压到指定路径
    ADD apache-tomcat-9.0.35.tar.gz /usr/local/              #复制解压到指定路径
    RUN yum -y install vim                                     #在镜像中安装软件
    ENV MYPATH /usr/local                                    #设置环境变量
    WORKDIR $MYPATH                                          #设置工作目录
    ENV JAVA_HOME /usr/local/jdk1.8.0_231                    #设置环境变量
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35        #设置环境变量
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib         #设置环境变量 分隔符是:
    EXPOSE 8080                                              #设置暴露的端口
    CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apachetomcat-9.0.35/logs/catalina.out # 启动容器时,自动运行的命令

-----------------------------------------
1、FROM(指定基础 image):
构建指令,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库
        example:
            FROM centos:7.2
            FROM centos

2、MAINTAINER(用来指定镜像创建者信息):
构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。
        example:
            MAINTAINER  wangyang "wangyang@itxdl.cn"
    
3、RUN(安装软件用):
构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了Centos,那么软件管理部分只能使用Centos 的包管理命令
        example:    
            RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz 
            RUN ["/bin/bash", "-c", "echo hello"]

4、CMD(设置container启动时执行的操作):
设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条
        example:
            CMD echo “Hello, World!”  

5、ENTRYPOINT(设置container启动时执行的操作):
设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。
        example:
            ENTRYPOINT ls -l 
    
    #该指令的使用分为两种情况,一种是独自使用,另一种和CMD指令配合使用。当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效
        # CMD指令将不会被执行,只有ENTRYPOINT指令被执行  
            CMD echo “Hello, World!” 
            ENTRYPOINT ls -l  
         
        
    #另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数
        FROM ubuntu  
        CMD ["-l"]  
        ENTRYPOINT ["/usr/bin/ls"]  
    
6、USER(设置container容器的用户):
设置指令,设置启动容器的用户,默认是root用户
    example:
        USER daemon  =  ENTRYPOINT ["memcached", "-u", "daemon"]  

7、EXPOSE(指定容器需要映射到宿主机器的端口):设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。
        example:
            映射一个端口  
            EXPOSE 22
            相应的运行容器使用的命令  
            docker run -p port1 image  
          
            映射多个端口  
            EXPOSE port1 port2 port3  
            相应的运行容器使用的命令  
            docker run -p port1 -p port2 -p port3 image  
            还可以指定需要映射到宿主机器上的某个端口号  
            docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image  

8、ENV(用于设置环境变量):构建指令,在image中设置一个环境变量
        example:
            设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:
            ENV JAVA_HOME /path/to/java/dirent
    
9、ADD(从src复制文件到container的dest路径)
        example:    
            ADD <src> <dest>  
                <src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;
                <dest> 是container中的绝对路径

10、COPY (从src复制文件到container的dest路径)
        example:    
            COPY <src> <dest> 

10、VOLUME(指定挂载点):
设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令
        examp:    
            FROM base  
            VOLUME ["/tmp/data"]  

11、WORKDIR(切换目录):设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效
        example:
            WORKDIR /p1 WORKDIR p2 RUN vim a.txt  
    
12、ONBUILD(在子镜像中执行):ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行
        example:    
            ONBUILD ADD . /app/src
            ONBUILD RUN /usr/local/bin/python-build --dir /app/src


==================================================================================================
Shell 格式:<instruction> <command>
Exec 格式:<instruction> ["executable", "param1", "param2", ...]

Shell 和 Exec 格式,二者在使用上有细微的区别:
    当指令执行时,shell 格式底层会调用 /bin/sh -c <command>。
    当指令执行时,Exec 格式会直接调用 <command>,不会被 shell 解析。

    ENV name Cloud Man  
    ENTRYPOINT echo "Hello, $name"         #此处name会被自动解析

    ENV name Cloud Man  
    ENTRYPOINT ["/bin/echo", "Hello, $name"]    #exec格式将不会解析变量
    ENTRYPOINT ["/bin/sh", "-c", "echo Hello, $name"]    #exec格式的这种写法,将会自动解析变量

==================================================================================================
RUN vs CMD vs ENTRYPOINT
    1.RUN 执行命令并创建新的镜像层,RUN 经常用于安装软件包。
    2.CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换。
    3.ENTRYPOINT 配置容器启动时运行的命令。

    CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。RUN 则两种格式都可以。


-------------------------------------------------
RUN 指令通常用于安装应用和软件包。
RUN apt-get update && apt-get install -y  bzr  cvs  git  mercurial  subversion
    apt-get update 和 apt-get install 被放在一个 RUN 指令中执行,这样能够保证每次安装的是最新的包。

-------------------------------------------------
CMD 指令允许用户指定容器的默认执行的命令。
CMD 有三种格式:
    1.Exec 格式:CMD ["executable","param1","param2"];这是 CMD 的推荐格式。
    2.CMD ["param1","param2"] 为 ENTRYPOINT 提供额外的参数,此时 ENTRYPOINT 必须使用 Exec 格式。
    3.Shell 格式:CMD command param1 param2

    第二种格式 CMD ["param1","param2"] 要与 Exec 格式 的 ENTRYPOINT 指令配合使用,其用途是为 ENTRYPOINT 设置默认的参数。

-------------------------------------------------
ENTRYPOINT 指令可让容器以应用程序或者服务的形式运行。
    ENTRYPOINT 不会被忽略,一定会被执行,即使运行 docker run 时指定了其他命令。

ENTRYPOINT 有两种格式:
    1.Exec 格式:ENTRYPOINT ["executable", "param1", "param2"] 这是 ENTRYPOINT 的推荐格式。
    2.Shell 格式:ENTRYPOINT command param1 param2
    在为 ENTRYPOINT 选择格式时必须小心,因为这两种格式的效果差别很大。
    
ENTRYPOINT 的 Exec 格式用于设置要执行的命令及其参数,同时可通过 CMD 提供额外的参数。
    ENTRYPOINT 中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。

    ENTRYPOINT Exec 格式实例:
        ENTRYPOINT ["/bin/echo", "Hello"]  
        CMD ["world"]

    docker run -it [image]                    #Hello world
    docker run -it [image] CloudMan            #Hello CloudMan


ENTRYPOINT 的 Shell 格式会忽略任何 CMD 或 docker run 提供的参数。

-------------------------------------------------
使用总结:
    1.使用 RUN 指令安装应用和软件包,构建镜像。
    2.如果 Docker 镜像的用途是运行应用程序或服务,比如运行一个 MySQL,应该优先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可为 ENTRYPOINT 提供额外的默认参数,同时可利用 docker run 命令行替换默认参数。
    3.如果想为容器设置默认的启动命令,可使用 CMD 指令。用户可在 docker run 命令行中替换此默认命令。
Dockerfile语法;Shell 格式+Exec 格式;RUN vs CMD vs ENTRYPOINT 以及3个命令的使用总结
复制代码

 

复制代码
我的Dockerfile实践1(备注版)
=================================================================================
FROM ubuntu:16.04
FROM python:3.6

MAINTAINER auther

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        postgresql-client \
    && rm -rf /var/lib/apt/lists/*

#设置环境变量;这个备注不要和ENV MYPATH写在同一行,会有bug...
ENV MYPATH /usr/local   
#设置进入容器时所在的默认路径                
WORKDIR $MYPATH                         

# ADD sources.list /etc/apt/ #更换更新源
#ENV <key1>=<value1> <key2>=<value2>...
ENV DJANGO_VERSION=2.2.1 PYCRYPTODOME=3.9.8 BEAUTIFULSOUP4=4.6.3 REQUESTS=2.22.0 OPENPYXL=2.5.5 PARAMIKO=2.7.2

#不指定更新源,下载django太慢了
RUN pip install django=="$DJANGO_VERSION" -i https://pypi.tuna.tsinghua.edu.cn/simple    
RUN pip install pycryptodome=="$PYCRYPTODOME" beautifulsoup4=="$BEAUTIFULSOUP4" requests=="$REQUESTS" openpyxl=="$OPENPYXL" paramiko=="$PARAMIKO" -i https://pypi.tuna.tsinghua.edu.cn/simple  

COPY NDMS20200724forlinux_ssh /usr/local/NDMS20200724forlinux_ssh/
# windows下使用绝对路径有问题,就使用相对路径吧,即把需要导入的文件和Dockerfile放在同一个文件夹中 
# 拷贝当前目录下的bin文件夹的所有文件到/usr/local目录下

VOLUME /home/NDMS20200724forlinux_ssh/db.sqlite3   #这是有问题的,只能挂在数据卷(文件夹)
#定义匿名数据卷,在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

# EXPOSE 8000 #不需要暴露端口,这样反而会和django的8000端口有冲突
CMD ["python", "NDMS20200724forlinux_ssh/manage.py", "runserver", "0.0.0.0:8000"]

# CMD /bin/bash
我的Dockerfile实践1(备注版)
复制代码
复制代码
我的Dockerfile实践1
=================================================================================
FROM ubuntu:16.04
FROM python:3.6

MAINTAINER auther

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        postgresql-client \
    && rm -rf /var/lib/apt/lists/*


ENV MYPATH /usr/local                
WORKDIR $MYPATH                         

ENV DJANGO_VERSION=2.2.1 PYCRYPTODOME=3.9.8 BEAUTIFULSOUP4=4.6.3 REQUESTS=2.22.0 OPENPYXL=2.5.5 PARAMIKO=2.7.2


RUN pip install django=="$DJANGO_VERSION" -i https://pypi.tuna.tsinghua.edu.cn/simple    
RUN pip install pycryptodome=="$PYCRYPTODOME" beautifulsoup4=="$BEAUTIFULSOUP4" requests=="$REQUESTS" openpyxl=="$OPENPYXL" paramiko=="$PARAMIKO" -i https://pypi.tuna.tsinghua.edu.cn/simple  

COPY NDMS20200724forlinux_ssh /usr/local/NDMS20200724forlinux_ssh/


CMD ["python", "NDMS20200724forlinux_ssh/manage.py", "runserver", "0.0.0.0:8000"]
我的Dockerfile实践1
复制代码
复制代码
我的Dockerfile实践2
=================================================================================
FROM python:3.6
WORKDIR /home                        

RUN pip install django==2.2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple    
RUN pip install pycryptodome==3.9.8 beautifulsoup4==4.6.3 requests==2.22.0 openpyxl==2.5.5 paramiko==2.7.2 -i https://pypi.tuna.tsinghua.edu.cn/simple  

COPY NDMS20200724forlinux_ssh /home/NDMS20200724forlinux_ssh/

ENTRYPOINT ["python", "NDMS20200724forlinux_ssh/manage.py", "runserver", "0.0.0.0:8000"]
CMD /bin/bash

https://www.cnblogs.com/shaozheng/p/12616701.html




实测都可以访问网站,以上的2个版本还是不一样的,一个连ubuntu都没装
root@69f1e88f3aba:/home# ls
NDMS20200724forlinux_ssh
root@9a349644b41c:/usr/local# ls
NDMS20200724forlinux_ssh  bin  etc  games  include  lib  man  sbin  share  src
我的Dockerfile实践2
复制代码

 

019 - 使用公共 Registry

docker login docker.io #登录docker账号
cat /root/.docker/config.json #查看账号的信息吧...


020 - 搭建本地 Registry

复制代码
实验:docker自定义官方仓库registry
====================================================================================================
server端命令
0.提前准备好镜像:registry以及自定义镜像(registry这个就是docker官方镜像,是以容器的方式运行的)
1.vim /etc/docker/daemon.json
        {
            "insecure-registries":["192.168.1.112:5000"]
        }
2.docker资源重载并重启docker守护进程
    systemctl daemon-reload    
    systemctl restart docker 
3.启动仓库容器
    docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000  --restart=always registry
4.自定义镜像并上传镜像
    docker tag registry:latest 192.168.1.112:5000/registry:latest
    docker push 192.168.1.112:5000/registry:latest

    docker tag hello-world:latest 192.168.1.112:5000/my_hello:v1.0
    docker push 192.168.1.112:5000/my_hello:v1.0

----------------------------------------------------------------------------------------------------
client端命令
0.vim /etc/docker/daemon.json
        {
            "insecure-registries":["192.168.1.112:5000"]
        }
1.docker资源重载并重启docker守护进程
    systemctl daemon-reload    
    systemctl restart docker 
2.查看镜像仓库容器内的镜像资源,并下载
    curl -XGET http://192.168.1.112:5000/v2/_catalog
    docker pull 192.168.1.112:5000/registry
    docker pull 192.168.1.112:5000/my_hello:v1.0

    [root@yefeng docker]# curl -XGET http://192.168.1.112:5000/v2/_catalog
    {"repositories":["my_hello","registry"]}
    [root@yefeng docker]# docker pull 192.168.1.112:5000/my_hello:v1.0
    v1.0: Pulling from my_hello
    Digest: sha256:f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4
    Status: Image is up to date for 192.168.1.112:5000/my_hello:v1.0
    192.168.1.112:5000/my_hello:v1.0
实验:docker自定义官方仓库registry
复制代码

 

posted @   雲淡風輕333  阅读(123)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示