作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而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 这个前台命令放到一起才解决。
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。