Docker容器(配置+镜像建立及优化+镜像加速器制作)_加快打包容器镜像

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2.下载docker-ce

[root@server1 yum.repos.d]# yum repolist
[root@server1 yum.repos.d]# yum install -y docker-ce

3.开启服务,并开机自启

[root@server1 yum.repos.d]# systemctl start docker
[root@server1 yum.repos.d]# systemctl enable docker

4.查看docker 信息

[root@server1 yum.repos.d]# docker info

在这里插入图片描述
如果查看info中出现以下报错
在这里插入图片描述
解决方法如下:

[root@server1 sysctl.d]# pwd
/etc/sysctl.d
[root@server1 sysctl.d]# vim  docker.conf 
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@server1 sysctl.d]# sysctl  --system               ##生效

ip addr 查看多了一个docker0

在这里插入图片描述

5.测试

[root@server1 ~]# docker search yakexi007
NAME                 DESCRIPTION   STARS     OFFICIAL   AUTOMATED
yakexi007/game2048                 0                    
yakexi007/mario                    0                    
yakexi007/nginx                    0   
[root@server1 ~]# docker pull yakexi007/game2048       ## 拉取镜像        

本地加载[root@server1 ~]# docker load -i mario.tar
在这里插入图片描述

[root@server1 ~]# docker history yakexi007/game2048:latest

在这里插入图片描述
做端口映射 第一个80是宿主机的,第二个对应镜像的端口
-d是打入后台,–name 是给镜像取个名字

[root@server1 ~]# docker run -d --name game2048 -p 80:80 yakexi007/game2048
[root@server1 ~]# docker ps                         ##查询端口连接情况 
[root@server1 ~]# docker ps -a               ## 查看所有的,包括已经停掉的

然后访问docker主机的ip即可
在这里插入图片描述
这里是mario的,和2048操作相同
在这里插入图片描述
删除已经拉取的镜像

[root@server1 ~]# docker rm -f game2048

三、docker镜像

1.镜像的分层结构

在这里插入图片描述
共享宿主机的kernel
base镜像提供的是最小的Linux发行版
同一docker主机支持运行多种Linux发行版
采用分层结构的最大好处是:共享资源

拉取一个busybox作为实验环境

[root@server1 ~]# docker pull busybox
[root@server1 ~]# docker history busybox:latest

会执行shell ,提供一个环境,交互式
在这里插入图片描述
进入交互式

[root@server1 ~]# docker run -it busybox

在这里插入图片描述
会提供一个ip ,在容器的ip上递增,内核版本信息和宿主机一模一样
在这里插入图片描述
当我们CLRT+d 推出那个交互式环境之后,我们再次查看进程,发现已经没有进程了,

[root@server1 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                     PORTS     NAMES
e978bf7bc71f   busybox   "sh"      10 minutes ago   Exited (0) 7 minutes ago             practical_cohen
[root@server1 ~]# docker start e978bf7bc71f
e978bf7bc71f
[root@server1 ~]# docker container attach e978bf7bc71f                  ## 使用这个命令可以直接进入

在这里插入图片描述
注意 CTRL+p+q 是打入后台,可以退出交互式环境,也还可以保留进程

Copy-on-Write 可写容器层,容器层以下所有镜像层都是只读的,docker从上往下依次查找文件,容器层保存镜像变化的部分,并不会对镜像本身进行任何修改,一个镜像最多127层。
在这里插入图片描述
实验验证:

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

在这里插入图片描述

2.镜像的构建

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

(二)将容器保存为新的镜像

[root@server1 ~]# docker commit -m "add files" demo demo:v1

(三)查看镜像

[root@server1 ~]# docker images

在这里插入图片描述
相当于在原来的busybox基础上加了一层.
在这里插入图片描述
当我们回收掉容器demo后,再次运行一下demo:v1查看数据

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

在这里插入图片描述
创建一个Dockerfile

[root@server1 ~]# docker rm demo
[root@server1 ~]# docker rmi demo:v1 
[root@server1 ~]# mkdir docker
[root@server1 docker]# vim Dockerfile
FROM busybox
RUN touch file1
RUN mkdir westos

在这里插入图片描述
构建镜像

[root@server1 docker]# docker build -t demo:v1 .

从当前目录中找Dokerfile ,运行里面的指令
在这里插入图片描述

[root@server1 docker]# docker images
[root@server1 docker]# docker history  demo:v1 

在history里我们可以详细的看到所运行的所有指令。一目了然。
在这里插入图片描述
Dokerfile 最佳实践
每一步操作都是由docker commit来实现的,每一条指令生成一个镜像层
在这里插入图片描述

[root@server1 docker]# vim Dockerfile
FROM demo:v1
RUN touch file2
RUN mkdir redhat
[root@server1 docker]# docker build -t demo:v2 .
[root@server1 docker]# docker images
[root@server1 docker]# docker history  demo:v2

在demo:v1的基础上又加了两层
在这里插入图片描述

四、Dockerfile详解

还原环境

[root@server1 docker]# docker rmi demo:v1
[root@server1 docker]# docker rmi demo:v2

1.dockerfile常用指令

(1) FROM

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

(2) MAINTAINER

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

(3) COPY

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

示例:

[root@server1 docker]# vim index.html
www.sun.com
[root@server1 docker]# vim Dockerfile 
FROM busybox
RUN touch file1
COPY index.html /

在这里插入图片描述
查看

[root@server1 docker]# docker images
[root@server1 docker]# docker history  demo:v1

在这里插入图片描述
进入交互式页面,查看刚才指令是否执行成功

[root@server1 docker]# docker run -it --rm demo:v1

在这里插入图片描述

(4)ADD

用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像:
示例:

[root@server1 docker]# tar zcf test.tar.gz /etc
[root@server1 docker]# vim Dockerfile 
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt 
[root@server1 docker]# docker build -t demo:v2 .

在这里插入图片描述
查看效果:

[root@server1 docker]# docker images
[root@server1 docker]# docker history  demo:v2
[root@server1 docker]# docker run -it --rm demo:v2

在这里插入图片描述

(4) ENV

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

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

查看命令和之前相同,这里直接验证最后结果
在这里插入图片描述

(5) EXPOSE

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

[root@server1 docker]# vim Dockerfile 
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt 
ENV HOSTNAME server1
EXPOSE 80

[root@server1 ~]# docker run -d --name demo -P nginx
[root@server1 ~]# docker inspect demo

随机指定端口:
在这里插入图片描述

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

(6) VOLUME

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

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# docker build -t demo:v4 .
[root@server1 docker]# docker images
[root@server1 docker]# docker history  demo:v4

[root@server1 docker]# docker run -it --name demo demo:v4
/ # cd /data/
/data # ls
/data # touch dokerfile1
这里不要直接退出,将其打入后台 CTRL+P+Q,保证进程 一直存在

查看/data是否成功挂载

[root@server1 docker]# docker inspect demo

在这里插入图片描述
上图我们看到/data实际上挂载到了我选中的那个路径中,数据也存在在宿主机里面,然后我们测试删掉文件,然后重新见一个文件,再次进入demo中查看,我们新建的文件也存在。说明容器可以做数据持久化。

[root@server1 docker]# cd /var/lib/docker/volumes/ad7567a0c7d9a0694ea1f3ea1798bd12a8b1f3eb036a8cd3476359c6c7e6db19/_data
[root@server1 _data]# ls
dokerfile1
[root@server1 _data]# rm -f dokerfile1 
[root@server1 _data]# cp /etc/passwd .
passwd
[root@server1 _data]# docker attach demo 
/data # ls
passwd

用以下命令我们可以将没有被挂载的数据

[root@server1 _data]# docker rm demo 
demo
[root@server1 _data]# docker volume ls
DRIVER    VOLUME NAME
local     ad7567a0c7d9a0694ea1f3ea1798bd12a8b1f3eb036a8cd3476359c6c7e6db19
[root@server1 _data]# docker volume  prune 

在这里插入图片描述

(7) WORKDIR

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

(8) RUN

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

(9) CMD 与 ENTRYPOINT

这两个指令都是用于设置容器启动后执行的命令,但CMD会被docker run后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。
docker run后面的参数可以传递给ENTRYPOINT指令当作参数。
Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。
示例:

[root@server1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt 
ENV HOSTNAME server1
EXPOSE 80
VOLUME ["/data"]
CMD echo "hello world"
[root@server1 docker]# docker build -t demo:v5 .
[root@server1 docker]# docker  run --rm demo:v5

在这里插入图片描述

[root@server1 docker]# cat Dockerfile 
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt 
ENV HOSTNAME server1
EXPOSE 80
VOLUME ["/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 busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt 
ENV HOSTNAME server1
EXPOSE 80
VOLUME ["/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

我们可以看的CMD后的东西是可以被覆盖的
在这里插入图片描述

五、配置镜像加速器

容器镜像服务
在这里插入图片描述
在这里插入图片描述
在阿里云注册,每个人都可以有免费加速

[root@server1 docker]# cd   /etc/docker/
[root@server1 docker]# vim daemon.json
{
  "registry-mirrors": ["https://2r0ei25n.mirror.aliyuncs.com"]
}
[root@server1 docker]# systemctl daemon-reload 
[root@server1 docker]# systemctl reload docker.service

六、镜像的优化

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

1.实例分析:

这里我们使用nginx镜像制作作为示例
首先我们需要搭建base,这里使用的是rhel7,
链接:rhel7 提取码: k2dm

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值