目录
v2版本镜像:减少镜像层数,合并所有RUN指令,清理镜像构建的中间产物包括编译好的安装包和缓存/mnt/nginx-1.20.2
Docker简介
Docker是管理容器的引擎,为应用打包、部署平台,而非单纯的虚拟化技术。容器不需要提前封装虚拟机,它共享宿主机,可以理解为宿主机上的一个进程。
对于开发人员:一次构建可以在任何地方运行;
对于运维人员:一次配置可以运行任何东西。
容器仍属于C/S结构,由镜像创建,本地有镜像直接创建,本地无镜像从官方软件仓库下载。
一、Docker安装及简单使用
(1)新建虚拟机test1
(2)配置docker软件源(使用阿里巴巴镜像站)
cd /etc/yum.repos.d/
curl https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o docker-ce.repo
vim docker-ce.repo
修改内容如下
查看
(3)设置依赖包安装源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
vim CentOS-Base.repo
修改内容如下
(4)安装并启动docker-ce(社区版本),激活参数值为1
yum install docker-ce.x86_64 -y
systemctl enable --now docker
cd /etc/docker
docker info
此时可看到两条warning
参数值此时为0,需设置为1
sysctl -a | grep bridge-nf-call-iptables
vim /etc/sysctl.d/docker.conf
设置内容如下
sysctl --system ##刷新内核文件,读取添加的文件
(5) 在docker中搜索并拉取2048游戏,指定容器端口并运行(-d打入后台),此时在浏览器输入test1的IP可以进入到2048游戏界面
docker search yakexi007
docker pull yakexi007/game2048
docker run -d --name demo -p 80:80 yakexi007/game2048
(6) 结束当前运行的容器
docker ps ##显示当前正在运行的容器
docker rm -f demo #强制删除正在运行的容器
docker ps -a ##显示所有状态的容器
二、Docker镜像的构建
镜像的分层结构:base image提供了根文件系统,所有容器数据都分类存放在/var/lib/docker目录中,可以共享资源,减少网络带宽资源占用
1.构建方法一(手动添加镜像)
(1)搜索并拉取busybox镜像
docker search busybox
docker pull busybox
docker images
(2)运行busybox
docker run -it --name demo busybox ##拉起容器busybox,-i表示交互式,-t表示打开伪终端
(3)在busybox中新建3个文件
(4)ctrl+P+Q将进程打入后台继续运行
ctrl+d或exit退出并关闭运行的交互式容器,ctrl+P+Q可将运行的交互式容器打入后台
(5)将demo容器提交保存为demo:v1新的镜像,查看比较busybox和demo:v1可以看到demo:v1是在busybox镜像的基础上新加了一层
docker commit demo demo:v1 ##将demo容器提交保存为新镜像demo:v1
docker history demo:v1 ##查看demo:v1的分层结构
docker history busybox ##查看busybox的分层结构
(6)删除demo:v1镜像,查看busybox可以看到busybox镜像无变化,仍为原来的两层
docker rmi demo:v1 ##删除demo:v1镜像
docker history demo:v1
docker history busybox
对比层级结构查看可发现,手动添加的镜像没有解释每一层的作用
解决方法:Dockerfile文件方式导入镜像v2,history可以查看具体内容,容器用busybox(见构建方法2)
2.构建方法二(Dockerfile文件方式导入镜像)
- dockerfile有审计功能,每新加一层镜像都会有动作审计说明
- dockerfile不能放在根下,否则会把根下所有数据发送给docker引擎
(1)创建docker目录,在目录中建立编辑dockerfile
mkdir docker
cd docker/
vim Dockerfile
编辑Dockerfile如下
(2)使用dockerfile创建一个demo:v2新的镜像
(3)运行容器demo:v2,可看到file123已经创建
(4)查看镜像的分层结构,此时可以看到层级操作的具体操作解释
docker history demo:v2
三、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"] #输出会覆盖
四、镜像封装及优化
1.Docker封装centos+nginx镜像实例
(1)拉取centos镜像,相当于使用centos的内核
docker pull centos
可看到centos镜像大小为231MB
(2)编写Dockerfile创建镜像
cd /docker/
vim Dockerfile
FROM centos ##镜像来源
RUN rm -f /etc/yum.repos.d/*.repo ##删除原yum源
COPY CentOS-Base.repo /etc/yum.repos.d/ ##从当前目录下拷贝新yum源到镜像中
RUN yum install -y gcc pcre-devel openssl-devel make ##安装依赖包,编译器等
ADD nginx-1.20.2.tar.gz /mnt ##将nginx解压到镜像中的mnt下
WORKDIR /mnt/nginx-1.20.2 ##进入mnt目录
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc ##将debug注释掉
RUN ./configure --with-http_ssl_module
RUN make
RUN make install ##编译及安装
EXPOSE 80 ##镜像使用80端口
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
其中yum源使用的是阿里云
(3)通过Dockerfile建立镜像v1,执行命令创建镜像webserver:v1
docker build -t webserver:v1 .
(4)拉起容器并设置进程名为demo
docker run -d --name demo webserver:v1
(5)查看demo进程/容器信息
docker inspect demo
可看到分配给nginx的ip地址
测试访问可访问到nginx主页
2.镜像优化
主要优化途径包括:
- 清理镜像构建的中间产物
- 选择最精简的基础镜像
- 减少镜像的层数
- 尽量去用构建缓存
- 使用多阶段构建镜像
- 注意优化网络请求
v2版本镜像:减少镜像层数,合并所有RUN指令,清理镜像构建的中间产物包括编译好的安装包和缓存/mnt/nginx-1.20.2
(1)修改Dockerfile
vim Dockerfile
(2)建立镜像v2,执行命令创建镜像webserver:v2
docker build -t webserver:v2 .
(3)查看镜像大小
可看到v2版本比v1版本仅小了1M
v3版本镜像:使用多阶段构建镜像
(1)修改Dockerfile
vim Dockerfile
(2) 建立镜像v3,执行命令创建镜像webserver:v3
docker build -t webserver:v3 .
(3)查看镜像大小
可看到v3版本的镜像大小仅为232M
v4版本镜像:选择最精简的基础镜像替换原有的centos
(1)上传base-debian10压缩包,为其创建镜像
(2)修改Dockerfile
(3)由于使用的是1.18版本的nginx,故还需执行命令
docker pull nginx:1.18
拉取1.18版本的nginx镜像,执行结果如下
(4)建立镜像v2,执行命令创建镜像webserver:v2
docker build -t webserver:v4 .
(5)查看镜像大小
可看到v4版本镜像大小仅为31.7MB
(6)拉起容器并设置进程名为demo
docker run -d --name demo webserver:v4
(7) 查看demo进程/容器信息
docker inspect demo
可看到分配给nginx的ip地址
测试访问可访问到nginx主页