使用Dockerfile构建镜像

一、docker镜像的封装(httpd服务)

编写yum文件

cd /tmp/docker/
[rhel7]
name=rhel7
baseurl=http://172.25.70.250/source7.3
gpgcheck=0

编写镜像文件
vim Dockerfile

FROM rhel7
ENV HOSTNAME server1
MAINTAINER redhat@westos.org
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y httpd && yum clean all
VOLUME ["/var/www/html"]
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
--FROM(指定基础image) 在dockfile其他指令的前面指定基础image
后面的指令都依赖于该指令指定的image

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

--RUN(安装软件用) RUN可以运行任何被基础image支持的命令
如果基础image指定的是ubuntu,那么RUN中只能使用ubuntu的命令

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

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

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

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

--ENV(用于设置环境变量)

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

这里写图片描述

docker images rhel7  ###查看封装的镜像

这里写图片描述

docker run -d --name vm4 -v /tmp/docker/web/:/var/www/html rhel7:v1
docker inspect vm4 ###查看其ip,好在浏览器访问

这里写图片描述
访问结果:
这里写图片描述

二、docker镜像的封装(sshd服务)
[root@foundation70 docker]# mkdir ssh  
##在/tmp/docker中建立ssh目录
[root@foundation70 docker]# ls
Dockerfile  dvd.repo  ssh  web
[root@foundation70 docker]# cd ssh/
[root@foundation70 ssh]# cd ..
[root@foundation70 docker]# cp dvd.repo ssh/
###将之前的yum源文件复制进去
[root@foundation70 docker]# cd ssh/
[root@foundation70 ssh]# ls
dvd.repo
[root@foundation70 ssh]# vim Dockerfile 
###编辑一个Dockerfile 

Dockerfile 文件内容:

FROM rhel7
ENV HOSTNAME server2
MAINTAINER redhat@westos.org
EXPOSE 22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y openssh-server openssh-clients && yum clean all&& ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ed25519_key -N "" && echo root:westos | chpasswd
CMD ["/usr/sbin/sshd","-D"]
docker build -t rhel7:v2 .
###制作镜像

这里写图片描述

docker images rhel7  ###查看封装的镜像

这里写图片描述

docker run -d --name vm5 rhel7:v2
###创建容器

这里写图片描述
测试链接:

docker inspect vm5  ###查看其ip
ssh 172.27.0.4   ###成功连接

这里写图片描述

三、docker镜像的封装(通过supervisord,将httpd和sshd结合起来)

更改yum源,加入supervisior

[root@foundation3 docker]# vim dvd.repo
 [rhel7]
 name=rhel7
 baseurl=http://172.25.3.250/source7.3
 gpgcheck=0

 [docker]
 name=docker
 baseurl=http://172.25.254.250/pub/docker
 gpgcheck=0

这里写图片描述
自己可以在网上下载supervisor-3.1.3-3.el7.noarch.rpm,安装它
编写Dockerfile

[root@foundation3 docker]# vim Dockerfile
1 FROM rhel7
  2 EXPOSE 80 22
  3 COPY dvd.repo /etc/yum.repos.d/dvd.repo
  4 RUN rpmdb --rebuilddb && yum install -y httpd openssh-server openssh-clients     supervisor&& yum clean all && ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa    _key -N "" && ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" &&     ssh-keygen -q -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" && echo roo    t:westos | chpasswd                                                         
  5 COPY supervisord.conf  /etc/supervisord.conf
  6 CMD ["/usr/bin/supervisord"]

这里写图片描述
编写supervisord.conf

[root@foundation3 docker]# vim supervisord.conf
[root@foundation3 docker]# ls
Dockerfile  dvd.repo  ssh  supervisord.conf  web

文件内容如下:

 [supervisord]
  2 nodaemon=true
  3 
  4 [program:sshd]
  5 command=/usr/sbin/sshd -D
  6 
  7 [program:httpd]
  8 command=/usr/sbin/httpd  
[root@foundation3 docker]# docker build -t rhel7:v3 .
###制作镜像

这里写图片描述
这里写图片描述

[root@foundation3 docker]# docker images  rhel7  
###查看镜像是否成功建立

这里写图片描述

[root@foundation3 docker]# docker run -d --name  vm1 -v /tmp/docker/web:/var/www/html rhel7:v3
83f45af0f75ab51e9e8b5292a7f6a93337d2f619968c6f552ef9ac725bb56970
[root@foundation3 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
83f45af0f75a        rhel7:v3            "/usr/bin/supervisord"   8 seconds ago       Up 7 seconds        22/tcp, 80/tcp      vm1

这里写图片描述
测试:

[root@foundation3 docker]# curl 172.17.0.2
###测试httpd服务
[root@foundation3 docker]# ssh -l root 172.17.0.2
####ssh连接

这里写图片描述
这里写图片描述
四、在编写Dockerfile文件时,里面CMD和ENTRYPOINT指令的区别
1.CMD的情况

[root@foundation3 test]# docker build -t rhel7:v4 .
Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM rhel7
 ---> 0a3eb3fde7fd
Step 2/2 : CMD echo "hello world!"
 ---> Running in 0a12a321c0c7
 ---> 3233215e9475
Removing intermediate container 0a12a321c0c7
Successfully built 3233215e9475

这里写图片描述
测试:会发现cmd的模式会被覆盖

[root@foundation3 test]# docker run --rm rhel7:v4

[root@foundation3 test]# docker run --rm rhel7:v4 westos

[root@foundation3 test]# docker run --rm rhel7:v4  echo westos

[root@foundation3 test]# docker rmi  rhel7:v4 

这里写图片描述
2.ENTRYPOINT的情况

[root@foundation3 test]# vim Dockerfile 
[root@foundation3 test]# docker build -t rhel7:v4 .
Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM rhel7
 ---> 0a3eb3fde7fd
Step 2/2 : ENTRYPOINT echo "hello world!"
 ---> Running in 92af80a5eb0a
 ---> 63e5050ede48
Removing intermediate container 92af80a5eb0a
Successfully built 63e5050ede48

这里写图片描述
测试:不会被覆盖

[root@foundation3 test]# docker run --rm rhel7:v4
hello world!
[root@foundation3 test]# docker run --rm rhel7:v4 westos
hello world!
[root@foundation3 test]# docker run --rm rhel7:v4  echo westos
hello world!

[root@foundation3 test]# docker rmi  rhel7:v4

这里写图片描述
3.两者的结合:

[root@foundation3 test]# vim Dockerfile 
[root@foundation3 test]# docker build -t rhel7:v4 .
Sending build context to Docker daemon 2.048 kB
Step 1/3 : FROM rhel7
 ---> 0a3eb3fde7fd
Step 2/3 : ENTRYPOINT /bin/echo hello
 ---> Running in e977d93744af
 ---> d4a9d9b69782
Removing intermediate container e977d93744af
Step 3/3 : CMD world
 ---> Running in eb80929f622e
 ---> 646362a6d8a3
Removing intermediate container eb80929f622e
Successfully built 646362a6d8a3

这里写图片描述
测试:不是覆盖而是结合

[root@foundation3 test]# docker run --rm rhel7:v4
hello world
[root@foundation3 test]# docker run --rm rhel7:v4 westos
hello westos   ###会根据后面
[root@foundation3 test]# docker rmi  rhel7:v4

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值