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 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镜像相关操作: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,则会被全部删除)

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特性,复制文件到容器层并修改。 删除文件:由上向下查找;若在镜像层找到文件,则在容器层中记录下此删除操作。

在多个 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

构建镜像的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 参数:在构建镜像时不使用缓存

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实践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 ================================================================================= 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实践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
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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框架的用法!