方法一:步骤运行容器
修改容器
将容器保存为新的镜像
缺点: 效率低、可重复性弱、容易出错 使用者无法对镜像进行审计,存在安全隐患
过程:
docker pull busybox
47 docker images
48 docker run -it --name demo busybox
touch file{1..6}
49 docker ps -a
50 docker rm demo
51 docker run -it --name demo busybox
新建的文件,删掉进程后,就没了
解决办法:新建文件后,退出
docker commit demo demo:v1
58 docker images
60 docker rm demo
61 docker run -it --name demo demo:v1此时ls依旧能看到原来的test
方法二:Dockerfilecd ~
mkdir dockercd docker/
vim DockerfileFROM busybox 在谁的基础上
RUN echo "hello world"
docker build -t demo:v1 .
此时如果Dockerfile 内容进行更改,不变的命令会使用缓存:镜像的缓存特性
在文件第三行加命令
执行docker build -t demo:v1 .
三:Dockerfile常用命令docker history demo:v1
查看镜像分层结构
注:这里的命令后边都用的上,就不特意做了四.镜像优化- -nginx为例 1.构建镜像FROM
指定base镜像,如果本地不存在会从远程仓库下载。RUN
在容器中运行命令并创建新的镜像层,常用于安装软件包MAINTAINER
设置镜像的作者,比如用户邮箱等COPY
把文件从build context复制到镜像
支持两种形式:COPY src dest 和 COPY [“src”, “dest”]
src必须指定build context中的文件或目录ADD
用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自
动解压到dest,也可以自动下载URL并拷贝到镜像ENV
设置环境变量,变量可以被后续的指令使用:
如:ENV HOSTNAME sevrer1.example.comEXPOSE
如果容器中运行应用服务,可以把服务端口暴露出去:EXPOSE 80
VOLUME
申明数据卷,通常指定的是应用的数据挂在点:VOLUME ["/var/www/html"]
WORKDIR
为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在会自动创建。RUN
在容器中运行命令并创建新的镜像层,常用于安装软件包:RUN yum install -y vimCMD 与 ENTRYPOINT
这两个指令都是用于设置容器启动后执行的命令,但CMD会被docker run后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。
docker run后面的参数可以传递给ENTRYPOINT指令当作参数。
Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。
实验前准备:如下图
1.导入rhel7镜像,相当于使用rhel7的内核
docker load -i /root/rhel7.tardocker images查看是否成功
2.编写Dokcerfile创建镜像 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 run -it --name demo rhel7 bash
使用rhel7镜像创建一个容器demo
docker build -t rhel7:v1 .
docker images rhel7 用于查看
docker run -d --name demo rhel7:v1
docker inspect demo查看容器信息,看到分配的ip和在真实主机上挂载的路径
2.优化镜像修改挂载路径的根目录内容,得到类似于apache的测试页面
封装好的镜像就可以正常运行了,但是查看镜像历史及列表,会发现该镜像的空间占用较大,不符合轻量化的原则,因此需要进行优化
需要: base-debian10.tar
docker load -i base-debian10.tar
mkdir cyy
cd cyyvim 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 rhel7:v2 . 再建立一个v2
docker images rhel7:v2/1 用于查看大小
可以看到大小变小了
docker rm -f demo
213 docker run -d --name demo rhel7:v2
214 docker ps
docker inspect rhel7:v2
镜像常用子命令
docker + 。。。+镜像名字或id
images 显示镜像列表
history 显示镜像构建历史
commit 从容器创建镜像
build 从Dockerfile构建镜像
tag 给镜像打标签
search 搜索镜像
pull 从仓库拉取镜像
push 上传镜像到仓库
rmi 删除镜像



