当前位置:   article > 正文

Docker入门6——初识DockerFile_dockerfile面向开发,docker镜像成为交付标准,docker容器则涉及部署与运维,三者缺

dockerfile面向开发,docker镜像成为交付标准,docker容器则涉及部署与运维,三者缺

Docker入门6——初识DockerFile

dockerfile是一个用来构建docker镜像文件的脚本命令文件,今天来初步学习dockerfile

官方很多镜像比如nginx,tomcat,mysql其实也是自己写的,我们也可以写一个这样的镜像,

image-20201026125407287

从图中可以发现我们的主要流程是

开发一个应用---->DockerFIle---->打包为镜像---->上传到仓库---->下载镜像---->启动运行

DockerFile概念

dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

构建步骤:

1、编写DockerFile文件

2、docker build 构建镜像

3、docker run

我们可以先参考一下官方的dockerfile长什么样

https://hub.docker.com/_/centos

image-20201026125823444

dockerfile具体内容

image-20201026125946987

构建DockerFile

基础知识:

1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数

2、指令按照从上到下,顺序执行

3、# 表示注释

4、每条指令都会创建一个新的镜像层,并对镜像进行提交

image-20201026130131233

流程:

1、docker从基础镜像运行一个容器

2、执行一条指令并对容器做出修改

3、执行类似 docker commit 的操作提交一个新的镜像层

4、Docker再基于刚提交的镜像运行一个新容器

5、执行dockerfile中的下一条指令直到所有指令都执行完成!

说明:

从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。

  • DockerFile 是软件的原材料 (代码)
  • Docker 镜像则是软件的交付品 (.apk)
  • Docker 容器则是软件的运行状态 (客户下载安装执行)

DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可!

DockerFile:需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的内容 包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进 程和内核进程(当引用进行需要和系统服务和内核进程打交道,这时需要考虑如何设计 namespace的权 限控制)等等。

Docker镜像:在DockerFile 定义了一个文件之后,Docker build 时会产生一个Docker镜像,当运行 Docker 镜像时,会真正开始提供服务;

Docker容器:容器是直接提供服务的。

DockerFile基本指令

FROM 			# 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER 		# 镜像维护者的姓名混合邮箱地址
RUN 			# 容器构建时需要运行的命令
EXPOSE 			# 当前容器对外保留出的端口
WORKDIR 		# 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV 			# 用来在构建镜像过程中设置环境变量
ADD 			# 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY 			# 类似ADD,拷贝文件和目录到镜像中!
VOLUME 			# 容器数据卷,用于数据保存和持久化工作
CMD 			# 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
ENTRYPOINT 		# 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD 		# 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

加深印象的几个图

image-20201026130600611

image-20201026130619538

实战

看这么多,咱自己写个吧

一般镜像都是由基础镜像改动来的,就是我们上面说的 FROM scratch(base镜像),然后再配置其他信息

image-20201026130749514

咱有样学样,也写一个centos的DockerFile

编写DockerFile

我们先运行一个官方的centos,发现很多命令都没有

image-20201026131120300

[root@feng /]# docker run -it centos
[root@fcf18fbe30b6 /]# vim    
bash: vim: command not found
[root@fcf18fbe30b6 /]# ifconfig
bash: ifconfig: command not found
[root@fcf18fbe30b6 /]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我们可以自己写一个有这些命令的镜像

DockerFile

FROM centos
MAINTAINER feng<feng9662@qq.com>

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

我们把该文件放在home下

[root@feng /]# cd home/
[root@feng home]# mkdir dockerfile-test
[root@feng home]# ls
ceshi  ceshi666  dockerfile-test  f1  idea  redis  test1.java  test.java  www
[root@feng home]# vim mydocker-centos
[root@feng home]# cat mydocker-centos 
M centos
MAINTAINER feng<feng9662@qq.com>

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

[root@feng home]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

构建DockerFile

docker build -f dockerfile地址 -t 新镜像名:tag .
  • 1

别忽略了后面那个点

跑起来

[root@feng home]# docker build -f mydocker-centos -t mycentos:0.1 .
Sending build context to Docker daemon  16.53MB
Error response from daemon: Dockerfile parse error line 1: unknown instruction: M
[root@feng home]# docker build -f mydocker-centos -t mycentos:0.1 .
Sending build context to Docker daemon  16.53MB
Step 1/10 : FROM centos
.........
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

GIF 2020-10-26 13-20-33

测试运行

[root@feng home]# docker run -it mycentos:0.1
[root@e7c0576aa706 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.3  netmask 255.255.0.0  broadcast 172.18.255.255
        ether 02:42:ac:12:00:03  txqueuelen 0  (Ethernet)
        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

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (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

[root@e7c0576aa706 local]# vim
[root@e7c0576aa706 local]# 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

可以看到刚才不支持的命令现在都支持了

image-20201026132214219

发布镜像

写了dockerfile给大家一起用~

注册账号

这里我们需要先注册一个DockerHub的账号

https://hub.docker.com/signup

注册完成后

测试登录

[root@feng home]# 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@feng home]# docker login -u nicerfeng
Password: 
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout
[root@feng home]# cd ..
[root@feng /]# cd etc/
[root@feng etc]# cd docker
[root@feng docker]# ls
daemon.json  key.json
[root@feng docker]# vi daemon.json 

#如果登陆失败,吧daemon.json中的mirror加入国内镜像
##
##{
##  "registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"]
##}
##修改后重启docker服务
[root@feng docker]# service docker restart
Redirecting to /bin/systemctl restart  docker.service
[root@feng docker]# docker login -u nicerfeng
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
#登陆成功
[root@feng docker]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

准备发布镜像

[root@feng docker]# docker push mycentos:0.1
The push refers to repository [docker.io/library/mycentos]
ea5891ca9288: Preparing 
512dd52bc170: Preparing 
eb29745b8228: Preparing 
denied: requested access to the resource is denied
[root@feng docker]# 
#可以看到这里把咱拒绝了,因为我们的镜像没账号信息,要把tag加上即可
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

加上容器id的tag,即可上传

[root@feng docker]# docker tag d7c8a9d0f0b2 nicerfeng/mycentos:0.1
[root@feng docker]# docker push nicerfeng/mycentos:0.1
The push refers to repository [docker.io/nicerfeng/mycentos]
ea5891ca9288: Pushing [===>                                               ]  930.3kB/14.27MB
512dd52bc170: Pushing [>                                                  ]  549.4kB/57.18MB
eb29745b8228: Pushing [>                                                  ]  3.838MB/215.3MB
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

阿里云容器镜像服务配置

首先进入阿里云控制台,搜索容器镜像服务

image-20201026134156186

点击左侧命名空间,创建一个命名空间

image-20201026134250756

创建镜像仓库

image-20201026134314439

进入该仓库,查看详情

image-20201026134355631

测试推送发布到阿里云

按照上面阿里云官网的说明登录即可

[root@feng ~]# docker login --username=冯半仙 registry.cn-beijing.aliyuncs.com
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
[root@feng ~]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这里的密码在刚才的页面设置

image-20201026134758718

[root@feng ~]# docker tag d7c8a9d0f0b2 registry.cn-beijing.aliyuncs.com/snicker_feng/feng-test:v1.1
[root@feng ~]# docker push registry.cn-beijing.aliyuncs.com/snicker_feng/feng-test:v1.1
The push refers to repository [registry.cn-beijing.aliyuncs.com/snicker_feng/feng-test]
ea5891ca9288: Pushing [=====>                                             ]  1.561MB/14.27MB
512dd52bc170: Pushing [=>                                                 ]  1.663MB/57.18MB
eb29745b8228: Pushing [>                                                  ]  544.8kB/215.3MB
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

成功上传~

image-20201026135758243

小结

image-20201026135553649

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/203071
推荐阅读
相关标签
  

闽ICP备14008679号