docker 怎么封装镜像

拥有镜像的三种方式

  1. 官网hub.docker.com提供的docker pull 镜像

一般情况下官网能提供的服务基本已经满足了我们日常所需
在这里插入图片描述在这里插入图片描述

自动会到官网仓库下载镜像,不指定tag版本,默认就是最新的

  1. docker commit 命令(类似ghost系统)

类似自己打包了一个容器,这个需求常见公司内部服务的部署安装

  • 首先是基于基础镜像系统上运行的容器,可以是centos、ubuntu等等
  • 根据需求部署好服务后进行封装成的镜像,命令就是docker commit
  • 基于镜像的系统会有三个权限上问题,一个是用户权限、一个是服务权限、一个是资源权限

举例:

我选择的是centos7.6.1810安装一个http服务,然后进行封装

启动一个centos容器

docker run -d -p 5000:80 --privileged=true centos:centos7.6.1810 /usr/sbin/init

#--privileged=true(用户权限)
#/usr/sbin/init(服务权限)
#可以看我之前写的docker的三个权限问题

额外话题:启动一个基础系统,如果没有加/usr/sbin/init,是需要加-it参数,不然容器会自动关闭

docker容器是以一个进程的形式启动在系统上,而基础系统默认最后是/bin/bash,系统下是没有任何进程启动的,也就是默认容器没有运行任何服务,容器的启动停止都会检测到PID为1的进程,加上it参数模拟一个交互式终端等待用户输入,进程PID1停止容器也就跟着停止
在这里插入图片描述

封装镜像

进入容器系统,安装服务

docker exec -it xxxxx /bin/bash
#xxxxx为容器ID号,docker ps -a查看
yum install httpd -y
systemctl start httpd
systemctl enable httpd

访问默认测试也成功
在这里插入图片描述

docker commit 封装

docker commit xxxxx my_httpd
#xxxxx为容器ID号
#my_httpd为镜像名称

在这里插入图片描述查看封装好的镜像系统
在这里插入图片描述查看docker分层结构,加了一层,大小为144M(还安装了net-tools)
在这里插入图片描述总结:可以看出这样方式就能完成一个镜像,但是有一个问题就是这个镜像系统分层无法判别安装了具体服务是什么,要是安装了病毒或者其他不需要的服务,系统不就是变的不安全了,这个时候就需要透明的模式就是Dockerfile

Dockerfile 构建文件

由于Dockerfile是基于透明的,所以就需要定义各种参数来指定具体每一步的操作

  • FROM
    指定 base 镜像
FROM centos:centos7.6.1810
#根据需求选择系统:版本
  • MAINTAINER
    镜像维护者(地址或人名都可以)
MAINTAINER Y-S-H

  • COPY
    拷贝文件或目录到镜像中
COPY 源目录  容器目录
COPY test /root/
  • ADD
    拷贝文件或目录到镜像中,跟COPY不同之处就是,如果是压缩包,会自动下载或自动解压
COPY 源目录  容器目录
ADD /root/httpd.tar.gz /var/www/html
ADD https://xxx.com/httpd.tar.gz /var/www/html
  • ENV
    设置环境变量
    1、可以用于dockerfile构建内使用,使用以$xxxx
    2、docker run -e 覆盖使用,从而修改变量值
ENV name1=ping name2=on_ip
CMD $name1 $name2
  • EXPOSE
    暴露服务运行的端口号
EXPOSE 80
  • VOLUME
    将文件或目录声明为 volume数据持久化,一般还是在run启动容器中指定 -v(

好处为了防止使用者忘记使用参数启动容器从而导致容器变得很大(jenkins就是默认添加了,因为插件会非常的大)

在这里插入图片描述

VOLUME /var/www/html
#默认存储位置/var/lib/docker/volumes/xxxxx
#具体的ID号可以通过docker inspect c809bdc2787e(容器ID)

在这里插入图片描述

  • WORKDIR
    为RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录
WORKDIR /test
#cd /test
#就是cd命令的作用
  • RUN
    构建镜像时运行的Shell命令
RUN yum install httpd -y
  • CMD
    启动容器时执行的Shell命令,docker run -it [image] 默认最后不加参数就运行CMD

对于系统来说一个容器就是一个进程,那么在启动容器的时候,需要指定所运行的程序及参数,CMD为默认参数,一般都是运行服务或者脚本

CMD /usr/sbin/httpd -D FOREGROUND
#启动httpd服务

重点:为什么需要 -D FOREGROUND

前面说了容器是以进程形式存在,而容器的状态是同容器里PID为1的进程同步的,/usr/sbin/httpd默认是以守护进程的方式启动web服务器,也就不会是PID为1进程存在,不加 -D FOREGROUND现象就是docker永远无法UP
在这里插入图片描述

  • ENTRYPOINT
    作用和CMD一样,不同之处就是命令一定会被执行,不会被覆盖

当指定了ENTRYPOINT后,CMD的含义就发生了改变,不再是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令,ENTRYPOINT CMD

  1. 不会被docker run命令行指定的参数所覆盖
  2. 命令行参数会被当作参数传递给ENTRYPOINT指定的程序

好处就是CMD命令可以变成一个变量进行传参,便于程序的扩展
详细参考:https://www.cnblogs.com/reachos/p/8609025.html

推荐阅读CloudMan编写的docker容器学习,便于深刻理解

RUN vs CMD vs ENTRYPOINT

#重点:
1.ADD拷贝的文件必须在构建文件目录下
2.构建文件名词默认为:Dockerfile(可以通过-f指定)
3.CMD xxx,不带中括号,docker执行命令在login shell,也可以写成CMD [“bin/bash”,”-c”,”/usr/local/bin/checkout.sh”],但是建议ENTRYPOINT和CMD配合使用

举例:

编写dockerfile文件

vi Dockerfile

FROM centos:centos7.6.1810
MAINTAINER Y-S-H
COPY test.txt /root/
VOLUME /var/www/html
RUN yum install httpd -y && echo 'ServerName  localhost:80'>>/etc/httpd/conf/httpd.conf
EXPOSE 80
CMD /usr/sbin/httpd -D FOREGROUND

通过file文件构建镜像

docker build -t http_dockerfile .
#http_dockerfile 为镜像名
#最有有一个点,说明dockerfile文件在当前目录下

启动容器

docker run  -itd -p 22222:80 http_dockerfile

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

如果遇到容器启动失败,可以尝试不要加d,这样便于交互式查看具体是哪个步骤导致的错误,也会有相关错误提示,方便解决

实现一个docker封装postgresql集群镜像可以按照以下步骤进行: 1. 安装Docker,如果已经安装Docker可以跳过这一步。 2. 下载postgresql镜像,可以使用以下命令: ``` docker pull postgres ``` 3. 创建docker-compose.yml文件,可以使用以下代码: ``` version: "3" services: db1: image: postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: mydatabase volumes: - ./data/db1:/var/lib/postgresql/data ports: - "5432:5432" db2: image: postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: mydatabase volumes: - ./data/db2:/var/lib/postgresql/data ports: - "5433:5432" db3: image: postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: mydatabase volumes: - ./data/db3:/var/lib/postgresql/data ports: - "5434:5432" ``` 上述代码中,我们创建了三个postgresql容器,并将它们绑定到不同的端口。同时,我们还定义了数据库的用户名、密码和数据库名称,并将数据保存在本地目录的data文件夹中。 4. 运行docker-compose.yml文件,可以使用以下命令: ``` docker-compose up -d ``` 上述命令将启动三个postgresql容器,并将它们绑定到不同的端口。 5. 验证postgresql集群是否正常工作,可以使用以下命令: ``` docker-compose ps ``` 上述命令将显示三个postgresql容器的状态,如果状态为“Up”,则表示集群正常工作。 以上就是一个基本的docker封装postgresql集群镜像的步骤,可以根据实际需要进行修改和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值