Docker系列(3)--容器连接和Dockerfile

shell 格式:

RUN <命令行命令>

#<命令行命令> 等同于,在终端操作的 shell 命令。

exec 格式:

RUN [“可执行文件”, “参数1”, “参数2”]

#例如:

#RUN [“./test.php”, “dev”, “offline”] 等价于 RUN ./test.php dev offline

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM centos

RUN yum install wget

RUN wget -O redis.tar.gz “http://download.redis.io/releases/redis-5.0.3.tar.gz”

RUN tar -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

FROM centos

RUN yum install wget \

&& wget -O redis.tar.gz “http://download.redis.io/releases/redis-5.0.3.tar.gz” \

&& tar -xvf redis.tar.gz

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

开始构建镜像

在 Dockerfile 文件的存放目录下,执行构建动作。

以下示例,通过目录下的 Dockerfile 构建一个 nginx:test(镜像名称:镜像标签)。

注:最后的 . 代表本次执行的上下文路径

[root@a Dockerfile]# docker build -t nginx:v1 .

上下文路径

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢

保留关键字


FROM

基础镜像,当前镜像是基于那个镜像的

MAINTAINER

镜像维护者的姓名和邮件地址

RUN

容器构建时需要运行的命令

EXPOSE

当前容器对外暴露的端口

WORKDIR

工作目录,一个落脚点

ENY

用来构建镜像过程中设置环境变量

ADD

复制解压指令,从上下文目录中复制文件或者目录到容器里指定路径并解压。

COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。


CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

CMD 在docker run 时运行。

RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

格式:

CMD <shell 命令>

CMD [“<可执行文件或命令>”,“”,“”,…]

CMD [“”,“”,…] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

格式:

ENTRYPOINT [“”,“”,“”,…]

可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。


ONBUILD

当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发

三、实例

===================================================================

实例1


更改进入容器后的根目录

启动容器时自动安装vim工具和net-tools

开放80端口

启动新的的shell进程

输出环境变量

输出successful

流程:

1、从docker hub上拉取centos镜像(我是在阿里云拉的)

[root@docker1 dockerfile]# docker pull centos

2、编写dockerfile

[root@docker1 dockerfile]# vim Dockerfile

FROM centos

ENV MYPATH /usr/local

WORKDIR $MYPATH

RUN yum install -y vim

RUN yum install -y net-tools

EXPOSE 80

CMD echo $MYPATH

CMD echo sucess----------------------------ok

CMD /bin/bash

3、建立容器

[root@docker1 dockerfile]# docker build -f /dockerfile/Dockerfile -t mycentos:1.3 .

4、启动容器

[root@docker1 dockerfile]# docker run -it mycentos:1.3

[root@ec8778c010e4 local]# pwd

/usr/local

[root@ec8778c010e4 local]# vim test.txt

[root@ec8778c010e4 local]# ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255

ether 02:42:ac:11:00:02 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

可以看到容器能运行vim命令和ifconfig命令了

5、查看容器历史

[root@docker1 dockerfile]# docker history mycentos:1.3

IMAGE CREATED CREATED BY SIZE COMMENT

288eb5f68eab 3 minutes ago /bin/sh -c #(nop) CMD [“/bin/sh” "-c " "/bin… 0B

add473bae6fa 3 minutes ago /bin/sh -c #(nop) CMD [“/bin/sh” "-c " "echo… 0B

c218e96faf77 3 minutes ago /bin/sh -c #(nop) CMD [“/bin/sh” "-c " "echo… 0B

3431b7fd8281 3 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B

399f38e480aa 3 minutes ago /bin/sh -c yum install -y net-tools 24MB

fa72d883c903 3 minutes ago /bin/sh -c yum install -y vim 59.8MB

7e050cc9059e 4 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B

2246df8e7559 4 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/lo cal 0B

470671670cac 4 months ago /bin/sh -c #(nop) CMD [“/bin/bash”] 0B

4 months ago /bin/sh -c #(nop) LABEL org.label-sc hema.sc… 0B

4 months ago /bin/sh -c #(nop) ADD file:aa54047c80 ba30064… 237MB

实例2


区别CMD和ENTRYPOINT

CMD

1、编写dockerfile

[root@docker1 dockerfile]# vim Dockerfile3

FROM centos

RUN yum install -y curl

CMD [“curl”,“-s”,“http://www.baidu.com”]

2、建立容器

[root@docker1 dockerfile]# docker build -f /dockerfile/Dockerfile3 -t test1 .

Sending build context to Docker daemon 4.096kB

Step 1/3 : FROM centos

—> 470671670cac

Step 2/3 : RUN yum install -y curl

—> Using cache

—> 121fba3c88d0

Step 3/3 : CMD [“curl”,“-s”,“http://www.baidu.com”]

—> Running in 9d3c8e940c70

Removing intermediate container 9d3c8e940c70

—> 370030919dc4

Successfully built 370030919dc4

Successfully tagged test1:latest

3、启动容器

[root@docker1 dockerfile]# docker run test1

百度一下,你就知道

可以看出不但运行了容器还运行了curl命令

那我在原来的基础上加上-i参数想查询网页报头,发现报错

这就是CMD参数,最后的命令会覆盖前面所有命令!

[root@docker1 dockerfile]# docker run test1 -i

docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused “exec: “-i”: executable file not found in $PATH”: unknown.

ENTRYPOINT

1、编写dockerfile

[root@docker1 dockerfile]# vim Dockerfile4

FROM centos

RUN yum install -y curl

ENTRYPOINT [“curl”,“-s”,“http://www.baidu.com”]

2、建立容器

[root@docker1 dockerfile]# docker build -f /dockerfile/Dockerfile4 -t test2 .

Sending build context to Docker daemon 5.12kB

Step 1/3 : FROM centos

—> 470671670cac

Step 2/3 : RUN yum install -y curl

—> Using cache

—> 121fba3c88d0

Step 3/3 : ENTRYPOINT [“curl”,“-s”,“http://www.baidu.com”]

—> Running in b0830b190ecb

Removing intermediate container b0830b190ecb

—> 473899186632

Successfully built 473899186632

Successfully tagged test2:latest

3、启动容器

[root@docker1 dockerfile]# docker run test2

百度一下,你就知道

下面加上-i参数也可以实现

[root@docker1 dockerfile]# docker run test2 -i

HTTP/1.1 200 OK

Accept-Ranges: bytes

Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform

Connection: keep-alive

Content-Length: 2381

Content-Type: text/html

Date: Wed, 20 May 2020 14:54:22 GMT

Etag: “588604c8-94d”

Last-Modified: Mon, 23 Jan 2017 13:27:36 GMT

Pragma: no-cache

Server: bfe/1.0.8.18

Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/

百度一下,你就知道

实例3


1、编写父类dockerfile

[root@docker1 dockerfile]# vim Dockerfile4

FROM centos

RUN yum install -y curl

ENTRYPOINT [“curl”,“-s”,“http://www.baidu.com”]

ONBUILD RUN echo “father image onbuild---------------------886”

编写子类dockerfile

[root@docker1 dockerfile]# vim Dockerfile5

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

d---------------------886"

编写子类dockerfile

[root@docker1 dockerfile]# vim Dockerfile5

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-T325KT1f-1710783888676)]
[外链图片转存中…(img-n72tL1RG-1710783888677)]
[外链图片转存中…(img-oGVTrQlB-1710783888677)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-RG63F4KS-1710783888678)]

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值