要求: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构建镜像
前面使用过docker commit
去构建镜像
Docker并不建议用户通过这种方式构建镜像。原因如下:
既然 docker commit 不是推荐的方法,我们干嘛还要花时间学习呢?
原因是:即便是用 Dockerfile(推荐方法)构建镜像,底层也 docker commit 一层一层构建新镜像的。学习 docker commit 能够帮助我们更加深入地理解构建过程和镜像的分层结构。
关键词
--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
内核中强大的工具cgroup,不仅可以限制被NameSpace隔离起来的资源,还可以为资源设置权重,计算用量等
cgroup全称是control groups
control groups:控制组,被整合在了linux内核当中,把进程(tasks)放到组里面,对组设置权限,对进程进行控制。可以理解为用户和组的概念,用户会继承它所在组的权限。
cgroups是linux内核中的机制,这种机制可以根据特定的行为把一系列的任务,子任务整合或者分离,按照资源划分的等级的不同,从而实现资源统一控制的框架,cgroup可以控制、限制、隔离进程所需要的物理资源,包括cpu、内存、IO,为容器虚拟化提供了最基本的保证,是构建docker一系列虚拟化的管理工具
实验:使用ssh管理docker的容器。
实验要求:
1、ssh可以登录容器
2、在容器内yum 安装httpd并且启动
实验步骤
将docker的centos镜像实例化名为sshd的容器
[root@localhost ~]# docker run -itd --name sshd centos /bin/bash
cd3c512d6cd959263b1c94e19781d7213831aad714a2e962ade7c0adc28c510e
进入容器,并进行安装sshd和启动sshd的相应操作
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中有哪些东西
当我们使用pull从docker仓库中将镜像下载到本地,也就是可以通过docker images
查看到pull到的镜像,下载后,可以通过docker run
将镜像启动运行在容器(Contaier)中,就可以对容器进行start/stop/kill...
等操作。
当然如图所示的images,也可以进行在本地的备份,通过save保存到本地机器,或者通过load恢复到docker的images中
在公司中,不可能去只是用一个centos镜像,可能会用到nginx等的服务,这里就以nginx为例,最后可以通过docker commit
制作一个镜像,可以push到仓库中,供用户下载使用
dockerfile
是一种作镜像的技术,在后面的学习中会用到,到时再说