Dockerfile构建镜像

Posted 徐中祥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dockerfile构建镜像相关的知识,希望对你有一定的参考价值。

Dockerfile构建镜像

一.Dockerfile介绍

  • 构建过程

1.编写一个dockerfile文件

2.docker build 构建一个镜像

3.docker run 运行镜像

4.docker push 发布镜像(dockerhub,阿里云镜像仓库)

  • 查看官方如何构建

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

在这里插入图片描述
https://github.com/CentOS/sig-cloud-instance-images/blob/b2d195220e1c5b181427c3172829c23ab9cd27eb/docker/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="20201113" \\
    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-11-13 00:00:00+00:00"

CMD ["/bin/bash"]

二.Dockerfile的构建过程

  • 基础知识

1.每个保留关键子(指令)都必须是大写字母

2.执行从上到下顺序执行

3.# 表示注释

4.每一个指令都会创建提交一个新的镜像层并提交。

在这里插入图片描述

Dockerfile是由一行行指令语句构成的一个创建docker镜像的配置文件。Dockerfile是由三个部分组成:基础镜像(必须的)、运行指令、容器默认执行命令。

Dockerfile是面向开发的.以后要发布项目做镜像就需要编写dockerfile文件。

Docker镜像逐渐成为企业交付的标准必须要掌握。

步骤:

​ Dockerfile构建文件定义了一切的步骤源代码。

​ DockerImages通过Dockerfile构建生成的镜像最终发布和运行的产品。

​ Docker容器.容器就是镜像运行起来提供服务。

三.Dockerfile构建镜像

1.Dockerfile的指令

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。
Dockerfile主题内容分为四个部分:基础镜像信息-维护者信息-镜像操作指令和容器启动时执行指令
Docker以从上到下的顺序运行Dockerfile的指令 为了指定基本映像 第一条指令必须是 FROM 一个声明。可以在Docker文件中使用 RUN ,CMD ,FROM , EXPOSE ,ENV 等指令。
在这里插入图片描述

FROM				# 指定基础镜像目的是为了给构建镜像提供一个基础环境
MAINTAINER			# 指定镜像是谁写的 姓名+邮箱。
RUN					# 镜像构建的时候需要运行的命令
ADD					# 将本地文件添加到镜像 
					  1,ADD支持自动解压,但是仅仅支持解压tar包
					  2,ADD支持远程下载,但是不会解压下载内容					  
COPY				# 将文件复制到镜像					  
WORKDIR				# 设置工作目录
                      1、程序运行的开始目录
                      2、进入容器的最初目录
VOLUME				# 设置需要挂载的目录
EXPOSE				# 容器需要向外界暴露的端口
CMD					# 容器启动的时候要运行的命令只有最后一个会生效可被代替nginx -g "daemon off;"
ENTRYPOINT			# 容器启动的时候要运行的命令,可以追加命令。
ONBUILD				# 构建触发器:当当前镜像用作基础镜像时触发 ONBUILD 后面跟的是Dockerfile指令
ENV					# 设置一个容器的环境变量
ARG					# 指定运行时参数,用于构建docker镜像时传入参数 --build-arg=USER=root
USER				# 用于指定执行后续命令的用户和用户组
HEALTHCHECK			# 用于指定某个程序或者指令来监控 docker 容器服务的运行状态
ONBUILD				# 用于延迟构建命令的执行
LABEL				# 用来给镜像添加一些元数据.以键值对的形式

2.Dockerfile实战测试

hub.docker中 99%的镜像都是从这个基础镜像过来的 FROM scratch . 然后配置需要的软件和配置来进行的构建
在这里插入图片描述

  • 使用Dockerfile创建一个自己的centos
编写dockerfile文件
[root@docker dockerfile]# vim mydockerfile-centos 
FROM centos

MAINTAINER xuzhongxiang<1977940379@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

通过这个文件构建镜像
# 格式
	 docker build -f [dockerfile文件路径] -t 镜像名:[tag]
	 
# 案例
	 docker build -f mydockerfile-centos -t mycentos:0.1 .

运行镜像
docker run -d -it mycentos:0.1

进入容器验证
[root@docker dockerfile]# docker exec -it 6e9ed443dcfb /bin/bash
 
[root@6e9ed443dcfb local]# ifconfig

[root@6e9ed443dcfb local]# vim a.txt
xuzhongxiang

查看镜像构建过程
[root@docker dockerfile]# docker history e79a6d186a1e
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
e79a6d186a1e   15 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
4650294188a4   15 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
  • CMD 和 ENTRYPOINT 的区别
CMD					# 容器启动的时候要运行的命令只有最后一个会生效可被代替 nginx -g "daemon off;"
ENTRYPOINT			# 容器启动的时候要运行的命令,可以追加命令。

1.测试cmd命令

# vim dockerfile-cmd-test 
    FROM centos
    CMD ["ls","-a"]


# docker build -f dockerfile-cmd-test -t cmdtest .


# docker run cf187a4526c9

  想追加命令报错
# docker run cf187a4526c9 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

# 因为用CMD的情况下 -l 替换了 CMD ["ls","-a"] 这个命令 -l 不是命令所有报错

  在次run运行成功
# docker run cf187a4526c9 ls -l

2.测试ENTRYPOINT命令

# vim dockerfile-entrypoint-test
    FROM centos
    ENTRYPOINT ["ls","-a"]

# docker build -f dockerfile-entrypoint-test -t entrypoint-test .

# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
entrypoint-test       latest    0b18a5bfa8b5   2 hours ago     209MB

# docker run 0b18a5bfa8b5
sys
tmp

# docker run 0b18a5bfa8b5 -l
drwxr-xr-x   1 root root   6 Mar 31 19:05 .
drwxr-xr-x   1 root root   6 Mar 31 19:05 ..

3.Dockerfile搭建lnmp

[root@Centos7 nginx]# docker network create lnmp
c7ad0d637a1455ebd5ea9d08e23f5d13971a0172a910ddc8bd4649a68ee27fc4

# 创建nginx
[root@Centos7 nginx]# vim Dockerfile 
FROM nginx
RUN useradd www
ADD default.conf  /etc/nginx/conf.d/
ADD nginx.conf  /etc/nginx
EXPOSE 80
WORKDIR /root
CMD nginx -g "daemon off;"

## 修改nginx.conf
user  www;

## 修改default.conf
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;
    }
    location ~ \\.php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
        include        fastcgi_params;
    }
}


# 创建PHP
[root@Centos7 php]# vim Dockerfile 
FROM centos:7
RUN yum install php php-devel php-fpm -y
RUN useradd www
ADD www.conf /etc/php-fpm.d/
EXPOSE 9000
CMD ["php-fpm"]

## 修改www.conf
listen = 9000
;listen.allowed_clients = 127.0.0.1
user = www 
group = www
request_terminate_timeout = 0

# 创建mysql
docker rm -f mysql && docker run -d --name mysql--network=lnmp -e MYSQL_ROOT_PASSWORD=123 mysql:5.7

四.发布镜像

1.发布到官方仓库

地址 https://hub.docker.com/注册自己的账号

  • 登录镜像仓库

注: 默认情况下,docker login登录的是官方仓库,如果登录其他镜像仓库则需要指定镜像仓库的URL连接

# 命令
	 docker login 
	 
# 参数
    --username|-u : 指定用户名
    --password|-p : 指定密码

# 登录阿里云docker registry
	docker login --username=xu中祥 registry.cn-hangzhou.aliyuncs.com

# 登录dockerhub官方仓库
    docker login -u xuzhongxiang
  • 发布镜像

注:要想上传镜像,首先得登录镜像仓库,其次设置对应镜像仓库的tag

# 格式:
	  docker tag [镜像ID]  镜像标签

    # docker images
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    mytomcat     latest    9b256e80cf11   12 hours ago   697MB
 
# 给镜像打标签
docker tag 9b256e80cf11 mytomcat:1.0
	
	# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    mytomcat     1.0       9b256e80cf11   12 hours ago   697MB

# 上传镜像
docker push mytomcat:1.0

2.发布到阿里云镜像仓库

参考官方文档
https://cr.console.aliyun.com/repository/cn-hangzhou/xuzhongxiang/steven/details

以上是关于Dockerfile构建镜像的主要内容,如果未能解决你的问题,请参考以下文章

使用dockerfile构建nginx镜像 转

构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

无需 Dockerfile 的镜像构建:BuildPack vs Dockerfile

Dockerfile构建镜像

使用Dockerfile构建镜像

Dockerfile构建Springboot工程镜像并运行(命令详解)