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 分钟前
使用内网穿透工具,为树莓派配置公网地址实现远程ssh
运维·ssh
花晓木21 分钟前
SSH无法启动问题:OpenSSL version mismatch. Built against 30000070, you have 30200020
linux·运维·ssh
YOLO_WY28 分钟前
Docker 开启远程端口访问2375
docker
vvw&33 分钟前
如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ
java·linux·运维·服务器·spring·ubuntu·rabbitmq
大飞哥~BigFei39 分钟前
Docker安装体验kuboard-k8s多集群管理工具
docker·容器·kubernetes·kuboard
Tfly__39 分钟前
ubuntu 18.04安装GCOPTER(最新)
linux·c++·ubuntu·github·ros·无人机·运动规划
m0_748238271 小时前
开源轻量级文件分享服务Go File本地Docker部署与远程访问
docker·golang·开源
小白也有IT梦1 小时前
Ubuntu 系统配置指南:Fcitx5 输入法与 KDE 桌面环境安装教程
linux·ubuntu
数巨小码人1 小时前
vim文本编辑器常用命令和快捷键
linux·编辑器·vim
皓月盈江2 小时前
Linux Debian安装ClamAV和命令行扫描病毒方法,以及用Linux Shell编写了一个批量扫描病毒的脚本
linux·运维·ubuntu·debian·clamav·开源杀毒