容器 DockerFile
DockerFile
dockerfile 介绍
DockerFlie 是用来构建Docker镜像的文件!牧民了参考脚本!
构建步骤:
- 编写一个dockerfile 文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像 (DockerHub、阿里云镜像仓库)仓库也分为私有和公有!
比如去https://github.com/…
FROM scratch
ADD centos-7-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=“20181204”CMD ["/bin/bash"]
最基础的镜像
很多官方的镜像都是基础包,很多功能都没有,我们通常会自己搭建!
官方既然可以制作镜像,我们也可以!
Dockerfile构建过程
基础知识
- 每个保留关键字(指令)都是必须是大写字母
- 执行从上到下顺序执行
- /# 表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交
dockerfile 是面向开发的,我们以后要发布项目,做镜像,就需要编写Dockerfile文件,这个文件十分简单!
Docker镜像 逐渐成为了一个企业交付的标准,必须掌握!
步骤:
- dockerfile:构建文件定义了一切步骤,源代码。
- dockerimages:通过DockerDlie构建生成的镜像,最终发布和运行的产品。
- docker容器:容器就是镜像运行起来提供服务的。
Dockerfile
以前就是使用别人的,现在我们知道了这些指令后,我们自己来写一个镜像!
FROM 基础镜像,一切从这里开始
MAINTAINER 镜像是谁写的(姓名+邮箱)
RUN 镜像构建的时候需要运行的命令
ADD 步骤:tomcat,这个tomcat压缩包!添加内容
WORKDIR 镜像的工作目录
VOLUME 挂载的目录
EXPOSE 暴露端口
CMD 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD 当构建一个被继承的DockerFile 这个时候就会运行ONBUILD 的指令,触发指令
COPY 类似ADD,将我们的文件拷贝到镜像中
ENV 构建的时候设置环境变量
实战测试
Docker Hub中 99% 的镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行的构建
创建一个自己的centos(官方的centos是一个压缩的,很多命令都是没有的)
1.编写dockerile文件
[[email protected] dockerfile]# vim mydockerfile-centos
[[email protected] dockerfile]# cat mydockerfile-centos
FROM centos
MAINTAINER tom<[email protected]>ENV MYPATH /usr/local
WORKDIR $MYPATHRUN yum -y install vim
RUN yum -y install net-toolsEXPOSE 80
CMD echo $MYPATH
CMD echo “----end----”
CMD /bin/bash2.通过这个文件构建镜像
docker build -f mydockerfile-centos -t mycentos:0.1 .== docker build -f mydockerfile-centos -t mycentos:0.1 .==
docker build -f dockerfile文件路径 -t 镜像名:[tag] .
[[email protected] dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 0.1 48bf34b6820b 3 minutes ago 295MB3.测试运
[[email protected] dockerfile==]# docker run -it mycentos:0.1==
[[email protected] local]# pwd
/usr/local
[[email protected] local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.5 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:05 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0[[email protected] local]# vim test
官方centos默认许多不存在,我们在增加之后的镜像添加了需要的命令!
我们可以列出本地镜像的历史,查看当前镜像是怎么一步步做出来的
[[email protected] dockerfile]# docker history 48bf34b6820b
IMAGE CREATED CREATED BY SIZE COMMENT
48bf34b6820b 11 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" “-c” “/bin… 0B
e564191cc8b7 11 minutes ago /bin/sh -c #(nop) CMD [”/bin/sh" “-c” “echo… 0B
646734676ece 11 minutes ago /bin/sh -c #(nop) CMD [”/bin/sh" “-c” “echo… 0B
21462f7c0342 11 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
42526c928e15 11 minutes ago /bin/sh -c yum -y install net-tools 22.8MB
ceb7f0232882 11 minutes ago /bin/sh -c yum -y install vim 57.2MB
87c2173cb669 13 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
9de565aa8d75 13 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
3b85942cb71b 13 minutes ago /bin/sh -c #(nop) MAINTAINER tom<[email protected]… 0B
0d120b6ccaa8 3 months ago /bin/sh -c #(nop) CMD [”/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB
CMD 和 ENTRYPOINT 区别
CMD 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命令
测试CMD命令
1.编写dockerfile
[[email protected] dockerfile]# cat dockerdile-cmd-test
FROM centos
CMD [“ls”,"-a"]2.构建镜像
[[email protected] dockerfile]# docker build -f dockerdile-cmd-test -t cmdtest .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos
—> 0d120b6ccaa8
Step 2/2 : CMD [“ls”,"-a"]
—> Running in a5818c9d411f
Removing intermediate container a5818c9d411f
—> b79ecb540643
Successfully built b79ecb540643
Successfully tagged cmdtest:latest
- run 执行,发现我们的ls -a 名称
[[email protected] dockerfile]# docker run b79ecb540643
.
…
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[[email protected] dockerfile]#4.想追加一个 -l
[[email protected] dockerfile]# docker run b79ecb540643 -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.cmd的情况下 -l 替换了CMD [“ls”,"-a"]命令,-l 不是命令所以会报错!
[[email protected] dockerfile]# docker run b79ecb540643 ls -la
total 56
drwxr-xr-x 1 root root 4096 Nov 10 07:37 .
…
测试 ENTRYPOINT
[[email protected] dockerfile]# cat dockerfile-cmd-entrypoint
FROM centos
ENTRYPOINT [“ls”,"-a"][[email protected] dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entoryponit-test .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos
—> 0d120b6ccaa8
Step 2/2 : ENTRYPOINT [“ls”,"-a"]
—> Running in 083d23db6000
Removing intermediate container 083d23db6000
—> fc9240298417
Successfully built fc9240298417
Successfully tagged entoryponit-test:latest[[email protected] dockerfile]# docker run fc9240298417
.
…
…
[r[email protected] dockerfile]# docker run fc9240298417 -l
total 56
drwxr-xr-x 1 root root 4096 Nov 10 07:45 .
drwxr-xr-x 1 root root 4096 Nov 10 07:45 …
…不会去替换原来的命令!
DockerFile 中很多的命令都是十分相似的,我们需要了解它们的区别,我们最好的学习就是对比他们然后测试效果!
实战:tomcat镜像
- 准备镜像文件 tomcat压缩包,jbk压缩包!
- 编写dockerfiel文件,官方命名 Dockerfile ,build 会自动寻找这个文件,就不需要 - f 指定了
- 构建镜像
- 启动镜像
- 访问测试
…
- 发布项目(由于做了挂载卷,我们直接在本地编写项目可以发布了)
- 项目部署成功,直接访问就OK!
发布自己的镜像
Dockerhub 阿里云
Dockerhub
1、注册账号 madmin123
2、确定这个账号可以登录
3、在服务器上提交自己的镜像[[email protected] ~]# 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 Username4、登录完成就可以提交镜像了,就是一步,docker push
[[email protected] ~]# docker login -u madmin123
Password:
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-storeLogin Succeeded
[[email protected] home]# docker push mycentos:0.1
The push refers to repository [docker.io/library/mycentos]
a3fbda71a653: Preparing
1f143e2d18fc: Preparing
291f6e44771a: Preparing
denied: requested access to the resource is denied 被拒绝[[email protected] ~]# docker push tom/node1/centos
The push refers to repository [docker.io/tom/node1/centos]
An image does not exist locally with the tag: tom/node1/centos 报错解决:增加一个tag
[[email protected] ~]# docker tag mycentos:0.1 madmin123/mycentos[[email protected] ~]# sudo docker push madmin123/mycentos:latest
The push refers to repository [docker.io/madmin123/mycentos]
a3fbda71a653: Pushing [/=/=/=/=/=/=/=/=/=/=/=/=/=/=> ] 6.713MB/22.77MB
1f143e2d18fc: Pushing [=/=/=> ] 18.94MB/57.23MB
291f6e44771a: Pushing [===> ] 16.89MB/215.1MB注意:上面的信息显示是拒接访问,因为tag的名字斜线前面部分allen-tomcat-app不是本人的用户名,下面把它修改为madmin123/xxxxx就push成功。需要注意的是madmin123是本人的docker用户名。进入docker hub网站查看,发现多了一个公共的repository。
阿里云镜像服务上
1、登录到阿里云
2、找到容器镜像
3、创建一个命名空间4、浏览阿里云
操作指南