按需付费镜像常见问题
204
2022-07-30
dockerfile 是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
编写一个dockerfile 文件 docker build 构建成一个镜像 docker run 运行镜像 docker push 发布镜像(DockerHub、阿里云镜像仓库)
# 以contes为例 查看 dockerhub 上 contes 的 dockerfile FROM scratch ADD centos-7-x86_64-docker.tar.xz / LABEL \ org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20200809" \ org.opencontainers.image.title="CentOS Base Image" \ org.opencontainers.image.vendor="CentOS" \ org.opencontainers.image.licenses="GPL-2.0-only" \ org.opencontainers.image.created="2020-08-09 00:00:00+01:00" CMD ["/bin/bash"]
DockerFile构建过程
基础知识:
每个保留关键字(指令)都必须是大写字母 执行顺序从上到下顺序执行 表示注释 每个指令都会创建提交一个新的镜像层,并提交
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为企业交付的标准!
DockerFile:构建镜像,定义了一切的步骤,源代码;
DockerImages:通过DockerFile构建生成的一个镜像,这个镜像就是我们最终发布和运行的产品!
Docker容器:容器就是镜像运行起来提供服务!
DockerFile的指令
FROM # 基础镜像 MAINTAINER # 镜像是谁写的 姓名 + 邮箱 RUN # 镜像构建的时候需要运行的命令 ADD # 步骤 eg:tomcat镜像---》放入tomcat的压缩包!添加内容 WORKDIR # 镜像的工作目录 VOLUME # 挂载的目录位置 EXPOST # 暴露端口配置 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 ONBUILD # 当构建一个被继承的 DockerFile ,这个时候就会运行 ONBUILD 的指令,触发指令 COPY # 类似ADD,将我们的文件拷贝到镜像中 ENV # 构建的时候设置环境变量
实战测试
Docker Hub 中 99% 的镜像都是从 FROM scratch 这个基础镜像过来的 ,然后配置我们需要的软件和配置来进行构建
创建一个自己的centos
查看镜像的构建历史记录
# 命令 docker history 镜像id
[root@localhost ~]# docker history 41bb76be4884
IMAGE CREATED CREATED BY SIZE COMMENT
41bb76be4884 16 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
a8ba0ebb3770 16 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
a6924276bf90 16 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
fe68114ecf3f 16 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
c0a0546c9b2a 16 minutes ago /bin/sh -c yum install -y net-tools 31.3MB
408b06671488 17 minutes ago /bin/sh -c #(nop) WORKDIR /user/local 0B
59ab131ef44c 17 minutes ago /bin/sh -c #(nop) ENV MYPATH=/user/local 0B
8ee53d3f7a65 17 minutes ago /bin/sh -c #(nop) MAINTAINER yinxiaodong
我们平时拿到一个镜像,可以研究一下它是怎么做的---->docker history 镜像id
CMD 和 ENTRYPOINT 的区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 # 测试 CMD # 编写DockerFile的文件 [root@localhost dockerfile]# cat dockerfile-cmd-test FROM centos CMD ["ls","-a"] # 根据 DockerFile 构建镜像 [root@localhost dockerfile]# docker build -f dockerfile-cmd-test -t testcmd:0.1 . Sending build context to Docker daemon 3.072kB Step 1/2 : FROM centos ---> 0d120b6ccaa8 Step 2/2 : CMD ["ls","-a"] ---> Running in b3f8ba72222b Removing intermediate container b3f8ba72222b ---> 561e47f88730 Successfully built 561e47f88730 Successfully tagged testcmd:0.1 # 构建成功 # 查看镜像 [root@localhost dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE testcmd 0.1 561e47f88730 6 seconds ago 215MB centos latest 0d120b6ccaa8 2 days ago 215MB # 启动镜像 发现ls -a命令生效 [root@localhost dockerfile]# docker run -it testcmd:0.1 . .dockerenv dev home lib64 media opt root sbin sys usr .. bin etc lib lost+found mnt proc run srv tmp var # 启动命令中 追加一个 -l, 我们期望的是 ls -a -l,但是 报错,这里将 ls -a 替换成了 -l,最终的命令是 -l 所以报错。 [root@localhost dockerfile]# docker run -it 561e47f88730 -l docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown. # 将启动命令替换成 docker run -it testcmd:0.1 ls -al, 成功打印详细信息; [root@localhost dockerfile]# docker run -it testcmd:0.1 ls -al total 0 drwxr-xr-x. 1 root root 6 Aug 13 08:20 . drwxr-xr-x. 1 root root 6 Aug 13 08:20 .. -rwxr-xr-x. 1 root root 0 Aug 13 08:20 .dockerenv lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin drwxr-xr-x. 5 root root 360 Aug 13 08:20 dev drwxr-xr-x. 1 root root 66 Aug 13 08:20 etc drwxr-xr-x. 2 root root 6 May 11 2019 home lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64 drwx------. 2 root root 6 Aug 9 21:40 lost+found drwxr-xr-x. 2 root root 6 May 11 2019 media drwxr-xr-x. 2 root root 6 May 11 2019 mnt drwxr-xr-x. 2 root root 6 May 11 2019 opt dr-xr-xr-x. 123 root root 0 Aug 13 08:20 proc dr-xr-x---. 2 root root 162 Aug 9 21:40 root drwxr-xr-x. 11 root root 163 Aug 9 21:40 run lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 May 11 2019 srv dr-xr-xr-x. 13 root root 0 Aug 11 09:58 sys drwxrwxrwt. 7 root root 145 Aug 9 21:40 tmp drwxr-xr-x. 12 root root 144 Aug 9 21:40 usr drwxr-xr-x. 20 root root 262 Aug 9 21:40 var # 测试二:现在我们把 DockerFile 中 CMD 替换成 ENTRYPOINT 后重新构建,运行 看看结果 [root@localhost dockerfile]# cat dockerfile-cmd-test FROM centos ENTRYPOINT ["ls","-a"] # 重新构建镜像 [root@localhost dockerfile]# docker build -f dockerfile-cmd-test -t testcmd:0.2 . Sending build context to Docker daemon 3.072kB Step 1/2 : FROM centos ---> 0d120b6ccaa8 Step 2/2 : ENTRYPOINT ["ls","-a"] ---> Running in c634ca09fabe Removing intermediate container c634ca09fabe ---> 52d295395f08 Successfully built 52d295395f08 Successfully tagged testcmd:0.2 # 查看镜像 [root@localhost dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE testcmd 0.2 52d295395f08 7 seconds ago 215MB testcmd 0.1 561e47f88730 12 minutes ago 215MB centos latest 0d120b6ccaa8 2 days ago 215MB # 运行testcmd:0.2镜像 并追加 -l ,发现 打印出了详细信息 [root@localhost dockerfile]# docker run -it testcmd:0.2 -l total 0 drwxr-xr-x. 1 root root 6 Aug 13 08:17 . drwxr-xr-x. 1 root root 6 Aug 13 08:17 .. -rwxr-xr-x. 1 root root 0 Aug 13 08:17 .dockerenv lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin drwxr-xr-x. 5 root root 360 Aug 13 08:17 dev drwxr-xr-x. 1 root root 66 Aug 13 08:17 etc drwxr-xr-x. 2 root root 6 May 11 2019 home lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64 drwx------. 2 root root 6 Aug 9 21:40 lost+found drwxr-xr-x. 2 root root 6 May 11 2019 media drwxr-xr-x. 2 root root 6 May 11 2019 mnt drwxr-xr-x. 2 root root 6 May 11 2019 opt dr-xr-xr-x. 121 root root 0 Aug 13 08:17 proc dr-xr-x---. 2 root root 162 Aug 9 21:40 root drwxr-xr-x. 11 root root 163 Aug 9 21:40 run lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 May 11 2019 srv dr-xr-xr-x. 13 root root 0 Aug 11 09:58 sys drwxrwxrwt. 7 root root 145 Aug 9 21:40 tmp drwxr-xr-x. 12 root root 144 Aug 9 21:40 usr drwxr-xr-x. 20 root root 262 Aug 9 21:40 var
DockerFile中很多命令都十分相似,我们需要了解他的区别,最好的学习就是对比进行测试查看效果!
实战:Tomcat镜像
1、准备镜像文件 tomcat压缩包 jdk压缩包
[root@localhost tomcat]# ls apache-tomcat-8.5.43.tar.gz Dockerfile jdk-8u211-linux-x64.tar.gz read.txt
2、编写dockerfile文件, 官方命名Dockerfile,build会自动寻找这个文件,不需要 -f 指定!
发布自己的镜像
发布到 dockerHub
地址 https://hub.docker.com/ 注册自己的账号
确定自己的账号可以登录
在我们的服务器上提交
[root@localhost logs]# docker login --help Usage: docker login [OPTIONS] [SERVER] Log in to a Docker registry. If no server is specified, the default is defined by the daemon. Options: -p, --password string Password --password-stdin Take the password from stdin -u, --username string Username [root@localhost logs]# [root@localhost logs]# docker login -u xxx -p xxx WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
登录完毕后就可以提交镜像了
[root@localhost logs]# docker push xxx/mytomcat:1.0
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
发表评论
暂时没有评论,来抢沙发吧~