Docker架构+Docker镜像分层+Dockerfile

Docker架构:

Docker架构总结:

Docker是属于C/S架构,用户是使用 Docker Client 与 Docker Daemon 建立通信,并发送请求。请求接收后,Docker server通过http协议与路由,找到相应的 Handler 来执行请求

Docker Engine 是 Docker 架构中的运行引擎,同时也 Docker 运行的核心模块。Docker Engine 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式的存在

Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graphdriver 将下载镜像以 Graph 的形式存储

当需要为 Docker 创建网络环境时,通过网络管理驱动 Networkdriver 创建并配置 Docker容器网络环境

当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Execdriver 来完成

Libcontainer 是一项独立的容器管理包,Networkdriver 以及 Execdriver 都是通过 Libcontainer 来实现具体对容器进行的操作

Docker镜像分层:

Docker的最小镜像:

[root@localhost ~]# docker pull hello-world
FROM  scratch
CORP  hello/
CMD  ["/hello"]

Dockerfile的组成:

1)FROM:scratch(抓、挠)

2)COPY:hello/

3)CMD:["/hello"]

base镜像(基础镜像):

Centos:7镜像的dockerfile

FROM scratch  //从零开始构建

ADD centos-7-x86 64-docker.tar.xz /

LABEL org. label-schema. schema-version="1.0"\
org. label-schema.namem"centos Base Image"\
org. label-schema.vendore"Centos"\
org. label-schema.Ticenses"GPLv2" \
org. labe1-schema.build-date"20190305

CMD ["/bin/bash"]

[root@localhost test]# docker build -t centos7-vim-net-tools:12-11 .

Dockerfile镜像分层总结:

镜像是容器的基石,容器是镜像运行后的实例,当镜像运行为容器之后,对镜像的所有数据仅有只读权限,如果需要对镜像源文件进行修改或删除操作时,此时是在容器层(可写层)进行的,用到了COW(copy on write)写时复制机制

Docker镜像的缓存特性

创建一个新的Dockerfile文件

FROM centos:7
RUN yum -y install vim
RUN yum -y install net-tools
RUN yum -y install wget
CMD ["/bin/bash"]
[root@localhost ~]# docker build -t new-centos .

1)如果在相同层,有用到相同的镜像,可以不必再去下载,可以直接使用缓存

创建一个新的Dockefile文件

FROM centos:7
RUN yum -y install vim
RUN yum -y install wget
RUN yum -y install net-tools
CMD ["/bin/bash"]

[root@localhost test1]# docker build -t centos-new .

2)即使镜像层里的操作一样,也必须是在同一层才可以使用dockerfile的缓存特性

如果制作镜像过程中,不想使用缓存可以加--no-cache选项

3)如果前面的曾发生改变,即使后边的层操作和顺序一样,也不能使用缓存特性

Dockerfile常用指令:

1)FROM:构建镜像基于哪个镜像

例如:FROM:centos:7

2)MAINTAINER:镜像维护者姓名或邮箱

例如:MAINTAINER admin

3)RUN:构建镜像时运行的shell命令

例如:

RUN ["yum","install","httpd"]

RUN yum -y install httpd

4)CMD:运行容器时执行的shell命令

例如:

CMD ["/bin/bash"]

5)EXPOSE:声明容器的服务端口

例如:EXPOSE 80 443

6)ENV:设置容器环境变量

例如:

ENV MYSQL_ROOT_PASSWORD 123.com

7)ADD:拷贝文件或目录到镜像,如果时URL或压缩包会自动下载或解压

ADD <源文件>... <目标目录>

ADD ["源文件"..."目标目录"]

8)COPY:拷贝文件或目录到镜像容器内,跟ADD相似,但不具备自动下载或解压功能

9)ENTRYPOINT:运行容器时执行的shell命令

例如:

ENTRYPOINT ["/bin/bash","-c","command"]

ENTRYPOINT /bin/bash -c 'command'

10)VOLUME:指定容器挂在点到宿主机自动生成的目录或其他容器

例如:

VOLUME ["/va/lib/mysql"]

11)USER:为RUN、CMD、和ENTRYPOINT执行命令指定运行用户

12)WORKDIR:为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录,意思为切换目录

例如:

WORKDIR:/var/lib/mysql

13)HEALTHCHECK:健康检查

14)ARG:构建时指定的一些参数

例如:

FROM centos:7

ARG user

USER $user

注意:

1、RUN在building时运行,可以写多条

2、CMD和ENTRYPOINT在运行container时,只能写一条,如果写多条,最后一条生效

3、CMD在run时可以被COMMAND覆盖,ENTRYPOINT不会被不会被COMMAND覆盖,但可以指定--entrypoint覆盖

4、如果在Dockerfile里需要往镜像内导入文件,则此文件必须在dockerfile所在目录或子目录下

小实验:

写一个dockerfile,基于cenyos:7镜像,部署安装NGINX服务

[root@localhost ~]# mkdir  web
[root@localhost ~]# mv nginx-1.14.0.tar.gz  web/
[root@localhost ~]# cd web/
[root@localhost web]# vim  Dockerfile
FROM centos:7
RUN yum -y install gcc pcre pcre-devel openssl openssl-devel zlib zlib-devel
COPY  nginx-1.14.0.tar.gz  /
RUN tar -zxf nginx-1.14.0.tar.gz -C /usr/src
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/src/nginx-1.14.0
RUN ./configure  --prefix=/usr/local/nginx  --user=nginx  --group=nginx
RUN  make  &&  make  install
RUN ln -s /usr/local/nginx/sbin/*  /usr/local/sbin
RUN nginx -t
RUN nginx
EXPOSE 80
[root@localhost web]# docker build  -t  test-web  . //如果Dockerfile在其他路径需要加-f参数来指定Dockerfile文件路径

//如果想要保证容器运行之后,nginx服务就直接开启,不必手动开启,我们可以在命令最后加上:nginx -g "daemon off;"选项

[root@localhost web]# docker run -itd --name testweb_2 test-web:latest nginx -g "daemon off;"

//查看容器的IP:

[root@localhost web]# docker inspect  testweb_2

发布了27 篇原创文章 · 获赞 14 · 访问量 558

猜你喜欢

转载自blog.csdn.net/weixin_45636702/article/details/104002398