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文件
[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 # 容器启动的时候要运行的命令只有最后一个会生效可被代替 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构建镜像的主要内容,如果未能解决你的问题,请参考以下文章
构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式