如何使用Dokerfile构建镜像及搭建服务

来源:互联网 发布:vb 字符串 校验码 编辑:程序博客网 时间:2024/06/05 16:54

一.Dokerfile基础知识

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

二.Dockerfile的书写规则及指令使用方法

Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数。
Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。构建指令用于构建image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。

三.Dockerfile中重要参数介绍

1.FROM(指定基础image)
在dockfile其他指令的前面指定基础image,后面的指令都依赖于该指令指定的image。
格式为:

FROM <image>:<tag>  ##tag不是必须指定,若不指定则默认为image的latest版本

2.MAINTAINER (指定镜像创建者的信息)

MAINTAINER <name>

3.RUN(安装软件用)
RUN可以运行任何被基础image支持的命令,如果基础image指定的是ubuntu,那么RUN中只能使用ubuntu的命令
格式为:
前者将在 shell 终端中运行命令,即 /bin/sh -c,后者则使用 exec 执行。

RUN <command> RUN [“executable”, “param1”, “param2”]      ##executable是一个可执行脚本

4.CMD(设置容器启动是执行的操作)
可以是自定义脚本,也可是系统命令,该指令只能出现一次,如果有多条,则只执行最后一条。
格式:

CMD [“executable”, “param1”, “param2”]      ##使用 exec 执行CMD command param1 param2                   ##在 /bin/sh 中执行,提供给需要交互的应用CMD [“param1”, “param2”]                    ##提供给 ENTRYPOINT 的默认参数

5.ENTRYPOINT(设置容器启动时执行的操作)
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个 ENTRYPOINT 时,只有最后一个生效
格式为:

ENTRYPOINT [“executable”, “param1”, “param2”]ENTRYPOINT command param1 param2 (shell 中执行)

6.USER(设置container容器的用户)
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

7.EXPOSE(指定容器需要影射到宿主机的端口)
该命令会将容器中的端口映射成宿主机的某个端口,当你需要访问容器的时候,可以直接访问宿主机的ip:映射过去的端口

EXPOSE <port> [<port>…]
    EXPOSE port1                                                 ## 映射一个端口     docker run -p port1 image                                    ## 相应的运行容器使用的命令     EXPOSE port1 port2 port3                                     ## 映射多个端口      docker run -p port1 -p port2 -p port3 image                  ## 相应的运行容器使用的命令     docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image                                                                                                                                   ## 还可以指定需要映射到宿主机器上的某个端口号  

端口映射是docker比较重要的一个功能,原因在于我们每次运行容器的时候容器的IP地址不能指定而是在桥接网卡的地址范围内随机生成的。宿主机器的IP地址是固定的,我们可以将容器的端口的映射到宿主机器上的一个端口,免去每次访问容器中的某个服务时都要查看容器的IP的地址。对于一个运行的容器,可以使用docker port加上容器中需要映射的端口和容器的ID来查看该端口号在宿主机器上的映射端口。

8.ENV(用于设置环境变量)
在image中设置一个环境变量
格式:

    ENV <key> <value> 

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

ADD <src> <dest> 

四.搭建服务
1.创建所需基础镜像

[root@foundation6 docker]# docker run -it --name vm1 rhel7 bash ##新建镜像bash-4.2# cd /etc/yum.repos.d/bash-4.2# vi dvd.repo [dvd]name=rhel7baseurl=http://192.168.10.1/rhel7.0             ##docker的ip,可以连接到宿主机gpgcheck=0bash-4.2# yum repolistSkipping unreadable repository '///etc/yum.repos.d/rhel7.repo'dvd                                                      | 4.1 kB     00:00     (1/2): dvd/group_gz                                        | 134 kB   00:00     (2/2): dvd/primary_db                                      | 3.4 MB   00:00     repo id                               repo name                           statusdvd                                   rhel7                               4305repolist: 4305bash-4.2# yum install -y vim iproute net-tools  ##安装所需用的命令bash-4.2# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever    inet6 ::1/128 scope host        valid_lft forever preferred_lft forever18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP     link/ether 02:42:c0:a8:0a:03 brd ff:ff:ff:ff:ff:ff    inet 192.168.10.3/24 scope global eth0       valid_lft forever preferred_lft forever    inet6 fe80::42:c0ff:fea8:a03/64 scope link        valid_lft forever preferred_lft foreverbash-4.2# [root@foundation6 docker]#                [root@foundation6 docker]# docker commit -m yum vm1  rhel7:v1##commit提交后才会被保存sha256:4c7697ef1ed9cf6b4bbb66efea9e364102b1e5cbb280c893a0b49f459469a243[root@foundation6 docker]# docker stop vm1vm1[root@foundation6 docker]# docker rm vm1        ##提交后容器已经保存,可以将容器删除vm1[root@foundation6 docker]# docker images rhel7  ##新的镜像创建成功REPOSITORY          TAG                 IMAGE ID            CREATED              SIZErhel7               v1                  4c7697ef1ed9        About a minute ago   229.4 MBrhel7               latest              0a3eb3fde7fd        3 years ago          140.2 MB

2.编写Dokerfile部署apache服务

[root@foundation6 ~]# mkdir /tmp/docker             ##创建docker目录[root@foundation6 ~]# cd /tmp/docker/[root@foundation6 docker]# vim Dockerfile           ##Dockerfile 编写FROM rhel7:v1                                       ##指定基础镜像MAINTAINER yakexi@westos.org                        ##作者信息ENV HOSTNAME server1                                ##设置容器主机名EXPOSE 80   ##由于内部服务会启动 Web 服务,我们需要把对应的 80 端口暴露出来,可以提供给容器间互联使用RUN yum install -y httpd && yum clean  all           ##镜像操作命令CMD ["/usr/sbin/httpd","-D","FOREGROUND"]            ##镜像启动命令,默认只能启动一条[root@foundation6 docker]# docker build -t rhel7:v2 .##利用上面的dockerfile文件构建镜像 rhel7:v2Sending build context to Docker daemon 2.048 kBStep 1 : FROM rhel7:v1 ---> 4c7697ef1ed9Step 2 : MAINTAINER yakexi@westos.org            ---> Running in be2eaf2ce0dd ---> 42f6dbffb0c1Removing intermediate container be2eaf2ce0ddStep 3 : ENV HOSTNAME server1 ---> Running in 34e2cae2957e ---> f3c161b304caRemoving intermediate container 34e2cae2957eStep 4 : EXPOSE 80 ---> Running in 90aa195a793b ---> 8ef480ffd06eRemoving intermediate container 90aa195a793bStep 5 : RUN yum install -y httpd && yum clean  all      ---> Running in ef27bde81963Skipping unreadable repository '///etc/yum.repos.d/rhel7.repo'Resolving Dependencies--> Running transaction check---> Package httpd.x86_64 0:2.4.6-17.el7 will be installed.......Complete!Skipping unreadable repository '///etc/yum.repos.d/rhel7.repo'Cleaning repos: dvdCleaning up everything ---> 25393318ec77Removing intermediate container ef27bde81963Step 6 : CMD /usr/sbin/httpd -D FOREGROUND ---> Running in 87742c5bccba ---> c90716634969Removing intermediate container 87742c5bccbaSuccessfully built c90716634969

查看镜像:

[root@foundation6 docker]# docker images rhel7 REPOSITORY          TAG                 IMAGE ID            CREATED              SIZErhel7               v2                  c90716634969        About a minute ago   258.7 MBrhel7               v1                  4c7697ef1ed9        9 minutes ago        229.4 MBrhel7               latest              0a3eb3fde7fd        3 years ago          140.2 MB

查看镜像历史修改:

[root@foundation6 docker]# docker history rhel7:v2IMAGE               CREATED              CREATED BY                                      SIZE                COMMENTc90716634969        About a minute ago   /bin/sh -c #(nop) CMD ["/usr/sbin/httpd" "-D"   0 B                 25393318ec77        About a minute ago   /bin/sh -c yum install -y httpd && yum clean    29.29 MB            8ef480ffd06e        2 minutes ago        /bin/sh -c #(nop) EXPOSE 80/tcp                 0 B                 f3c161b304ca        2 minutes ago        /bin/sh -c #(nop) ENV HOSTNAME=server1          0 B                 42f6dbffb0c1        2 minutes ago        /bin/sh -c #(nop) MAINTAINER yakexi@westos.or   0 B                 4c7697ef1ed9        9 minutes ago        bash                                            89.17 MB            yum0a3eb3fde7fd        3 years ago                                                          140.2 MB            Imported from -
[root@foundation6 docker]# docker run -d --name apache -p 8080:80 rhel7:v29393dbf69901b7428c315a2e8793f74c5501be478ba2f04649b971ecf2548014[root@foundation6 docker]# docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES9393dbf69901        rhel7:v2            "/usr/sbin/httpd -D F"   42 seconds ago      Up 39 seconds       0.0.0.0:8080->80/tcp   apache

访问http://172.25.254.66:8080
apache的默认页面:
这里写图片描述

[root@foundation6 docker]# vim index.html
[root@foundation6 docker]# cat index.html

www.westos.org

[root@foundation6 docker]# docker cp index.html apache:/var/www/html/ ##编写容器的apache页面,为了确定我们访问的容器的apache服务,设置显示页面以示区别
这里写图片描述

[root@foundation6 docker]# docker stop apache apache[root@foundation6 docker]# docker rm apache apache

3.Dockerfile 自启动 SSH 服务

[root@foundation6 docker]# vim Dockerfile       ##编辑dockerfile文件FROM rhel7:v1                                   ##指定基础镜像MAINTAINER yakexi@westos.org                    ##作者ENV HOSTNAME server2EXPOSE 22                                       ##暴露端口RUN yum install -y openssh-server openssh-clients initscripts && yum clean  all##安装服务RUN /usr/sbin/sshd-keygen && echo root:westos | chpasswdCMD ["/usr/sbin/sshd","-D"][root@foundation6 docker]# docker build -t rhel7:v3 .  ##创建镜像Sending build context to Docker daemon 3.072 kBStep 1 : FROM rhel7:v1 ---> 4c7697ef1ed9Step 2 : MAINTAINER yakexi@westos.org ---> Using cache ---> 42f6dbffb0c1Step 3 : ENV HOSTNAME server2 ---> Running in cca251360a37 ---> f2cdbd565cf7Removing intermediate container cca251360a37Step 4 : EXPOSE 22 ---> Running in 663c50a116df ---> 7ff3fe1eba45Removing intermediate container 663c50a116dfStep 5 : RUN yum install -y openssh-server openssh-clients initscripts && yum clean  all ---> Running in 0ad3ae7bce32Skipping unreadable repository '///etc/yum.repos.d/rhel7.repo'Resolving Dependencies--> Running transaction check---> Package initscripts.x86_64 0:9.49.17-1.el7 will be installed................................Generating SSH2 RSA host key: [  OK  ]Generating SSH2 ECDSA host key: [  OK  ] ---> 23f4467b9cb1Removing intermediate container 4049cba1ec0eStep 7 : CMD /usr/sbin/sshd -D ---> Running in 4b60b40c5273 ---> c668ba993c6eRemoving intermediate container 4b60b40c5273Successfully built c668ba993c6e[root@foundation6 docker]# docker run -d --name ssh rhel7:v3595c3647167811140f0c6a48391626555bcb6576d185780a80ad3a3e5791913d##以rhel7:v3为镜像创建名为ssh容器[root@foundation6 docker]# docker psCONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS               NAMES595c36471678        rhel7:v3            "/usr/sbin/sshd -D"   9 seconds ago       Up 5 seconds        22/tcp              ssh[root@foundation6 docker]# ssh  root@192.168.10.2   ##连接容器The authenticity of host '192.168.10.2 (192.168.10.2)' can't be established.ECDSA key fingerprint is 1f:5b:55:ad:6a:05:6d:4a:34:53:ef:e0:9d:26:fb:4c.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '192.168.10.2' (ECDSA) to the list of known hosts.root@192.168.10.2's password: -bash-4.2# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever    inet6 ::1/128 scope host        valid_lft forever preferred_lft forever28: eth0@if29: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP     link/ether 02:42:c0:a8:0a:02 brd ff:ff:ff:ff:ff:ff    inet 192.168.10.2/24 scope global eth0       valid_lft forever preferred_lft forever    inet6 fe80::42:c0ff:fea8:a02/64 scope link        valid_lft forever preferred_lft forever
原创粉丝点击