博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker容器+镜像篇
阅读量:3963 次
发布时间:2019-05-24

本文共 11580 字,大约阅读时间需要 38 分钟。

docker容器+镜像篇

docker的应用场景以及它的优点

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。

docker应用场景

Web 应用的自动化打包和发布。自动化测试和持续集成、发布。在服务型环境中部署和调整数据库或其他的后台应用。从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

docker的优点

Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。1、快速,一致地交付您的应用程序Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。2、响应式部署和扩展Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。3、在同一硬件上运行更多工作负载Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。

在这里插入图片描述

在这里插入图片描述

docker的架构

Docker包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
    在这里插入图片描述

在这里插入图片描述

docker-ce安装

链接: ,

[root@server1 ~]# cd /etc/yum.repos.d/[root@server1 yum.repos.d]# vim docker.repo[docker]name=docker-cebaseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/gpgcheck=0仅用docker-ce源,去安装docker-ce的时候还存在依赖性,发现所有的依赖性都来自 centoscurl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.reposed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repovim /etc/yum.repos.d/CentOS-Base.repo:%s/$releasever/7/g

yum repolistyum install -y docker-cesystemctl enable --now dockerdocker info  ## 查看docker信息  WARNING: bridge-nf-call-iptables is disabled  WARNING: bridge-nf-call-ip6tables is disabledsysctl -a|grep bridge-nf-call-iptablescd /etc/sysctl.dvim docker.conf  net.bridge.bridge-nf-call-iptables = 1  net.bridge.bridge-nf-call-ip6tables = 1sysctl  --systemip addr show

在这里插入图片描述

docker容器使用以及常用的命令

链接: .

链接: .

拉取镜像时可以使用阿里云的镜像加速器

链接: .

测试

[root@server1 ~]# docker search yakexi007[root@server1 ~]# docker pull yakexi007/game2048[root@server1 ~]# yum install -y bash-*[root@server1 ~]# docker images[root@server1 ~]# docker run -d --name demo -p 80:80 yakexi007/game2048 [root@server1 ~]# docker ps     ##查询端口连接情况 [root@server1 ~]# docker ps -a  ##查看所有的,包括已经停掉的[root@server1 ~]# docker rm -f demo

[root@server1 ~]# docker search yakexi007[root@server1 ~]# docker pull yakexi007/mario[root@server1 ~]# docker images[root@server1 ~]# docker history yakexi007/mario:latest[root@server1 ~]# docker run -d --name demo -p 80:8080 yakexi007/mario[root@server1 ~]# docker ps

docker镜像

链接: .

链接: .

镜像的分层结构

在这里插入图片描述

共享宿主机的kernel.
base镜像提供的是最小的Linux发行版.
同一docker主机支持运行多种Linux发行版.
采用分层结构的最大好处是:共享资源.
在这里插入图片描述
Copy-on-Write可写容器层.
容器层以下所有镜像层都是只读的.
docker从上往下依次查找文件.
容器层保存镜像变化的部分,并不会对镜像本身进行任何修改.
一个镜像最多127层.

拉取一个busybox作为实验环境[root@server1 ~]# docker pull busybox[root@server1 ~]# docker history busybox:latest会执行shell ,提供一个环境,交互式,进入交互式[root@server1 ~]# docker run -it busybox会提供一个ip ,在容器的ip上单调递增,内核版本信息和宿主机一模一样当我们CTRL+d 推出那个交互式环境之后,我们再次查看进程,发现已经没有进程了注意:CTRL+p+q 是打入后台,可以退出交互式环境,还可以保留进程[root@server1 ~]# docker ps -aCONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                     PORTS     NAMESe978bf7bc71f   busybox   "sh"      10 minutes ago   Exited (0) 7 minutes ago             practical_cohen[root@server1 ~]# docker start e978bf7bc71fe978bf7bc71f[root@server1 ~]# docker container attach e978bf7bc71f    ##使用这个命令可以直接进入

[root@server1 ~]# docker container attach e978bf7bc71f  ##附加到容器id上/ # touch file1/ # touch file2/ # touch file3[root@server1 ~]# docker ps -aCONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                     PORTS     NAMESe978bf7bc71f   busybox   "sh"      36 minutes ago   Exited (0) 8 seconds ago             practical_cohen[root@server1 ~]# docker rm e978bf7bc71fe978bf7bc71f[root@server1 ~]# docker run -it --rm busybox    ##加--rm 是自动回收 / # ls

镜像的构建

  • docker commit 构建新镜像三部曲
    运行容器
    修改容器
    将容器保存为新的镜像
  • 缺点:
    效率低、可重复性弱、容易出错
    使用者无法对镜像进行审计,存在安全隐患
[root@server1 ~]# docker run -it  --name demo busybox[root@server1 ~]# docker commit -m "add files" demo demo:v1[root@server1 ~]# docker images

[root@server1 ~]# docker rm demo[root@server1 ~]# docker run -it --name demo demo:v1/ # ls

dockerfile详解

链接: .

root@server1 ~]# mkdir docker[root@server1 ~]# cd docker/[root@server1 docker]# vim Dockerfile ##镜像的构建FROM busyboxRUN touch file1RUN mkdir westos[root@server1 docker]# docker build -t demo:v1 [root@server1 docker]# vim Dockerfile[root@server1 docker]# docker build -t demo:v2 FROM demo:v1RUN touch file2RUN mkdir redhat

dockerfile常用命令练习

FROM 指定base镜像,如果本地不存在会从远程仓库下载。

MAINTAINER 设置镜像的作者,比如用户邮箱等。

COPY 把文件从build context复制到镜像支持两种形式:COPY src dest 和 COPY [“src”, “dest”],src必须指定build context中的文件或目录。

[root@server1 docker]# vim index.htmlwww.westos.com[root@server1 docker]# vim Dockerfile FROM busyboxRUN touch file1COPY index.html /[root@server1 docker]# docker history  demo:v1[root@server1 docker]# docker run -it --rm demo:v1

ADD 用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像:ADD html.tar /var/www ,ADD http://ip/html.tar /var/www

[root@server1 docker]# tar zcf test.tar.gz /etc[root@server1 docker]# vim Dockerfile FROM busyboxRUN touch file1COPY index.html /ADD test.tar.gz /mnt [root@server1 docker]# docker build -t demo:v2 .[root@server1 docker]# docker history  demo:v2[root@server1 docker]# docker run -it --rm demo:v2

ENV 设置环境变量,变量可以被后续的指令使用: ENV HOSTNAME sevrer1.example.com

[root@server1 docker]# vim Dockerfile FROM busyboxRUN touch file1COPY index.html /ADD test.tar.gz /mnt ENV HOSTNAME server1[root@server1 docker]# docker build -t demo:v3 .

EXPOSE 如果容器中运行应用服务,可以把服务端口暴露出去: EXPOSE 80

[root@server1 docker]# vim Dockerfile FROM busyboxRUN touch file1COPY index.html /ADD test.tar.gz /mnt ENV HOSTNAME server1EXPOSE 80[root@server1 ~]# docker run -d --name demo -P nginx-P: 随机端口映射,容器内部端口随机映射到主机的端口[root@server1 ~]# docker inspect demo

VOLUME 申明数据卷,通常指定的是应用的数据挂在点: VOLUME ["/var/www/html"]

[root@server1 docker]# cat DockerfileFROM busyboxVOLUME ["/data"]

这里不要直接退出,将其打入后台 CTRL+P+Q,保证进程 一直存在。
docker inspect demo
删除卷。
在这里插入图片描述

WORKDIR 为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当前工 作目录,如果目录不存在会自动创建。

RUN 在容器中运行命令并创建新的镜像层,常用于安装软件包: RUN yum install -y vim

CMD 与 ENTRYPOINT

  • 这两个指令都是用于设置容器启动后执行的命令,但CMD会被 docker run后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。
  • docker run后面的参数可以传递给ENTRYPOINT指令当作参数。
  • Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。
[root@server1 docker]# cat Dockerfile FROM busyboxRUN touch file1COPY index.html /ADD test.tar.gz /mnt ENV HOSTNAME server1EXPOSE 80VOLUME ["/data"]CMD echo "hello world"[root@server1 docker]# docker build -t demo:v5 .[root@server1 docker]# docker  run --rm demo:v5

Shell格式底层会调用/bin/sh -c来执行命令,可以解析变量[root@server1 docker]# cat Dockerfile FROM busyboxRUN touch file1COPY index.html /ADD test.tar.gz /mnt ENV HOSTNAME server1EXPOSE 80VOLUME ["/data"]CMD ["/bin/sh", "-c", "echo hello $HOSTNAME"]                         [root@server1 docker]# docker build -t demo:v9 .[root@server1 docker]# docker  run --rm demo:v9

[root@server1 docker]# cat Dockerfile FROM busyboxRUN touch file1COPY index.html /ADD test.tar.gz /mnt ENV HOSTNAME server1EXPOSE 80VOLUME ["/data"]ENTRYPOINT ["echo hello"]CMD ["world"][root@server1 docker]# docker build -t demo:v10 .[root@server1 docker]# docker  run --rm demo:v10[root@server1 docker]# docker  run --rm demo:v10 linux

清理整体镜像的快捷语法

docker images | grep demo | awk '{print $1":"$2}' docker rmi `docker images | grep demo | awk '{print $1":"$2}'`  #删除前面的容器镜像[root@server1 docker]# docker image prune ##删除没有id的镜像

封装nginx

官方nginx大小

[root@server1 ~]# lsdocker  nginx.tar  rhel7.tardocker load -i rhel7.tardocker run -it --name demo rhel7 bash[root@server1 ~]# docker cp nginx-1.18.0.tar.gz demo:/

[root@server1 ~]# docker run -it --name demo rhel7 bashbash-4.2# vi dvd.repobash-4.2# rpmdb --rebuilddbbash-4.2# yum install -y gcc pcre-develbash-4.2# mv nginx-1.18.0.tar.gz /mnt/bash-4.2# tar zxf nginx-1.18.0.tar.gz bash-4.2# ./configure bash-4.2# yum install -y zlib-develbash-4.2# make bash-4.2# make installbash-4.2# whereis nginxnginx: /usr/local/nginxbash-4.2# /usr/local/nginx/sbin/nginx -tbash-4.2# exit

测试:

[root@server1 ~]# lsdocker  nginx-1.18.0.tar.gz  nginx.tar  rhel7.tar[root@server1 ~]# mv nginx-1.18.0.tar.gz docker/[root@server1 ~]# cd docker/[root@server1 docker]# lsDockerfile  index.html  nginx-1.18.0.tar.gz[root@server1 docker]# cat DockerfileFROM rhel7 COPY dvd.repo /etc/yum.repos.d/ADD nginx-1.18.0.tar.gz /mntWORKDIR /mnt/nginx-1.18.0RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel &> /dev/null && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.18.0 && yum remove -y gcc make &&  yum clean allEXPOSE 80VOLUME ["/usr/local/nginx/html"]CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]docker build -t webserver:v1

镜像的优化

1.选择最精简的基础镜像

2.减少镜像的层数
3.清理镜像构建的中间产物
4.注意优化网络请求
5.尽量去用构建缓存
6.使用多阶段构建镜像

  • 其中最具有价值是选择最精简的基础镜像和使用多阶段构造镜像。

减少镜像层数 --296M

清理镜像构建的中间产物 --233M
使用多阶段构建镜像 --144M

多阶段[root@server1 docker]# cat Dockerfile FROM rhel7 as buildCOPY dvd.repo /etc/yum.repos.d/ADD nginx-1.18.0.tar.gz /mntWORKDIR /mnt/nginx-1.18.0RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel &> /dev/null && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.18.0 && yum remove -y gcc make &&  yum clean allFROM rhel7COPY --from=build /usr/local/nginx /usr/local/nginxEXPOSE 80VOLUME ["/usr/local/nginx/html"]CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

链接: .

[root@server1 ~]# docker load -i base-debian10.tar [root@server1 docker]# docker pull nginx:1.18.0[root@server1 docker]# docker images[root@server1 ~]# mkdir nginx[root@server1 ~]# vim Dockerfile[root@server1 ~]# docker build -t webserver:v4 .[root@server1 ~]# docker run -d --name webserver webserver:v4e70b3305f5b84af071beb95c1b936fb874c1ee6d53015d9187be491a1b99064b[root@server1 ~]# docker ps
[root@server1 docker]# cat Dockerfile FROM nginx:1.18.0 as base# https://en.wikipedia.org/wiki/List_of_tz_database_time_zonesARG TIME_ZONERUN mkdir -p /opt/var/cache/nginx && \    cp -a --parents /usr/lib/nginx /opt && \    cp -a --parents /usr/share/nginx /opt && \    cp -a --parents /var/log/nginx /opt && \    cp -aL --parents /var/run /opt && \    cp -a --parents /etc/nginx /opt && \    cp -a --parents /etc/passwd /opt && \    cp -a --parents /etc/group /opt && \    cp -a --parents /usr/sbin/nginx /opt && \    cp -a --parents /usr/sbin/nginx-debug /opt && \    cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \    cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \    cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \    cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \    cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \    cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \    cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \    cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \    cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \    cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtimeFROM gcr.io/distroless/base-debian10     COPY --from=base /opt /EXPOSE 80 443ENTRYPOINT ["nginx", "-g", "daemon off;"]

转载地址:http://hnhzi.baihongyu.com/

你可能感兴趣的文章
敏捷开发实践(2)-要不要文档?
查看>>
《java系统性能调优》--2.缓存
查看>>
JAVA注解引发的思考
查看>>
写博意味着什么
查看>>
比较Cint() , int() , fix() ,round()的区别
查看>>
举例说明常用字符串处理函数
查看>>
软件生存期模型
查看>>
制定计划(问题的定义,可行性研究)
查看>>
需求分析
查看>>
软件设计
查看>>
程序编码
查看>>
软件测试
查看>>
软件维护
查看>>
软件项目管理
查看>>
面向过程的分析方法
查看>>
软件设计基础
查看>>
UML的基本结构
查看>>
UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
查看>>
用例图(UseCase Diagram)—UML图(一)
查看>>
类图(Class diagram)—UML图(二)
查看>>