dockerfile制作

一、Dockerfile 简介及书写规则

Dockfile 是一种被Docker 程序解释的脚本,Dockerfile 由一条一条的指令组成,每条指令对应Linux 下面的一条命令。Docker 程序将这些Dockerfile 指令翻译真正的Linux 命令。Dockerfile 有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,Docker 程序将读取Dockerfile,根据指令生成定制的image。

Dockerfile 的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数。

Dockerfile 的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image 的容器上执行;设置指令用于设置image 的属性, 其指定的操作将在运行image 的容器中执行

1、FROM(指定基础image) 构建指令

必须指定且需要在Dockerfile 其他指令的前面。后续的指令都依赖于该指令指定的image。FROM 指令指定的基础image 可以是官方远程仓库中的,也可以位于本地仓库。

格式:FROM 镜像 | FROM 镜像:tag

2、MAINTAINER(用来指定镜像创建者信息) 构建指令

用于将image 的制作者相关的信息写入到image 中。当我们对该image 执行docker inspect 命令时,输出中有相应的字段记录该信息。

3、RUN(安装软件用) 构建指令

RUN 可以运行任何被基础image 支持的命令。如基础image 选择了ubuntu, 那么软件管理部分只能使用ubuntu 的命令

4、CMD(设置container 启动时执行的操作) 设置指令

用于container(容器)启动时指定的操作。该操作可以是执行自定义脚本, 也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条

5、ENTRYPOINT(设置container 启动时执行的操作) 设置指令

指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效

6、USER(设置container 容器的用户) 设置指令

设置启动容器的用户,默认是root 用户

7、EXPOSE(指定容器需要映射到宿主机器的端口)设置指令

该指令会将容器中的端口映射成宿主机器中的某个端口。

8、ENV(用于设置环境变量) 构建指令

在image 中设置一个环境变量

9、ADD(从src 复制文件到container 的dest 路径) 构建指令

所有拷贝到container 中的文件和文件夹权限为0755,uid 和gid 为0;如果是一个目录,那么会将该目录下的所有文件添加到container 中,不包括目录;如果文件是可识别的压缩格式,则docker 会帮忙解压缩(注意压缩格式);如果<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>;如果<src>是文件且<dest> 中使用斜杠结束,则会<src>文件拷贝到<dest>目录下。

10、VOLUME(指定挂载点)) 设置指令

使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用

11、WORKDIR(切换目录) 设置指令

可以多次切换(相当于cd 命令),对RUN,CMD,ENTRYPOINT 生效

12、ONBUILD(在子镜像中执行)

ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行

二、使用Dockerfile 创建sshd 镜像模板

导入镜像

[[email protected] ~]# cat centos-7-x86_64.tar.gz |docker import - centos:7

sha256:b19b83cf0649f2e4ed3819ba57c62745c53e537c498a117a3e5c6c033778e2da

[[email protected] ~]# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED              SIZE

centos                      7                   b19b83cf0649        About a minute ago   589.4 MB

[[email protected] ~]# mkdir sshd_dockerfile

[[email protected] ~]# cd sshd_dockerfile/

[[email protected] sshd_dockerfile]# vi run.sh

#!/bin/bash

/usr/sbin/sshd -D

[[email protected] sshd_dockerfile]# ssh-keygen -t rsa    //在宿主机上生成ssh 密钥对

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa): 回车

Created directory ‘/root/.ssh‘.

Enter passphrase (empty for no passphrase): 回车

Enter same passphrase again:  回车

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

ab:04:76:36:a0:76:6a:d5:ad:a8:6e:ed:07:ca:96:01 [email protected]

The key‘s randomart image is:

+--[ RSA 2048]----+

|                 |

|                 |

|    .            |

|E  . o .         |

| .o = = S        |

| ..=.= o .       |

| .o=..o .        |

| .*.....         |

| +o....          |

+-----------------+

[[email protected] sshd_dockerfile]# cat ~/.ssh/id_rsa.pub > ./authorized_keys

[[email protected] sshd_dockerfile]# pwd

/root/sshd_dockerfile

[[email protected] sshd_dockerfile]# vi Dockerfile

FROM centos:7

MAINTAINER from [email protected]      //设置基础镜像

#RUN yum -y instlal openssh-server    // 作者信息

RUN mkdir -p /var/run/sshd          // 安装ssh服务,此镜像已安装,可以注释掉

RUN mkdir -p /root/.ssh

RUN sed -ri ‘s/session required pan_loginuid.so/#session required pan_loginuid.so/g‘ /etc/pan.d/sshd

RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

RUN  ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

RUN  ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""

ADD authorized_keys /root/.ssh/authorized_keys    //复制配置文件到相应位置

ADD run.sh /run.sh

RUN chmod 755 /run.sh   //保证有执行权限

EXPOSE 22              // 开放端口

CMD ["/run.sh"]         // 运行容器时执行的脚本

[[email protected] ~]# grep pam_loginuid.so /etc/pam.d/sshd //可以再打开一个终端,找到文件进行复制

session    required     pam_loginuid.so

[[email protected] sshd_dockerfile]# ls

authorized_keys  Dockerfile  run.sh

[[email protected] sshd_dockerfile]# docker build -t sshd:1 ./   //创建镜像,取名为sshd,tag 为1,以当前目录下的Dockerfile 为准

Sending build context to Docker daemon 4.096 kB

Step 1 : FROM centos:7

---> b19b83cf0649

Step 2 : MAINTAINER from [email protected]

---> Using cache

---> d78926f7aa7a

Step 3 : RUN mkdir -p /var/run/sshd

---> Using cache

---> 57f134b7c800

Step 4 : RUN mkdir -p /root/.ssh

---> Using cache

---> 9c77b88dc36b

Step 5 : RUN sed -ri ‘s/session    required    pam_loginuid.so/#session    required    pam_loginuid.so/g‘ /etc/pam.d/sshd

---> Running in 537659b149a8

---> 07880e20fece

Removing intermediate container 537659b149a8

Step 6 : RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

---> Running in 87732838ce5a

Enter passphrase (empty for no passphrase): Enter same passphrase again: Generating public/private rsa key pair.

Your identification has been saved in /etc/ssh/ssh_host_rsa_key.

Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub.

The key fingerprint is:

0b:ef:a6:92:68:e2:3a:7a:fb:78:41:af:e3:c9:e0:6a [email protected]

The key‘s randomart image is:

+--[ RSA 2048]----+

|                 |

|                 |

|                 |

|    .            |

|   . .. S        |

|    . .o .       |

|  .. +  o        |

|oE++*. ..        |

|OB+==o.o.        |

+-----------------+

---> 3e538a147e31

Removing intermediate container 87732838ce5a

Step 7 : RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

---> Running in 5f19b0617a2f

Enter passphrase (empty for no passphrase): Enter same passphrase again: Generating public/private dsa key pair.

Your identification has been saved in /etc/ssh/ssh_host_dsa_key.

Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.

The key fingerprint is:

67:cb:e0:33:84:26:d0:9f:e3:0c:9d:7d:bf:43:d2:ac [email protected]

The key‘s randomart image is:

+--[ DSA 1024]----+

|                 |

|   .             |

|  . .            |

|   . o =         |

|    o O S +o     |

|     * + *.o+    |

|      o + o+.    |

|         oE ..   |

|            ..   |

+-----------------+

---> 400b4f436b11

Removing intermediate container 5f19b0617a2f

Step 8 : ADD authorized_keys /root/.ssh/authorized_keys

---> f5d422a10648

Removing intermediate container d5d65efba938

Step 9 : ADD run.sh /run.sh

---> 59ded99a900d

Removing intermediate container 252405d68ebd

Step 10 : RUN chmod 755 /run.sh

---> Running in 8ebbf6f4bff4

---> 9dbbaaee5a5b

Removing intermediate container 8ebbf6f4bff4

Step 11 : EXPOSE 22

---> Running in d813e1d3a730

---> e96b802d43e8

Removing intermediate container d813e1d3a730

Step 12 : CMD /run.sh

---> Running in 36b6bdb72dcc

---> b84b454d5977

Removing intermediate container 36b6bdb72dcc

Successfully built b84b454d5977

[[email protected] sshd_dockerfile]# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

sshd                        1                   b84b454d5977        35 seconds ago      589.4 MB

centos                      7                   b19b83cf0649        30 minutes ago      589.4 MB

[[email protected] sshd_dockerfile]# docker run -d -p 2222:22 sshd:1

824413feb77f3e7858525b86e0783e1b2d426ac0f854ef4bf27bdd8a70b66a13

[[email protected] sshd_dockerfile]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES

824413feb77f        sshd:1              "/run.sh"           11 seconds ago      Up 9 seconds        0.0.0.0:2222->22/tcp   evil_meninsky

[[email protected] ~]# ssh 192.168.20.2 -p 2222

The authenticity of host ‘[192.168.20.2]:2222 ([192.168.20.2]:2222)‘ can‘t be established.

RSA key fingerprint is 0b:ef:a6:92:68:e2:3a:7a:fb:78:41:af:e3:c9:e0:6a.

Are you sure you want to continue connecting (yes/no)? Yes   //首次需要确认连接

Warning: Permanently added ‘[192.168.20.2]:2222‘ (RSA) to the list of known hosts.

[[email protected] ~]# ss -anpt |grep 22   //ss 命令,类似于centos6 系的netstat 命令

LISTEN     0      128          *:22                       *:*                   users:(("sshd",pid=5,fd=3))

ESTAB      0      0      172.17.0.2:22                 192.168.20.2:39775               users:(("sshd",pid=6,fd=3))

LISTEN     0      128         :::22                      :::*                   users:(("sshd",pid=5,fd=4))

[[email protected] ~]# 登出   //按ctrl+d 退出

Connection to 192.168.20.2 closed.

使用Dockerfile 制作的sshd 镜像模板以完成,生成镜像,上传至仓库或保存下来,供日后使用,此处采用docker save 方法导出到本地

[[email protected] ~]# docker save -o centos7_sshd.tar sshd:1

[[email protected] ~]# ls

anaconda-ks.cfg  centos7_sshd.tar        centos-aaa.tar  mysql5.tar  sshd_dockerfile

backup.tar       centos-7-x86_64.tar.gz  centos.tar      nginx.tar   tomcat.tar

[[email protected] ~]# ls centos7_sshd.tar

centos7_sshd.tar

[[email protected] ~]#

其他的镜像模板与以上相同,不同的是Dockerfile 以及run.sh,根据镜像的系统与要做的服务镜像里的服务,编写不同的配置Dockerfile 和run.sh

时间: 2024-08-15 00:52:19

dockerfile制作的相关文章

DOCKER学习_011:使用Dockerfile制作docker镜像

前面使用commit的方式,制作一个docker镜像,本次介绍使用Dockerfile制作一个dockers镜像 [[email protected] ~]# mkdir /openssh [[email protected] ~]# cd /openssh [[email protected] openssh]# cp /etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_rsa_key . [[

Dockerfile制作镜像

Dockerfile制作镜像 目录: tomcat的Dockerfile脚本 nginx.1.12.0的Dockerfile脚本 mysql的Dockerfile脚本 删除错误镜像和容器脚本 tomcat的Dockerfile脚本 cd /opt mkdir tomcat cd tomcat vim Dockerfile FROM centos:7 MAINTAINER this is tomcat <lzp> ADD jdk-8u91-linux-x64.tar.gz /usr/local/

基于Dockerfile制作tomcat镜像

Docker 概述: ??在前面的例子中,我们从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低.所以就需要一种文件或脚本,我们把想执行的操作以命令的方式写入其中,然后让 docker 读取并分析.执行,那么重复构建.更新将变得很方便,所以Dockerfile 就此诞生了 常用参数: FROM 命令.用法, FROM <image>:<tag>. FROM 命令告诉 docker 我们构建的镜像是以哪个(发行版)镜像为基础

Dockerfile:制作可ssh登录的镜像

我们先手动制作一个可以ssh登录的容器,然后按照操作步骤编写Dockerfile,用docker build根据Dockerfile创建镜像,最后我们可以用这个镜像来生成可ssh登录的容器了.     一.首先创建一个容器并登入 [[email protected] ~]# docker images centos REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZ

dockerfile 制作镜像

以下制作nginx镜像过程,分三步1.制作dockerfile文件2.制作nginx.sh的nginx安装脚本3.制作ngx-depolyment.yaml文件 以下是具体内容 #mkdir /root/dockerfile #cd /root/dockerfile #touch Dockerfile #mkdir nginx 制作dockerfile文件 [email protected]<cc_172.16.0.2|~/dockerfile/nginx>:#cat Dockerfile #

Docker —— 使用 Dockerfile 制作 Jdk + Tomcat 镜像

一.准备好Jdk和Tomcat apache-tomcat-8.5.50.tar.gz jdk-8u212-linux-x64.tar.gz 注意: Jdk 和 Tomcat 记得从官网下载,否则制作出来的镜像容易出现不兼容问题. jdk1.8下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html tomcat8下载:https://tomcat.apache.org/downl

Dockerfile制作sshd镜像

For Centos Shell脚本: # vim Dockerfile # mkdir /data01/sshd # vi Dockerfile # sshd # # VERSION 0.0.2 FROM centos:centos7 MAINTAINER yezl RUN yum install -y openssh-server RUN yum install -y openssh-clients RUN yum install -y sed RUN yum install net-too

Dockerfile制作自定义镜像

本文介绍最精简的Dockerfile文件构建镜像,Docker启动的时候可以启动一个shell脚本 1.首先编写Dockerfile文件 说明 1.启动的这个shell脚本一定是不退出的,比如服务器的启动,tomcat或者自己开发的socket服务监听程序等 2.如果是启动的服务有监听IP功能,那么IP需要配置成0.0.0.0,不要配置成127.0.0.1 否则curl的时候会出现:curl: (7) Failed to connect to localhost port 6230: Conne

利用dockerfile制作基于centos7的lnmp镜像(亲测,详细版)

首先呢,这篇文章,也是小弟参考了许多文章,自己整理出来的,有很多不足之处还有待加强,期待各位评论. > LNMP 是代表 Linux 系统下的 Nginx.Mariadb.PHP 相结合而构建成的动态网站服务器架构.下面使用 Dockerfile 文件的方式来创建带有 LNMP 架构的 Docker 镜像. 1. 创建工作目录 [root@localhost ~]# mkdir lnmp [root@localhost ~]# cd lnmp/ 2. 创建 Dockerfile 文件 #基础镜像