docker——dockerfile理论+构建httpd+sshd+systemctl+Nginx+Tomcat+MySQL镜像

本文详细介绍了如何使用Dockerfile构建httpd、sshd、systemctl、Nginx、Tomcat和MySQL服务的镜像。通过Dockerfile的指令,一步步构建每个服务的镜像层,并提供了执行流程和镜像的使用及测试方法。
摘要由CSDN通过智能技术生成

Dockerfile概述

Dockerfile是docker中镜像文件的的描述文件,说的直白点就是镜像文件到底是由什么东西一步步构成的。
例如:你在淘宝上买了一个衣架,但是卖家并没有给你发一个完整的衣架,而是一些组件和一张图纸,你按照这个图纸一步一步将衣架组装起来,就成了你所需要的样子。那么Dockerfile 就是这张图纸,镜像文件就是你需要的这个衣架,Dockerfile 不建议随便命名,就用 Dockerfile。
因此,Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

Docker 执行 Dockerfile 的大致流程:

(1)docker从基础镜像运行一个容器;
(2)执行一条指令并对容器作出修改;
(3)执行类似dockercommit的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器;
(5)执行dockerfile中的下一条指令直到所有指令都执行完成。

回顾Dockerfile

说到Dockerfile,就离不开Dockerfile的核心组件,尤其是镜像。镜像是运行容器的基础环境,也就是说镜像是docker容器创建的关键,而创建镜像的三种方式之一的Dockerfile是最为灵活的。

什么是Dockerfile?
Dockerfile可以看做是被Docker程序所解释翻译的脚本,由一组命令集合而成,每一条命令都对应一条操作命令,有其翻译为Linux下的具体命令。用户可以通过自定义内容来快速构建镜像。
​ 其实说简单点,你可以认为Dockerfile是“专门用于构建镜像的shell脚本”。
​ 还记得Dockerfile的严格格式吗?我们先来看一下这个表格。
在这里插入图片描述

1.构建httpd服务镜像

[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir apache ##创建目录
[root@localhost opt]# cd apache/
[root@localhost sshd]# vim Dockerfile  ##编写dockerfile文件
#基于的基础镜像
FROM centos
#维护镜像的用户信息
MAINTAINER zjz
#镜像操作指令安装Apache软件
RUN yum -y update
RUN yum -y install httpd
#开启 80端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#启动容器是执行脚本
CMD ["/run.sh"]

其中注意:run 命令可以有多条CMD只能有一条,若有多条则只会执行最后一条

编写启动httpd服务的shell脚本

vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND


编写测试页面

vim index.html
<h1>this is docker httpd web</h1>

使用tree命令查看目录的文件结构
没有tree这个命令,用yum -y install tree 装一哈

[root@localhost apache]# tree ./
./
├── Dockerfile
├── index.html
└── run.sh

0 directories, 3 files

构建和使用镜像(创建运行容器)

[root@localhost apache]# docker build -t httpd:new .

在这里插入图片描述

[root@localhost apache]# docker images

在这里插入图片描述

#基于构建的镜像创建并运行容器,给容器取名为test
[root@localhost apache]# docker run --name test -d -P httpd:new  

在这里插入图片描述

[root@localhost apache]# docker ps -a

在这里插入图片描述
这样我们进入容器中检查一下这个页面文件是否存在

[root@localhost apache]# docker exec -it test /bin/bash
[root@0467d8d2d590 /]# cat /var/www/html/index.html 
<h1>this is docker httpd web</h1>

在这里插入图片描述
在这里插入图片描述

2、构建sshd镜像

[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir sshd  ##创建目录
[root@localhost opt]# cd sshd/
[root@localhost sshd]# vim Dockerfile  ##编写dockerfile文件
#sshd服务的镜像构建——基于Dockerfile
#首先先下载基础镜像centos,创建对应的工作目录
#开始编写nginx的Dockerfile
#第一步:基础镜像
FROM centos:7
#第二步:维护者信息
MAINTAINER zjz
#第三步:指令集
RUN yum -y update
RUN yum -y install openssh* net-tools lsof telnet passwd 
RUN echo '123123' | passwd --stdin root
#不以PAM认证登录而是以密钥对登录(非对称密钥),即禁用ssh的PAM认证
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#禁用ssh中PAM会话模块
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd
#创建ssh工作目录和权限设置
RUN mkdir -p /root/.ssh && chown root:root /root && chmod 700 /root/.ssh
#开放22端口
EXPOSE 22
#第四步:启动容器时执行指令
CMD ["/usr/sbin/sshd","-D"]

构建镜像和运行容器
[root@localhost sshd]# docker run -d -P sshd:new 
6005aaad0e99897e11672e081101a43aee169c06acba08a48b1353317d9504eb
[root@localhost sshd]# docker ps -a
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                   NAMES
6005aaad0e99        sshd:new            "/usr/sbin/sshd -D"   7 seconds ago       Up 6 seconds        0.0.0.0:32768->22/tcp   pensive_poincare

测试
[root@localhost sshd]# ssh 192.168.10.52 -p 32768
The authenticity of host '[192.168.10.52]:32768 ([192.168.10.52]:32768)' can't be established.
RSA key fingerprint is c5:95:5d:0a:ce:b3:d8:cc:43:f7:b6:32:89:12:28:21.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.10.52]:32768' (RSA) to the list of known hosts.
root@192.168.10.52's password: 
Permission denied, please try again.
root@192.168.10.52's password: 
[root@6005aaad0e99 ~]# exit
logout
Connection to 192.168.10.52 closed.

此时我们登录该容器(ssh或者docker exec命令)查看sshd服务的状态(但是systemctl无法使用)
[root@6005aaad0e99 ~]# systemctl status sshd
Failed to get D-Bus connection: Operation not permitted

一则我们可以使用下面的命令使用该命令,二则我们可以基于上面构建的镜像作为基础镜像构建systemctl的镜像来测试验证。
[root@localhost sshd]# docker run --privileged -itd -P sshd:new  /usr/sbin/init 
bf552af2fb6b7d512bc44c32262a5dcce092e26bb7bec8e73c866a5c5a755d83
[root@localhost sshd]#  docker ps -a
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                   NAMES
bf552af2fb6b        sshd:new            "/usr/sbin/init"      6 seconds ago       Up 6 seconds        0.0.0.0:32770->22/tcp   adoring_bose
bb24b2efd442        systemctl:new       "/usr/sbin/init"      13 minutes ago      Up 13 minutes       22/tcp                  sleepy_curie
0467d8d2d590        httpd:new           "/run.sh"             27 minutes ago      Up 27 minutes       0.0.0.0:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值