Dockerfile构建Nginx镜像

Dockerfile构建nginx镜像

要求:dockerfile做nginx源码镜像。并且启动后容器后可以直接启动。

首先拖入nginx的tar包到物理机路径,与Dockerfile文件放在同一目录

编写Dockerfile

[root@localhost ~]# vim Dockerfile 
FROM centos  # 调用docker中已下载的centos镜像
MAINTAINER FeiYi  # 作者名为FeiYi
# 安装环境所需包
RUN yum -y install net-tools iproute pcre-devel openssl-devel gcc gcc-c++ make zlib-devel elinks
ADD nginx-1.11.1.tar.gz /usr/src  # 解压本地host中的nginx包到容器中的/usr/src目录
ENV NGINX_DIR /usr/src/nginx-1.11.1 # 定义环境变量
WORKDIR $NGINX_DIR  # 进入容器中的解压目录
# 编译安装
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
# 回到根目录
WORKDIR /
# 创建程序用户
RUN useradd nginx
# 优化命令环境
RUN ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
# 监听端口80
EXPOSE 80
# 后台启动nginx服务
CMD ["nginx", "-g", "daemon off;"]

使用Dockerfile构建镜像

Dockerfile语法及构建简单镜像

Dockerfile语法及构建简单镜像

前面使用过docker commit去构建镜像

Docker并不建议用户通过这种方式构建镜像。原因如下:

  1. 这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。比如要在 debian base 镜像中也加入 vi,还得重复前面的所有步骤。
  2. 更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患。

既然 docker commit 不是推荐的方法,我们干嘛还要花时间学习呢?

原因是:即便是用 Dockerfile(推荐方法)构建镜像,底层也 docker commit 一层一层构建新镜像的。学习 docker commit 能够帮助我们更加深入地理解构建过程和镜像的分层结构。

镜像分层结构理论详解2

镜像分层结构理论

要学习去构建镜像,就要做到为什么镜像会如此的小

从最小的镜像开始

世界上最小的镜像是hello-world(1.84kb)

[root@localhost ~]# docker images
REPOSITORY     TAG        IMAGE ID          CREATED             SIZE
hello-world    latest     fce289e99eb9      15 months ago       1.84kB

尝试运行这个镜像会发生什么

镜像分层结构理论详解1

镜像分层结构理论

Docker镜像

据Docker官网的技术文档描述,Image(镜像)是Docker术语的一种,代表一个只读的layer。而layer则具体代表Docker Container文件系统中可叠加的一部分。

笔者如此介绍Docker镜像,相信众多Docker爱好者理解起来依旧是云里雾里。那么理解之前,先让我们来认识一下与Docker镜像相关的4个概念:rootfs、Union mount、image以及layer。

Docker框架结构

Docker的框架结构

Docker框架结构基于docker源码响应的框架

Server与Client

监听端口

一个完整的docker程序,由client和server两个端组成,客户端和服务端都会在本地安装好,在生产环境中,是可以将client和server分离的

docker默认是没有监听端口的,没有监听端口之前是不可以将client和server分离的。所以添加监听端口就可以将server与client分离了

对容器进行磁盘读写速率控制

对容器磁盘读写进行控制

关键词

--blkil-weight:硬盘优先级,谁先使用硬盘
bps/iops:bps是每秒读写的数据量,iops是每秒的io次数
都有利于提升数据读取的速度,要么单次读取数据大,要么读取数据小但是次数多
--device-read-bps:磁盘每秒读取速度
--device-write-bps:磁盘每秒写入速度
--device-read-iops:磁盘每秒io读取速度
--device-write-iops:磁盘每秒io写入速度

控制一

启动一个容器,并限制该容器在磁盘的写入速度为30MB/s

[root@localhost ~]# docker run -it --device-write-bps /dev/sda:30MB centos /bin/bash

使用dd命令测试,发现写入速率为29.9MB/s

对容器进行内存容量控制

对容器内存的限制

内存分为:物理内存和swap内存

关键词

--memory:限制内存的使用容量
--memory-swap:限制内存+swap的大小

启动一个限制内存使用的容器testa,如果不指定--memory-swap的话,默认它的大小和内存一样大

对容器进行cpu的使用控制

控制容器中cpu使用的优先级

默认情况下所有的容器都平等的使用cpu,并没有限制,Docker可以通过内容进行限制

关键词

-c/--cpu-shares:控制cpu优先级
--cpuset-cpus:指定使用哪块cpu

实验环境

将计算机调整为单核cpu,内存4G

实验目的

启动多个容器,指定容器使用cpu的优先级

实验步骤

Docker核心原理---Cgroup

Docker核心原理之—Cgroup

内核中强大的工具cgroup,不仅可以限制被NameSpace隔离起来的资源,还可以为资源设置权重,计算用量等

什么是cgroup

cgroup全称是control groups

control groups:控制组,被整合在了linux内核当中,把进程(tasks)放到组里面,对组设置权限,对进程进行控制。可以理解为用户和组的概念,用户会继承它所在组的权限。

cgroups是linux内核中的机制,这种机制可以根据特定的行为把一系列的任务,子任务整合或者分离,按照资源划分的等级的不同,从而实现资源统一控制的框架,cgroup可以控制、限制、隔离进程所需要的物理资源,包括cpu、内存、IO,为容器虚拟化提供了最基本的保证,是构建docker一系列虚拟化的管理工具

使用ssh管理Docker容器

实验:使用ssh管理docker的容器。

实验要求:

1、ssh可以登录容器

2、在容器内yum 安装httpd并且启动

实验步骤

将docker的centos镜像实例化名为sshd的容器

[root@localhost ~]# docker run -itd --name sshd centos /bin/bash
cd3c512d6cd959263b1c94e19781d7213831aad714a2e962ade7c0adc28c510e

进入容器,并进行安装sshd和启动sshd的相应操作

Docker是如何实现容器隔离的

Docker如何实现隔离

Linxu内核实现Namespace的主要目的是为了实现轻量化的虚拟化,就是为了支持容器

查看隔离

Docker每一个容器中有独立的IP、端口、路由,共有六项隔离

我们通过一个简单的Apache来查看Docker有哪六项隔离

[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# netstat -anpt | grep 80
tcp6      0     0 :::80        :::*         LISTEN      68305/httpd  

可以看到关于80端口的pid是68305,这是重点,接下来就要去看68305这个pid中有哪些东西

Docker两个网络命名空间互通

网络命名空间(Network Namespace)

主机中已经安装并启动docker

创建网络命名空间ns1

ip netns add ns1

将ns1命名空间的本地回环启用(默认是down)

开启之前可以尝试ping回环地址,返回的结果是Network is unreachable网络不可达,就是因为刚创建的ns1命名空间的lo网卡是禁用的,启用即可

ip netns exec ns1 ip link set dev lo up

因为命名空间中只有lo本地回环一块网卡,如果要与本机通信,就必须添加网卡

Docker核心原理

原理相关概念

Namespace命名空间

什么是namespace

Docker的运行和namespace有着密切相关的联系,Docker中每个容器都有自己独立的运行位置

空间:对于我们来讲,一个空间是可以与外界相隔的。就像所谓的平行宇宙,就是好多个宇宙之间,每个宇宙中发生的事情,都不会影响到其他的宇宙。空间也就是这个意思。

再比如:我在北京,你在家乡,如果我想给你一个东西,你是拿不到的,我们之间唯一有影响的就是通过网络来联系,可以聊天,或者发送数据,这个例子更贴合容器的概念

容器在运行时,就是在一个空间内,每个容器就是一个空间

Docker操作逻辑及搭建web

Docker操作逻辑

docker_luoji

当我们使用pull从docker仓库中将镜像下载到本地,也就是可以通过docker images查看到pull到的镜像,下载后,可以通过docker run将镜像启动运行在容器(Contaier)中,就可以对容器进行start/stop/kill...等操作。

当然如图所示的images,也可以进行在本地的备份,通过save保存到本地机器,或者通过load恢复到docker的images中

在公司中,不可能去只是用一个centos镜像,可能会用到nginx等的服务,这里就以nginx为例,最后可以通过docker commit制作一个镜像,可以push到仓库中,供用户下载使用

dockerfile是一种作镜像的技术,在后面的学习中会用到,到时再说

Docker常用命令

查看docker配置信息docker info 镜像管理指令新旧命令暂时兼容(2021-04-19) 搜索镜像docker search 镜像名 # 全网搜索ubuntu镜像 命令格式:docker image [COMMAND] 列出镜像新版命令:docker image ls 旧版命令:docker images 构建镜像docker image build 查看镜像构建历史就是Dock...




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0