N46-第十周作业

1.通过dockerfile制作centos系统镜像然后再制作nginx编译镜像

答:

#配置基础镜像
apt-get update
apt-get upgrade
apt-get -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get -y update
apt-get -y install docker-ce

#安装docker并配制阿里云加速
systemctl enable --now docker
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

# 从hub网站下载基础镜像
mkdir -p /data/base
docker pull centos:centos7.8.2003
cd /data/base

#定制自己使用的基础镜像
vim Dockerfile
FROM centos:centos7.8.2003
LABEL maintainer="jiquanquan<root@example.com>"
RUN yum -y install wget \
&& rm -f /etc/yum.repos.d/* \
&& wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-7.repo \
&& wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo \
&& yum -y install vim-enhanced tcpdump lrzsz tree telnet bash-completion net-tools wget bzip2 lsof zip unzip nfs-utils gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel \
&& yum clean all \
&& rm -f /etc/localtime \
&& ln -s ../usr/share/zoneinfo/Asia/Shanghai /etc/localtime

#构建基础镜像
vim build.sh
#!/bin/bash
docker build -t centos7-base:v1 .
#给构建脚本添加运行权限,并运行。
chmod +x build.sh
./build.sh
#生成定制版的基础镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7-base v1 f794f80a255d 8 minutes ago 399MB
centos centos7.8.2003 afb6fca791e0 3 months ago 203MB

#新建一模版机,并提取相关文件
yum -y install vim-enhanced tcpdump lrzsz tree telnet bash-completion net-tools wget bzip2 lsof zip unzip nfs-utils gcc make gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel
wget -P /usr/local/src http://nginx.org/download/nginx-1.16.1.tar.gz
cd /usr/local/src/
tar xvf nginx-1.16.1.tar.gz
cd nginx-1.16.1/
./configure --prefix=/app/nginx && make && make install
#传递nginx配制文件至docker主机上。
scp /app/nginx/conf/nginx.conf 192.168.98.141:/data/nginx/

#新建nginx目录,修改nginx配制文件,添加测试用的index.html文件
mkdir /data/nginx -p
vim nginx.conf
user www;
daemon off;
wget http://nginx.org/download/nginx-1.16.1.tar.gz
echo "Docker in nginx" > index.html

#配制nginx的Dockerfile文件
vim Dockerfile
FROM centos7-base:v1
LABEL maintainer="jiquanquan<root@example.com>"
ADD nginx-1.16.1.tar.gz /usr/local/src
RUN cd /usr/local/src/nginx-1.16.1 \
&& ./configure --prefix=/apps/nginx \
&& make && make install \
&& rm -rf /usr/local/src/nginx* \
&& useradd -r www
COPY nginx.conf /apps/nginx/conf/
COPY index.html /apps/nginx/html/
EXPOSE 80 443
CMD ["/apps/nginx/sbin/nginx"]

#构建定制的nginx镜像
vim build.sh
#!/bin/bash
docker build -t nginx-centos7:1.6.1 .

chmod +x build.sh

#构建镜像成功
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-centos7 1.6.1 4a0c46431c2c 8 seconds ago 410MB
centos7-base v1 f794f80a255d 5 hours ago 399MB
centos centos7.8.2003 afb6fca791e0 3 months ago 203MB

#用docker run测试容器是否可以启动
docker run -d -p 80:80 nginx-centos7:1.6.1
2590796ff7004e59edd0c064e66f4e0a99874770cab0f075a0a9ed93ac6d44dc


2.写出10个常用的dockerfile脚本参数及使用说明

答:

(1)FROM:指定基础镜像。定制镜像,需要先有一个基础镜像,在这个基础镜像上进行定制。FROM就是指定基础镜像,此指令必需放在Dockerfile文件第一个非注释行。后续的指令都是运行于此基准镜像所提供的运行环境。
(2)LABEL:可以指定镜像元数据,如:镜像作者,邮箱,联系方式等。
(3)RUN:指令用来在构建镜像阶段需要执行FROM指定镜像所支持的shell命令。通常各种基础镜像一般都支持丰富shell命令。RUN可以写多个,每一个RUN指令都会建立一个镜像层,多条命令可以合并成一条指令,通常用&&连在一起成为一条指令
(4)ENV:设置环境变量,ENV可以定义环境变量和值,会被后续指令(如:ENV,ADD,COPY,RUN等)通过$KEY或${KEY}进行引用,并在容器运行时保持。
(5)COPY:复制本地宿主机到容器中,一般用于将在宿主机上事先准备的配置文件复制至镜像中。
(6)ADD:复制和解包文件,ADD命令可认为是增强版COPY,不仅支持COPY,还支持解压缩。可以将复制指定的压缩包文件复制至容器中,并解压至相应的位置上。
(7)CMD:容器启动命令。一个容器中需要持续运行的进程一般只有一个,CMD用来指定启动容器时默认执行的一个命令,且其运行结束后,容器也会停止,所以一般CMD指定的命令为持续运行且为前台命令。
(8)ENTRYPOINT:入口点。功能类似于CMD,配置容器启动后默认执行的命令及参数。ENTRYPOINT不能被docker run提供的参数覆盖,而是追加,即如果docker run命令有参数,那么参数全部都会作为ENTRYPOINT的参数。如果docker run后面没有额外参数,但是dockerfile中的CMD里有(即上面CMD的第三种用法),即Dockerfile中即有CMD也有ENTRYPOINT,那么CMD的全部内容会作为ENTRYPOINT的参数。如果docker run后面有额外参数,同时Dockerfile中即有CMD也有ENTRYPOINT,那么docker run后面的参数覆盖掉CMD参数内容,最终作为ENTRYPOINT的参数。可以通过docker run --entrypoint string参数的运行时替换,string不要加空格。使用CMD要在运行时重新写命令本身,然后在后面才能追加运行参数,ENTRYPOINT则可以运行时无需重写命令就可以直接接受新参数。每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个有效。
(9)ARG:构建参数。ARG指令在build阶段指定变量,和env不同的是,容器运行时不会存在这些环境变量。
(10)VOLUME:挂载点。在容器中创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。一般会将宿主机上的目录/var/lib/containers/storage/volumes/<id>/_data挂载至VOLUME指令指定的容器目录。即使容器后期删除,此宿主机的目录仍会保留,从而实现容器数据的持久保存。
(11)EXPOSE:暴露端口。指定服务端的容器需要对外暴露(监听)的端口号,以实现容器与外部通信。EXPOSE仅仅是声明容器打算使用什么端口而已,并不会真正暴露端口,即不会自动在宿主进行端口映射。因此,在启动容器时需要通过-P或-p,Docker主机才会真正分配一个端口转发至指定暴露的端口才可以使用。即使Dockerfile没有EXPOSE端口指令,也可以通过docker run -p临时暴露容器内程序真正监听的端口,所以EXPOSE相当于指定默认的暴露端口,可以通过docker run -P进行真正暴露。
(12)WORKDIR:指定工作目录。为后续的RUN、CMD、ENTRYPOINT指令配置工作目录,当容器运行后,进入容器内的默认目录。
(13)ONBUILD:可以用来配置当构建当前镜像的子镜像时,会自动触发执行的指令,但在当前镜像构建时,并不会执行。
(14)USER:指定当前用户。指定运行容器的用户名或UID,后续的RUN也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。这个用户必须是事先建立好的,否则无法切换。如果没有指定USER,默认是root身份执行。
(15)HEALTHCHECK:健康检查。检查容器的健康性。
(16)STOPSIGNAL:退出容器的信号。
(17).dockerignore文件:与.gitignore文件类似,生成构建上下文时Docker客户端应忽略的文件和文件夹指定模式。.dockerignore使用Go的文件路径规则filepath.Match

 

3.请写出dockerfile的分层原理

答:

  Dockerfile是一种被Docker程序解释执行的脚本,由一条条的命令组成。每条命令对应linux下面的一条命令,Docker程序将这些Dockerfile指令再翻译成真正的linux命令,其有自己的书写方式和支持的命令,Docker程序读取Dockerfile并根据指令生成Docker镜像,Dockerfile能直观的展示镜像是怎么产生的,有了Dockerfile,当后期有额外的需求时,只要在之前的Dockerfile添加或修改相应的命令即可重新生成新的docker镜像,避免了重复手动制作镜像的麻烦。
  分层镜像最底层为base镜像,base镜像不依赖其他镜像,从scratch构建,其他镜像可以在此基础上进行扩展。base镜像提供都是最小安装的linux发行版本。docker镜像的分层结构为,在镜像启动时,一个新的可写层会加载至镜像的顶层,这一层为“容器层”,这下是“镜像层”。容器层可以读写,容器所发生文件变更都写在这一层,镜像层只允许读取,即只读。

  docker通过一个修改时复制策略来保证base镜像的安全性,以及更高的性能和空间利用率。

(1)当容器需要读取文件时,从最上层的镜像层开始向下找,找到后读取到内存中,若已经在内存中,可以直接使用。运行在同一台机器上的docker容器共享运行时的相同的文件。

(2)当容器需要修改文件时,从上往下查找,找到后复制到容器层,对于容器来说,可以看到的是容器层的这个文件,看不到镜像层里的文件,然后直接修改容器层的文件。

(3)当容器需要删除文件时,从上往下找,找到后在容器中记录删除,这仅仅是标记删除,不是真删除。所以镜像的镜像体现只会增加,不会减少。

(4)当容器需要增加文件时,直接在最上层的容器可写层添加,不会影响镜像层。

posted @ 2020-08-04 15:34  索玛  阅读(99)  评论(0)    收藏  举报