docker镜像制作和管理

一、制作镜像方式

Docker 镜像制作类似于虚拟机的镜像(模版)制作,即按照公司的实际业务需求将需要安装的软件、相关配置等基础环境配置完成,然后将其做成镜像,最后再批量从镜像批量生成容器实例,这样可以极大的简化相同环境的部署工作.

Docker的镜像制作分为手动制作(基于容器)和自动制作(基于DockerFile),企业通常都是基于Dockerfile制作镜像

总结:

  1. 下载官方或者别人制作好的 镜像进行修改

  2. 利用dockerfile 生成自己的镜像

docker commit #通过修改现有容器,将之手动构建为镜像
docker build  #通过Dockerfile文件,批量构建为镜像

二、将现有容器通过docker commit手动构建镜像

1.基于容器手动制作镜像步骤

docker commit 格式

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

# REPOSITORY  软件名
# TAG         版本号

#选项  OPTIONS
-a, --author string     Author (e.g., "John Hannibal Smith <hannibal@ateam.com>")
-c, --change list       Apply Dockerfile instruction to the created image
-m, --message string    Commit message
-p, --pause             Pause container during commit (default true)


#说明:
制作镜像和CONTAINER状态无关,停止状态也可以制作镜像
如果没有指定[REPOSITORY[:TAG]],REPOSITORY和TAG都为<none>
提交的时候标记TAG号: 生产当中常用,后期可以根据TAG标记创建不同版本的镜像以及创建不同版本的容器

基于容器手动制作镜像步骤具体如下

  1. 下载一个系统的官方基础镜像,如: CentOS 或 Ubuntu

  2. 基于基础镜像启动一个容器,并进入到容器

  3. 在容器里面做配置操作

    • 安装基础命令

    • 配置运行环境

    • 安装服务和配置服务

    • 放业务程序代码

  4. 提交为一个新镜像 docker commit

  5. 基于自己的的镜像创建容器并测试访问

2.实战案例:基于 busybox 制作httpd镜像

docker run -it --name b1  busybox
#启动  busybox 容器
/ # hostname   -i
/ # httpd --help                                 进入容器查看  httpd 的帮助
/ # mkdir /data/html -p                          新建主站点目录
/ # echo testpage  > /data/html/index.html       新建站点目录
/ # httpd -f  -h  /data/html/                   -f 前台启动  -h 指定主站点

docker commit -a "hx" -c 'CMD /bin/httpd -fv -h /data/html' -c "EXPOSE 80" b1 httpd-busybox:v1.0
#  -a 作者     -c 执行的命令   -c 暴露端口    b1 镜像 打上标签

 启动制作好的容器

docker run -d --rm --name web1 -P httpd-busybox:v1.0

2.实战案例: 基于官方镜像生成的容器制作tomca镜像

下载启动tomcat 容器

docker run -d -p 8080:8080 tomcat 
#下载启动 tomcat  容器

 修改容器

docker ps -a
#  先查看的  id

docker exec -it af bash
# 进入容器

cp -a webapps.dist/* webapps/
#复制页面文件

 打包成镜像

docker commit -m "add webapps app" -a "hx" af9b84262c6f  tomcat:0731

 启动镜像

docker run -d --name t1  -p 8081:8080 tomcat:0731

3.实战案例:基于CentOS的基础镜像利用yum 安装手动制作nginx的镜像

启动容器

docker run -it --name c1 centos:latest bash
cat /etc/redhat-release

 修正时区 yum 源

ls -l /etc/localtime
rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

wget http://mirrors.aliyun.com/repo/Centos-8.repo
#在宿主机中下载 yum 文件

docker cp Centos-8.repo 086642a4647b:/
#使用  docker  cp  命令将文件拷贝进 容器 

#修改yum源
cd /etc/yum.repos.d/
rm -rf *
cd /
mv Centos-8.repo /etc/yum.repos.d/
yum install wget -y
#进入容器测试

 安装nginx, 修改配置文件

yum install  nginx  net-tools

vi /etc/nginx/nginx.conf
daemon off;
#前台执行

#生成页面
echo "nginx page in docker"  > /usr/share/nginx/html/index.html

 打包成镜像

docker commit -a 'hx'  -m 'yum nginx' -c "EXPOSE 80 443"  c1  centos:nginx-v1 nginx

三、利用DockerFile文件执行docker build自动构建镜像

1.Dockerfile 操作指令

常用的操作指令

常用指令含义
FROM 指定基础镜像(是Dockerfile的第一行指令)
MAINTAINER 指定镜像维护人信息(可选)
RUN 指定Linux命令,如果要执行连续多条命令时建议用 ; 或 && 或 <<EOF 串起来使用
EXPOSE 指定容器应用的端口
ENV 设置镜像的环境变量
ADD/COPY 复制文件/目录到镜像里
VOLUME 指定容器的匿名数据卷
USER 指定容器的运行用户
WORKDIR 指定后续镜像层的工作目录
ARG 指定构建镜像时传入的参数变量,docker build --build-arg 变量=值
CMD/ENTRYPOINT 指定容器启动时执行的命令

CMD和ENTRYPOINT的区别

共同点:都可以用来指定容器启动命令。

区别:ENTRYPOINT指定的容器启动命令优先级更高。

如果CMD和ENTRYPOINT同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的容器启动命令的选项或参数使用。

容器启动时运行的命令优先级
docker run --entrypoint=“命令” > 镜像里的ENTRYPOINT指定的命令 > docker run … 镜像 命令 > 镜像里的CMD指定的命令

ADD和COPY的区别

共同点:都可以将本地的文件/目录复制到镜像里。

区别:ADD还可以通过URL下载文件复制到镜像里,还能将本地的压缩包解压后复制到镜像里。

URL下载和压缩包解压特性不能同时使用

2.基于Dockerfile构建镜像的步骤

在编写 Dockerfile 时,有严格的格式需要遵循

1)第一行 用FROM指令指明所用的基础镜像;

2)之后用MAINTAINER指令说明维护镜像的用户信息;

3)然后用镜像操作相关指令,比如RUN EXPOSE ENV ADD COPY 等指令,编写构建镜像的过程。每运行一条指令,都会给基础镜像添加新的一层;

4)结尾使用CMD/ENTRYPOINT指令指定容器启动时执行的命令;

5)最后使用docker build -t 新镜像名:标签 . [-f Dockerfile文件路径]命令构建镜像。

3.基于Dockerfile创建镜像应用实例

Step1 建立工作目录

mkdir  /opt/apache
cd  /opt/apache

Step2 创建并编写Dockerfile文件

vim Dockerfile

#基于的基础镜像
FROM centos:7
#维护镜像的用户信息
MAINTAINER this is apache image <hmj>

#更换镜像
RUN rm -rf /etc/yum.repos.d
ADD qh.repo /etc/yum.repos.d/

#镜像操作指令安装apache软件
RUN yum -y install httpd
#开启 80 端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html

##方法一
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]

##方法二
ENTRYPOINT [ "/usr/sbin/apachectl" ]
CMD ["-D", "FOREGROUND"]

Step3 编写执行脚本

vim  run.sh

rm -rf /run/httpd/*                            #清理httpd的缓存
/usr/sbin/apachectl -D FOREGROUND            #指定为前台运行

#因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。

Step4 创建测试页面

echo "this is test web from hx " > index.html
ls

Step5 使用Dockerfile生成镜像

docker build -t httpd:centos .           
#注意别忘了末尾有"."

Step6 使用新的镜像运行容器并测试

 1.使用新镜像运行容器

docker run -it -d --rm -p 8888:80 httpd:centos2
docker ps -a 

 2.测试

四、如何去缩小构建镜像的大小?

1)尽可能的采用小体积的基础镜像

2)尽可能的减少Dockerfile指令的数量

3)在RUN指令里添加安装软件后清空yum/apt缓存、软件包的命令

4)使用多级(多阶段)构建的方法 

FROM 第一阶段的基础镜像 AS 别名
......
FROM 第二阶段的基础镜像
COPY --from=别名  第一阶段构建的文件/目录  当前阶段的路径
 .....
CMD/ENTRYPOINT 指定容器启动时执行的命令

 

posted @ 2024-08-01 16:56  hx_ky36  阅读(1)  评论(0编辑  收藏  举报