docker镜像制作和管理
Docker 镜像制作类似于虚拟机的镜像(模版)制作,即按照公司的实际业务需求将需要安装的软件、相关配置等基础环境配置完成,然后将其做成镜像,最后再批量从镜像批量生成容器实例,这样可以极大的简化相同环境的部署工作.
Docker的镜像制作分为手动制作(基于容器)和自动制作(基于DockerFile),企业通常都是基于Dockerfile制作镜像
总结:
-
下载官方或者别人制作好的 镜像进行修改
-
利用dockerfile 生成自己的镜像
docker commit #通过修改现有容器,将之手动构建为镜像
docker build #通过Dockerfile文件,批量构建为镜像
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标记创建不同版本的镜像以及创建不同版本的容器
基于容器手动制作镜像步骤具体如下
-
下载一个系统的官方基础镜像,如: CentOS 或 Ubuntu
-
基于基础镜像启动一个容器,并进入到容器
-
在容器里面做配置操作
-
安装基础命令
-
配置运行环境
-
安装服务和配置服务
-
放业务程序代码
-
-
提交为一个新镜像 docker commit
-
基于自己的的镜像创建容器并测试访问
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
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
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
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 指定容器启动时执行的命令