Docker-Dockerfile案例(一)

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:

Docker基本情况

Docker基本命令

Dockerfile(本小节属于)

Docker镜像

Docker仓库

Docker原理

Docker网络&存储&日志

Docker-Compose

Docker番外篇

前面我们经过几个小节的讲解,把常用的Dockerfile的参数都大概讲解了一次,今天这小节我们将结合实际需求来讲解。

需求

1.要求使用基础镜像centos:7

2.添加作者的邮件

3.安装nginx

4.暴露80 和443 端口

5.工作目录/root

6.使用nginx用户启动nginx

7.添加要有环境变量,key,value可以自己定义

8.添加本地的文件首页文件,替换nginx默认的首页文件

9.配置nginx启动

拆解需求

基础镜像,这个比较简单,只需要使用标准使用语句编写即可,唯一需要注意就是名字和实际匹配上。因为默认的镜像都是官方镜像,他可以简写,而我们自己是修改了tag的镜像是不能简写的。

bash 复制代码
docker.io/library/centos:7
centos:7
# 这实际上是一个镜像

FROM centos:7
#或者
FROM docker.io/library/centos:7

作者,这个也比较简单,只需要使用标准使用语句编写即可。

css 复制代码
MAINTAINER xxx@xxx.com

安装nginx,这个说简单也简单,说复杂也算复杂。因为我们用的是centos7的镜像,而centos7目前已经过期,所以第一件事就是要更换源,更换源以后,还要考虑版本的问题,当然这里未考虑版本的问题,只考虑功能。

bash 复制代码
#这里用的命令,必须是FROM镜像里面必须有的命令
#如果没有就必须选其他方法,比如我其实在写的是写的wget
#如果通过网络下载还必须考虑容器能否上网的问题
RUN rm -rf /etc/yum.repos.d/*.repo
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum -y install epel-release
RUN yum -y install nginx

暴露端口,这个比较简单,只需要使用标准使用语句编写即可。

复制代码
EXPOSE 80 443

工作目录,如果为了减少干扰,这个操作最好放到后面,所以动态步骤都做完了再写这个。

bash 复制代码
WORKDIR /root

用户,这个和工作目录一样,也尽量放到后面,还有一个要考虑就是nginx这个用户是否会被自动创建,如果不会则需要你通过RUN命令创建用户。

sql 复制代码
USER nginx

环境变量,这个也比较简单,只需要使用标准使用语句编写即可,也尽量放到后面

css 复制代码
ENV A=B

复制本地文件,需要考虑就是应该放置那个目录(需要你对nginx比较了解),我这里就直接给出来对应的目录。

bash 复制代码
ADD index.html /usr/share/nginx/html/

nginx启动,这里我们就不用nginx的标准方案,因为不是所有软件都有自己前台启动方式。所以有些镜像会使用一个tail -f命令打开某个文件方式来做启动命令,确保无论里面的应用软件是否正确,都不影响容器运。当出现应用无法去启动的时候可以通过exec进入容器进行检查和修复。当然这个也是一个具有争议的问题(因为如果使用业务启动命令来容器,如果出现异常,容器无法启动,也无法进入容器检查修复,需要经过重新构建镜像才能恢复)

bash 复制代码
RUN nginx
ENTRYPOINT ["tail", "-f", "/etc/hosts"]
#实际这个并不会成功,因为不同的命令层是不一样的

合并起来就是这样的:

bash 复制代码
mkdir docker
cd docker
touch index.html
echo "this is docker test" > index.html
touch Dockerfile

vi Dockerfile

FROM centos:7
MAINTAINER xxx@xxx.com
RUN rm -rf /etc/yum.repos.d/*.repo
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum -y install epel-release
RUN yum -y install nginx
ADD index.html /usr/share/nginx/html/
EXPOSE 80 443
WORKDIR /root
ENV A=B
ENTRYPOINT ["sh", "-c", "nginx & tail -f /etc/hosts"]

# 构建镜像
docker build -t nginx:test .

# 创建容器,并暴露80端口
docker run -itd -p80:80 nginx:test

# 访问容器
curl localhost

总结

我们前面的命令单独写出来其实都没有问题,但是组合到一起使用就会遇到问题,下面就是我是我在编写这个Dockerfile的遇到的问题

1.下载repo本来是使用的wget命令,但是默认的镜像里面没这个命令,所以我更换成了curl命令。

2.安装nginx的时候不记得需要先安装epel源,centos的默认源里面是没有nginx的。

3.本来打算是使用nginx用户启动的,但是nginx默认的80端口,nginx这个用户作为普通用户无法启动1024以下的端口,而且还出现root安装的软件,nginx用户去启动服务的时候部分文件权限不足的情况,所以后来这个功能被取消。

4.启动使用命令原来写的是nginx命令启动,但是由于使用的RUN命令,这个命令是单独的一层,在实际上不会生效,后来是把启动命令和 tail 这个前台命令放到一起才解决。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

相关推荐
绵绵细雨中的乡音1 小时前
网络基础知识
linux·网络
Peter·Pan爱编程2 小时前
Docker在Linux中安装与使用教程
linux·docker·eureka
kunge20132 小时前
Ubuntu22.04 安装virtualbox7.1
linux·virtualbox
清溪5492 小时前
DVWA中级
linux
MUY09903 小时前
应用控制技术、内容审计技术、AAA服务器技术
运维·服务器
楠奕3 小时前
elasticsearch8.12.0安装分词
运维·jenkins
Sadsvit3 小时前
源码编译安装LAMP架构并部署WordPress(CentOS 7)
linux·运维·服务器·架构·centos
xiaok3 小时前
为什么 lsof 显示多个 nginx 都在 “使用 443”?
linux
java资料站3 小时前
Jenkins
运维·jenkins
苦学编程的谢4 小时前
Linux
linux·运维·服务器