《Docekr入门学习篇》——Docker镜像制作

时间:2024-10-31 22:36:32

Docker镜像制作

Docker镜像的构建分为两种,一种是手动构建,一种是dockerfile(自动构建)

手动构建

基于centos镜像进行构建制作Nginx镜像

[root@rbtnode1 ~]# docker run --name Edward -it centos

[root@429ae931a699 /]# yum install -y nginx

[root@429ae931a699 /]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

修改Nginx配置让它在前台运行

[root@429ae931a699 /]# vim /etc/nginx/nginx.conf

...

daemon off;

...

[root@rbtnode1 ~]# docker ps -a

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                      PORTS                  NAMES

429ae931a699        centos                   "/bin/bash"               minutes ago      Exited ()  seconds ago                          Edward

修改完之后commit

[root@rbtnode1 ~]# docker commit -m "My Nginx" 429ae931a699 edward/edward:v1

sha256:3240a62fc2e57466a7938af03fc21c84c24726fd200b5009530391ddb30abfb7

[root@rbtnode1 ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

edward/edward       v1                  3240a62fc2e5         seconds ago        MB

docker.io/nginx     latest              e445ab08b2be         days ago           MB

docker.io/centos    latest              9f38484d220f         months ago         MB

#注释

-m 描述

容器ID

第一个edward是仓库的名称

第二个edward是镜像的名称

v1 标签,如果是最后一个版本我们可以打latest

启动制作好的镜像
[root@rbtnode1 ~]# docker run --name nginxv1 -d -p : edward/edward:v1 nginx

0a38af6c6eddfc3a354760282f01ff6e16b93e4f903d7c154f038d68a10f581d

[root@rbtnode1 ~]# docker ps

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                  NAMES

0a38af6c6edd        edward/edward:v1         "nginx"                   seconds ago       Up  seconds        0.0.0.0:->/tcp     nginxv1

自动构建

Dockerfile是由一行命令和语句组成的

Dockerfile构建步骤:

[root@rbtnode1 ~]# mkdir /dockerfile

[root@rbtnode1 ~]# cd /dockerfile

[root@rbtnode1 dockerfile]# mkdir nginx

[root@rbtnode1 dockerfile]# cd nginx

[root@rbtnode1 nginx]#vim Dockerfile

# Dockerfile

FROM centos

#Maintainer

MAINTAINER sjny yunweizabbix@.com

#Commands

RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

RUN yum install -y nginx && yum clean all

RUN echo "daemon off;" >>/etc/nginx/nginx.conf

ADD index.html /usr/share/nginx/html/index.html

EXPOSE 

CMD ["nginx"]

[root@rbtnode1 nginx]# echo "hello world" >index.html

#井号代表注释

#Base image  除了注释的第一行,必须是FROM,意思就是我们需要告诉dockerfile基础镜像是什么

#Maintainer 维护信息

#Commands 命令

#ADD index.html 这个文件需要我们在当前目录下有才可以,我们配置我们可以准备好,然后使用ADD命令进行添加或修改

EXPOSE 对外端口号

CMD [“nginx”] 它要启动的命令是nginx (就算是nginx服务)

开始构建

docker build -t mynginx:v2 .

docker run --name mynginxtest -d -p : mynginx:v2

Dockerfile参数

FROM

格式:

FROM<image>或FROM<image>:<tag>

解释:FROM是dockerfile里的第一条指令,后面跟有效的镜像名(如果该镜像你的本地镜像没有则会从远程仓库pull取)。后面的其它指令在FROM的镜像中执行。

MAINTAINER

格式:

MAINTAINER <name>

解释:指定维护者信息。

RUN

格式:

RUN <command>或 RUN[“executable”,“param1”,“param2”]

解释:运行,命令,命令较长时可以使用\来换行。推荐使用以上数组格式

CMD

格式:

CMD [“executable”,”param1”,”param2”]使用exec执行,推荐;

CMD command param1 param2 在/bin/sh 中执行,提供给需要交互的应用;

CMD [“param1”,”param2”] 提供给ENTRYPOINT的默认参数;

解释:CMD指定容器启动是执行的命令,每个dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。如果你在启动容器的时候也指定的命令,那么会覆盖dockerfile构建的镜像里面的CMD命令。

ENTRYPOINT

格式:

ENTRYPOINT [“executable”,”param1”,”par am2”]

ENTRYPOINT command param1 param2 (shell中执行)

解释:和CMD类似都是配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。

每个dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT没有CMD的可替换特性,所以生产中可以同时使用ENTRYPOINT和CMD。

USER

格式:USER daemon

解释:指定运行容器时的用户名和UID。

EXPOSE

格式:EXPOSE<port> [<port>…]

解释:设置docker容器内部暴露的端口号,如果需要外部访问。还需要启动容器时增加-p或者-P参数进行分配。

ENV

格式:ENV

ENV =<value>…

解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定。

ADD

格式:ADD <src>… <dest>

ADD [“”,. . . “”]

解释:将指定的复制到容器文件系统中

所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0

如果文件是可识别的压缩格式,则docker会帮忙解压缩

VOLUME

格式:VOLUME [“/data”]

解释:可以将本地文件夹或者其他container的文件挂载到container中

WORKDIR

格式:WORKDIR/path/to/workdir

解释:切换目录,为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。

可以多次切换(相当于cd命令)

也可以使用多个WORKDIR指令,后续命令如果参数是相对路劲,则会基于之前命令指定的路径。例如:

WORKDIR /a

WORKDIR b

WORKDIR c

RUN pwd

则最终路劲为 /a/b/c

ONBUILD

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

ARG

格式:ARG<name> [=<default value>]

解释:ARG指定了一个变量在docker build的时候使用,可以使用—build-arg =来指定参数的值,不过如果构建的时候不指定就会报错。