企业运维实战--最全docker学习笔记1.docker简介安装部署镜像构建dockerfile详解镜像构建镜像优化本地私有仓库搭建(代码片段)

Rabbitgo_hyl Rabbitgo_hyl     2022-12-09     608

关键词:

企业运维实战--Docker学习笔记1.Docker简介、安装部署、镜像构建、Dockerfile详解、镜像构建、镜像优化、本地私有仓库搭建


前言–Docker简介

Docker是一个基于Go语言的,开源的应用容器引擎,是一个用于开发,交付和运行应用程序的开放平台。Docker使得应用程序与基础架构分开来,进而实现快速交付。

其作用包括:可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制(沙箱就是一个限制应用程序对系统资源的访问的运行环境,通常实现在虚拟机中),更重要的是容器性能开销极低。

Docker的优点:
1.快速、一致地交付应用程序。开发人员在本地写代码,使用Docker容器与同事共享工作;使用Docker将应用程序推送到测试环境中进行测试;当出现错误时,开发人员可以在开发环境中进行修复,然后重新部署到测试环境中;测试完成后将修补程序像更新的镜像一样推送给生产环境。
2.响应式部署和扩展。Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3.同一硬件上可运行更多工作负载。Docker轻巧快速,为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案。因此Docker非常适合于高密度环境以及中小型部署。通俗来讲就是用更少的资源做更多的事情。

先简单介绍一下Docker的工作流程
在这里插入图片描述
1.Dockerfile是镜像的源代码。你可以简单理解为创建容器镜像(Images)的脚本,可以通过它创建容器的镜像。
2.获得容器的镜像后,我们可以通过镜像在本地Docker环境拉起(run)容器(Containers),也可以对其进行stop暂停、start开启、restart重启操作。容器也可以交付commit给镜像。
3.可对镜像进行备份backup.tar。
4.Docker registry 注册表就好像一个本地仓库,你可以推送(push,也可以理解为上传)和拉取(pull,也可以理解为下载)镜像。

目前的Docker主要分为社区版(CE)和企业版(EE),本章我们将使用CE版进行操作学习。


一、Docker安装部署

环境介绍:一台全新的rhel7.6虚拟机,火墙和selinux均处于关闭状态。

安装docker-ce,启动服务

yum repolist
yum install -y docker-ce

在这里插入图片描述

systemctl enable --now docker

在这里插入图片描述

查看docker信息,发现两条warning
docker info
在这里插入图片描述

在这里插入图片描述

sysctl -a | grep bridge-nf-call-iptables
vim /etc/sysctl.d/docker.conf

在这里插入图片描述

cat /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

在这里插入图片描述

docker服务开启自动添加docker ip

ip addr

在这里插入图片描述

docker服务开启会自动写入火墙策略

iptables -L

在这里插入图片描述

刷新内核文件,读取添加的文件

sysctl --system

在这里插入图片描述

再次查看发现警告已消除

docker info

在这里插入图片描述

测试:将2048游戏镜像添加到docker中

docker load -i game2048.tar

查看已经添加的镜像

docker images

运行容器 –name表示名称为demo 端口为真实主机的80映射到虚拟机的80端口-d表示打入后台

docker run -d --name demo -p 80:80 game2048

在这里插入图片描述

docker images
docker rm -f demo

测试:网页访问172.25.9.1,可看到游戏画面,docker安装部署完成。 在这里插入图片描述

二、镜像的构建

注意:
ctrl+p+q 将运行的交互式容器打入后台

上传busybox镜像到docker

docker load -i busybox.tar

在这里插入图片描述

拉起容器busybox,-i表示交互式,-t表示打开伪终端

docker run -it --name demo busybox

在这里插入图片描述

查看镜像

docker images

在这里插入图片描述

删除demo容器重新创建

docker run -it --name demo busybox

在这里插入图片描述

-a查看所有进程

docker ps -a

在这里插入图片描述

启动已有容器

docker start demo

查看进程

docker ps

在这里插入图片描述

进入已存在的demo容器中

docker container attach demo

在这里插入图片描述

上传新的镜像,源于demo容器 demo:v1

docker commit demo demo:v1
docker images

在这里插入图片描述

对比查看两者层级结构

docker history demo:v1
docker history busybox:latest

在这里插入图片描述

删除v1容器

docker rmi demo:v1
docker images

在这里插入图片描述

重启读取v1中的内容

docker commit demo demo:v1
docker images

在这里插入图片描述

删掉demo后,不影响v1容器

docker rm demo
docker run -it --name demo demo:v1

在这里插入图片描述

对比层级结构查看,手动添加的容器没有解释每一层的作用,game2048里会对

docker ps
docker history game2048:latest

在这里插入图片描述

在这里插入图片描述

解决方法:
Dockerfile文件方式导入镜像v2,history可以查看具体内容,容器用busybox

mkdir docker
cd docker/
vim Dockerfile
cat Dockerfile
FROM busybox
RUN echo westos > testfile
RUN echo hello > testfile1

在这里插入图片描述

在当前目录文件Dockerfile下创建镜像

docker build -t demo:v2 .

在这里插入图片描述

查看导入的镜像,可以查到镜像内容

docker images
docker history demo:v2

在这里插入图片描述

可以看到层级操作的具体操作解释。

三、Dockerfile详解

详情如下:
vim Dockerfile
注意:此处为了方便解释每条语句的含义,所以才在文中直接加了中文注释,运行时请删掉注释。

FROM busybox  #镜像来源
RUN echo westos > testfile # RUN后跟shell运行语句
RUN echo hello > testfile1
COPY index.html / #COPY拷贝当前目录的index.html到容器的根目录下
ADD nginx-1.20.1.tar.gz / #ADD 解压tar包到根目录下
ENV HOSTNAME server1 #ENV 定义变量HOSTNAME为server1
EXPOSE 80 #设定端口为80
VOLUME "/data" #挂载目录为/data
WORKDIR /data #工作空间为 /data
ENTRYPOINT ["/bin/echo", "hello"] #强制输出不被覆盖
CMD ["world"] #输出会覆盖

在这里插入图片描述

创建容器demo:v5
在这里插入图片描述

–rm表示执行后丢弃,不保存cache

docker run -it --rm demo:v5
docker run -it --rm demo:v5 westos

在这里插入图片描述

docker rmi docker images |grep ^demo | awk 'print $3'

四、镜像构建- -nginx

导入rhel7镜像,相当于使用rhel7的内核

docker load -i rhel7.tar

在这里插入图片描述

编写Dokcerfile创建镜像,

vim Dockerfile

FROM rhel7
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
RUN rpmdb --rebuilddb
RUN yum install -y gcc pcre-devel zlib-devel make
WORKDIR /mnt/nginx-1.20.1
RUN ./configure &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null 
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

通过Dockerfile建立镜像v1,执行命令创建镜像rhel7:v1

docker build it rhel7:v1

在这里插入图片描述

在这里插入图片描述

查看端口

拉起容器,进程名为demo,

docker run -d --name demo rhel7:v1

查demo进程/容器信息

docker inspect demo

在这里插入图片描述
可以看到分配给nginx的ip为172.17.0.2
测试访问可访问到nginx主页

curl 172.17.0.2

五、镜像优化

主要优化途径包括:

  • 清理镜像构建的中间产物
  • 选择最精简的基础镜像
  • 减少镜像的层数
  • 尽量去用构建缓存
  • 使用多阶段构建镜像
  • 注意优化网络请求

v2镜像:减少镜像层数,合并所有RUN指令,清理镜像构建的中间产物包括编译好的安装包和缓存/mnt/nginx-1.20.1 /var/cache/*

cat Dockerfile

FROM rhel7 
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.20.1
RUN rpmdb --rebuilddb &&  yum install -y gcc pcre-devel zlib-devel make && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc  && ./configure &> /dev/null && make &> /dev/null &&  make install &> /dev/null && rm -fr /mnt/nginx-1.20.1 /var/cache/* 

CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

创建镜像v2

docker build -t rhel7:v2 .

在这里插入图片描述
查看镜像大小

docker images rhel7

在这里插入图片描述

v3:尽量去用构建缓存,使用多阶段构建镜像

cat Dockerfile

FROM rhel7 as build
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.20.1
RUN rpmdb --rebuilddb &&  yum install -y gcc pcre-devel zlib-devel make && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc  && ./configure &> /dev/null && make &> /dev/null &&  make install &> /dev/null && rm -fr /mnt/nginx-1.20.1 /var/cache/* 
FROM rhel7
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

docker build -t rhel7:v3 .

在这里插入图片描述
查看压缩后的镜像v3大小
在这里插入图片描述

v4:选择最精简的基础镜像替换原有的rhel7

在这里插入图片描述

cat /new/Dockerfile

FROM nginx:latest as base

# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG TIME_ZONE

RUN 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/localtime

FROM gcr.io/distroless/base-debian10

COPY --from=base /opt /

EXPOSE 80 443

ENTRYPOINT ["nginx", "-g", "daemon off;"]
docker build -t rhel7:v4 .

在这里插入图片描述
在这里插入图片描述

docker images  rhel7

在这里插入图片描述

可以看到原本的300M+的镜像被我们压缩到31.9M。

六、本地私有仓库搭建

先清理之前实验的所有镜像

在这里插入图片描述

docker ps -a
docker rm -f demo
docker rmi rhel7:v4
docker rmi rhel7:v3
docker rmi rhel7:v2
docker rmi rhel7:v1
docker images

在这里插入图片描述

镜像改名
标记原有镜像rhel7:v4 为新镜像demo:latest

docker tag rhel7:v4 demo:latest
docker images

在这里插入图片描述

删除rhel7:v4不影响demo的使用

docker rmi rhel7:v4
docker images rhel7
docker images demo

在这里插入图片描述

准备好搭建本地仓库的软件tegistry

docker pull registry
docker load -i registry2.tar

在这里插入图片描述

docker images

在这里插入图片描述

查看进程和层级结构

docker ps -a
docker history registry:2

在这里插入图片描述

启动本低仓库,-v表示本地 /opt/ 映射容器中的 /var/lib ,端口映射为5000

docker run -d --name registry -v /opt/registry:/var/lib/registry -p 5000:5000 registry

在这里插入图片描述

查看进程是否开启

docker ps

在这里插入图片描述
查看本地映射的仓库路径

ls /opt/registry/
cd /opt/registry/

在这里插入图片描述
查看端口5000是否打开

netstat -antlp

在这里插入图片描述

将容器中的game2048镜像标记到本地仓库中

docker tag game2048:latest localhost:5000/game2048:latest

在这里插入图片描述

推行上传

docker push localhost:5000/game2048

在这里插入图片描述
上传成功后本地路径中也产生了文件

ls /opt/registry/
docker ps -a

在这里插入图片描述

删除之后,重新加载,之前的内容依然存在

docker rm -f registry
docker ps -a
docker run -d --name registry -v /opt/registry:/var/lib/registry -p 5000:5000 registry
curl localhost:5000/v2/_catalog

在这里插入图片描述

笔记补充–docker常用命令补充

rhel8系统版本中容器为podman,使用与docker相似。

docker 常用命令
可参考:https://www.runoob.com/docker/docker-command-manual.html

企业运维实战--k8s学习笔记6.ingress加密认证以及地址重写(代码片段)

企业运维实战--k8s学习笔记6.Ingress加密、认证以及地址重写一、Ingress加密二、Ingress认证三、Ingress地址重写一、Ingress加密生成加密密钥opensslreq-x509-sha256-nodes-days365-newkeyrsa:2048-keyouttls.key-outtls.crt-subj"/CN=nginxsvc/O=ngin 查看详情

企业运维实战--k8s学习笔记11.k8s容器资源限制(代码片段)

企业运维实战--k8s学习笔记11.k8s容器资源限制k8s容器资源限制内存限制cpu限制namespace设置资源限制Namespace配置Pod配额k8s容器资源限制Kubernetes采用request和limit两种限制类型来对资源进行分配。request(资源需求):即运行Pod的节点... 查看详情

企业运维实战--docker三剑客一之docker-machine(代码片段)

企业运维实战--Docker三剑客一之Dockermachine前言-dockermachine简介Dockermachine实操安装使用docker-machine前言-dockermachine简介DockerMachine是Docker官方编排(Orchestration)项目之一,负责在多种平台上快速安装Docker环境。DockerMachine 查看详情

企业运维实战--docker三剑客二之docker-compose(代码片段)

企业运维实战--Docker三剑客二之docker-compose前言-dockercompose简介dockercompose实践docker-compose安装docker-compose配置haproxy+nginx负载均衡前言-dockercompose简介DockerCompose是一种编排服务,基于pyhton语言实现,是一个用于在Docker上定... 查看详情

企业运维实战-k8s学习笔记17.k8s集群+prometheus监控部署基于prometheus实现k8s集群的hpa动态伸缩虚拟机部署prometheus监控(代码片段)

企业运维实战-k8s学习笔记17.k8s集群+Prometheus监控部署、基于prometheus实现k8s集群的hpa动态伸缩一、Prometheus简介二、Prometheus+k8s部署1.k8s集群部署Prometheus2.设定Prometheus监控应用nginx3.基于prometheus实现k8s集群的hpa动态伸缩三、虚... 查看详情

docker最全教程——从理论到实战

...云容器服务。对于中小团队来说,很多情况下,团队中的运维人员是缺失的,或者运维人员的水平非常有限——大部分比网吧的网管就好那么一点,从成本、安全(云端产品往往提供了一些解决方案,比如权限控制、灾备... 查看详情

企业运维实战--k8s学习笔记通过ingress-nginx实现k8s七层负载均衡ingress加密认证以及地址重写(代码片段)

1.Ingress服务简介一种全局的、为了代理不同后端Service而设置的负载均衡服务,就是Kubernetes里的Ingress服务。Ingress由两部分组成:Ingresscontroller和Ingress服务。IngressController会根据你定义的Ingress对象,提供对应的代理能... 查看详情

云计算需要学习哪些课程?

...透测试及性能调优项目实战7.公有云运维技术项目实战8.企业私有云架构及运维实战9.Python自动化运维开发基础10.Python自动化运 查看详情

[学习笔记]《精准营销:社会化媒体时代企业传播实战指南》

查看详情

[学习笔记]《精准营销:社会化媒体时代企业传播实战指南》

查看详情

3万字长文记录docker最全学习笔记,手把手带你入个门

前言以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟!MATLAB-30天带你从入门到精通MATLAB深入理解高级教程(附源码)tableau可视化数据分析高级教程 docker不是一个值得投入... 查看详情

最全的spring微服务学习实战项目

学习spring的微服务的模块,包括:服务提供者、服务消费者、服务注册中心、路由网关、统一配置文件管理等。每个模块都有说明文档,看下基本都知道怎么做,欢迎大家下载点赞,github地址https://github.com/YaoZhenPeng/fsSpringCloud.git... 查看详情

docker最全教程——从理论到实战

...云容器服务。对于中小团队来说,很多情况下,团队中的运维人员是缺失的,或者运维人员的水平非常有限——大部分比网吧的网管就好那么一点,从成本、安全(云端产品往往提供了一些解决方案,比如权限控制、灾备... 查看详情

docker学习笔记六:docker搭建企业级私有仓库

前言Docker不仅是一个强大的服务器部署工具,而且它还有一个官方的DockerHubregistry用于储存Docker镜像。上传镜像到DockerHub是免费的,上传的镜像文件同时也对公共领域开放,而这可能不是我们想要的。本文介绍如何配置一个私有... 查看详情

docker笔记

...课地址:http://www.imooc.com/video/14609作者刘果国docker解决了企业的痛点:快速的持续集成,服务的弹性伸缩,部署简单解放了运维,为企业节省了机器资源。什么是dockeer:docker是一个用来装应用的容器,就像杯子可以装水。官网htt... 查看详情

docker学习笔记(代码片段)

...上线两套环境!应用环境,应用配置!开发—运维。问题:我在我的电脑上可以允许!版本更新,导致服务不可用!对于运维来说考验十分大?环境配置是十分的麻烦,每一个机器都要部署 查看详情

运维书

...Nginx高性能Web服务器详解》《Docker容器与容器云》《Zabbix企业级分布式监控系统》《奔跑吧Ansbile》《Docker技术入门与实战》《Python核心编程》《Python自动化运维技 查看详情

docker最全教程——从理论到实战

原文:Docker最全教程——从理论到实战(五)往期内容链接Docker最全教程——从理论到实战(二)Docker最全教程——从理论到实战(三)Docker最全教程——从理论到实战(四) 本篇教程持续编写了3个星期左... 查看详情