如何使用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
- 如何使用Dokerfile构建镜像及搭建服务
- Docker-- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建镜像
- 如何使用Dockerfile构建Docker镜像
- dockerfile构建redis镜像及如何跳过确认交互
- Docker--docker使用及自定义Dockerfile构建镜像
- Docker学习笔记-- 如何使用Dockerfile构建镜像
- 使用Harbor搭建Docker私有镜像仓库服务
- 使用Harbor搭建Docker私有镜像仓库服务
- 脉冲云[编译构建]服务----使用Dockerfile文件,在线构建Dcoker镜像
- 构建支持SSH服务的镜像
- 使用Dockerfile构建镜像
- Lua table遍历pairs和ipairs的区别
- 初学者---递归
- vmware调整centos7的root硬盘大小
- 2017年8月14日
- linux vi(vim)常用命令汇总(转)
- 如何使用Dokerfile构建镜像及搭建服务
- 决策树的优缺点
- MFC打开文件夹对话框初始化打开路径
- PHP 将dataurl转成图片image方法总结
- 多线程实现线程同步——互次对
- HDU 5656 CA Loves GCD 枚举GCD+容斥
- hdu2049不容易系列之(4)——考新郎
- HDU 6096 String(字典树)
- nodejs特性