容器 DockerFile


dockerfile 介绍

DockerFlie 是用来构建Docker镜像的文件!牧民了参考脚本!

构建步骤:

  1. 编写一个dockerfile 文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像 (DockerHub、阿里云镜像仓库)仓库也分为私有和公有!

比如去https://github.com/…
容器 DockerFile

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构建过程

基础知识

  1. 每个保留关键字(指令)都是必须是大写字母
  2. 执行从上到下顺序执行
  3. /# 表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交

容器 DockerFile

dockerfile 是面向开发的,我们以后要发布项目,做镜像,就需要编写Dockerfile文件,这个文件十分简单!

Docker镜像 逐渐成为了一个企业交付的标准,必须掌握!

步骤:

  1. dockerfile:构建文件定义了一切步骤,源代码。
  2. dockerimages:通过DockerDlie构建生成的镜像,最终发布和运行的产品。
  3. docker容器:容器就是镜像运行起来提供服务的。

Dockerfile

以前就是使用别人的,现在我们知道了这些指令后,我们自己来写一个镜像!

FROM 基础镜像,一切从这里开始

MAINTAINER 镜像是谁写的(姓名+邮箱)

RUN 镜像构建的时候需要运行的命令

ADD 步骤:tomcat,这个tomcat压缩包!添加内容

WORKDIR 镜像的工作目录

VOLUME 挂载的目录

EXPOSE 暴露端口

CMD 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代

ENTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命令

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

COPY 类似ADD,将我们的文件拷贝到镜像中

ENV 构建的时候设置环境变量

实战测试

Docker Hub中 99% 的镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行的构建

容器 DockerFile

创建一个自己的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 $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo “----end----”
CMD /bin/bash

2.通过这个文件构建镜像
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 295MB

3.测试运

[[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 0

lo: 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

  1. 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镜像
  1. 准备镜像文件 tomcat压缩包,jbk压缩包!
  2. 编写dockerfiel文件,官方命名 Dockerfile ,build 会自动寻找这个文件,就不需要 - f 指定了
  3. 构建镜像
  4. 启动镜像
  5. 访问测试

  1. 发布项目(由于做了挂载卷,我们直接在本地编写项目可以发布了)
  2. 项目部署成功,直接访问就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 Username

4、登录完成就可以提交镜像了,就是一步,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-store

Login 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、创建一个命名空间

容器 DockerFile

4、浏览阿里云

操作指南
容器 DockerFile

Doxker 小结

容器 DockerFile