Docker(1)--简介、安装配置、镜像构建

一、Docker 简介

1.什么是Docker

Docker是管理容器的引擎, 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

2.Docker的应用场景

Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。

二、Docker安装及运行

1.配置软件仓库

将安装包目录放到主机里面的默认发布目录下,作为docker安装包仓库,在虚拟机里面编写软件仓库指向真机/var/www/html/docker目录
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.安装启动
yum install docker-ce
systemctl enable --now docker.service 
docker info
vim /etc/sysctl.d/docker.conf
///
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1:
///
sytctl --system
docker search yakexi007
docker pull yakexi007/mario   #拉取游戏镜像
docker ps
docker run -d --name demo -p 8080:8080 yakexi007/mario

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述浏览器:172.25.101.14:8080,进入游戏界面

在这里插入图片描述

docker stop demo
docker ps -a

在这里插入图片描述安装ubuntu镜像

lftp 172.25.254.250
/> cd pub/images/
> get ubuntu.tar
> exit
docker load -i ubuntu.tar
docker images

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

# docker run -it --rm ubuntu
:/# uname -r
3.10.0-957.el7.x86_64
:/# cat /etc/resolv.conf 
nameserver 114.114.114.114

三、镜像的构建及优化

1.镜像的分层结构

在这里插入图片描述

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

docker commit 构建新镜像三部曲

运行容器
修改容器
将容器保存为新的镜像

缺点:

效率低、可重复性弱、容易出错
使用者无法对镜像进行审计,存在安全隐患

镜像常用子命令:

images 显示镜像列表
history 显示镜像构建历史
commit 从容器创建镜像
build 从Dockerfile构建镜像
tag 给镜像打标签
search 搜索镜像
pull 从仓库拉取镜像
push 上传镜像到仓库
rmi 删除镜像

(1)直接拉取镜像:
docker pull busybox
docker images
docker run -it --name demo busybox
docker ps -a 
docker rm demo
docker run -it --name demo busybox   

在这里插入图片描述在这里插入图片描述
在这里插入图片描述第一种创建镜像的方式,当删掉镜像,重启镜像时,历史记录已经不存在,那么我们需要通过容器提交镜像,查看比较busybox和demo:v1可以看到demo:v1是在busybox镜像的基础上新加了一层

docker run -it --name demo busybox   
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # touch file1
/ # touch file2
/ # touch file3
/ # touch file4
/ # touch file4
/ # touch file5
/ # ls
bin    dev    etc    file1  file2  file3  file4  file5  home   proc   root   sys   
docker commit demo demo:v1  #通过容器提交
docker images demo:v1
docker history busybox:latest
docker history demo:v1

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
当删除镜像后,重启镜像会发现原来的内容仍然存在
在这里插入图片描述docker rmi demo:v1

(2)用Dockerfile构建镜像
  • dockerfile有审计功能,每新加一层镜像都会有动作审计说明
  • dockerfile不能放在根下,否则会把根下所有数据发送给docker引擎

dockerfile常用指令:

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

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

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

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

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

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

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

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

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

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

创建docker目录,在目录中建立编辑dockerfile

mkdir docker
cd docker/
vim Dockerfile
///
FROM busybox
RUN touch file1
RUN echo "hello world"
///

docker build -t demo:v1 .    #使用当前的Dockerfile,创建镜像,标签为demo:v1

docker history demo:v1   #查看指定景象的创建历史,有详细的镜像作记录

在这里插入图片描述
例如,用dockerfile文件安装nginx镜像:

lftp 172.25.254.250
cd pub/images/
> get rhel7.tar 
exit
docker load -i rhel7.tar 
cd docker/
cp /etc/yum.repos.d/dvd.repo .
lftp 172.25.254.250
/> cd pub/docs/lamp/
> get nginx-1.21.1.tar.gz
> exit

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

vim Dockerfile
///
FROM rhel7
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.21.1.tar.gz /mnt
WORKDIR "/mnt/nginx-1.21.1"
RUN rpmdb --rebuilddb
RUN yum install -y gcc pcre-devel zlib-devel
RUN ./configure --prefix=/usr/local/nginx
RUN yum install -y make
RUN make
RUN make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
///

执行命令docker build -t nginx:v1 .

docker iamges #nginx 346mb

在这里插入图片描述
在这里插入图片描述
此时nginx镜像的大小为346mb,再看一下直接pull下来的镜像
在这里插入图片描述

在这里插入图片描述在这里插入图片描述直接拉取的nginx镜像为133mb,相比之下dockerfile安装的更占内存,因此需要做镜像优化,选择最精简的基础镜像:

3.镜像的优化
docker load -i base-debian10.tar   #安装外网的镜像压缩库

在这里插入图片描述

mkdir new
cd new/

vim Dockerfile
///
FROM nginx as base

ARG Asia/Shanghai

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

CMD ["nginx", "-g", "daemon off;"]
                                       
///
docker build -t webserver:v1 . 

安装镜像到webserver仓库

此时查看镜像大小docker images #32MB

在这里插入图片描述镜像优化成功!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值