docker入门(三)自定义部署docker镜像

docker系列ddocker入门(一)安装及镜像命令_docker国内源-CSDN博客文章浏览阅读1.5k次,点赞44次,收藏12次。注意:是强依赖Linux环境,即便在windows上部署Docker其本质也都是先安装一个虚拟机,然后在虚拟出来的Linux上再安装并运行Docker。Docker Compose 是一个用于定义和运行多个 Docker 容器的工具,它使用 YAML 文件来定义整个应用程序的服务、网络和卷等,使得可以轻松地部署和扩展多个 Docker 容器。Docker 容器是 Docker 镜像的实例化运行时,它是一个分离的环境,包含了应用程序和其依赖项,能够独立运行于 Docker 主机上。这是由于环境不一致导致的。_docker国内源https://blog.csdn.net/LCL_18/article/details/142632245?spm=1001.2014.3001.5501

docker入门(二)之容器命令及私有仓库的部署(本地和harbor)_桌面docker怎么使用命令保存仓库-CSDN博客文章浏览阅读1.3k次,点赞21次,收藏10次。所以我们大致应该能明白守护进程是给需要在后台默默执行的程序。如redis,如果不添加守护进程,ctrl+c,前台进程结束,容器就停止了,显然不能接受。通过下图可以看到redis开始在正常运行在前台,假如说我要执行其他程序,然后我ctrl+c退出了一下,redis就自动退出了查看容器的状态,发现也是退出了但是添加-d后,它会直接在后台运行,不会在前台占用资源。_桌面docker怎么使用命令保存仓库https://blog.csdn.net/LCL_18/article/details/142869622?spm=1001.2014.3001.5501

基于docker commit 制作镜像

众所周知,centos 7 在2024年6月30日,生命周期结束,官方不再进行支持维护,而很多环境一时之间无法完全更新替换操作系统,因此对于yum源还是需要的。

所以我们docker pull centos:7的镜像也是无法使用yum的。

这里我们就自己制作一个含有yum的镜像。

有两种方式搭建,一种搭建本地yum,一种拉取国内开源镜像站(这里以阿里云举例)

其一:搭建本地yum

大家都知道我们使用虚拟机时必须有相应的映像文件

这里面的镜像文件一般存放在/dev/cdrom

这里我们的先将镜像挂载到一个目录,这里我先选择挂载到/media下

复制代码
[root@localhost ~]# mount /dev/cdrom /media/

mount: /dev/sr0 写保护,将以只读方式挂载

然后拉取centos:7的镜像

复制代码
[root@localhost ~]# docker pull centos:7

7: Pulling from library/centos

Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4

Status: Downloaded newer image for centos:7

docker.io/library/centos:7

这里我拉取的镜像太多了,所以我只显示cnetos:7的这行,方便观察

复制代码
centos                             7         eeb6ee3f44bd   3 years ago     204MB

使用此镜像,创建容器,并添加数据卷映射

宿主机目录必须使用挂载映像文件的目录

复制代码
[root@localhost ~]# docker run -it --privileged=true -v /media:/media/centos eeb6ee3f44bd /bin/bash

[root@197a502a5c1b /]#

这个时候宿主机media下的文件已经映射到容器/media/centos下

复制代码
[root@197a502a5c1b /]# ls /media/centos/

CentOS_BuildTag  EFI  EULA  GPL  LiveOS  Packages  RPM-GPG-KEY-CentOS-7  RPM-GPG-KEY-CentOS-Testing-7  TRANS.TBL  images  isolinux  repodata

这个时候进去修改yum本地源的配置文件

复制代码
[root@197a502a5c1b /]# cat /etc/yum.repos.d/CentOS-Media.repo

[c7-media]

name=CentOS-$releasever - Media

baseurl=file:///media/centos

gpgcheck=0

enabled=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

使网络源失效

root@197a502a5c1b ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 清除缓存,重新加载 [root@197a502a5c1b ~]# yum clean all Loaded plugins: fastestmirror, ovl Cleaning repos: c7-media Cleaning up list of fastest mirrors [root@197a502a5c1b ~]# yum repolist Loaded plugins: fastestmirror, ovl Determining fastest mirrors c7-media | 3.6 kB 00:00:00 (1/2): c7-media/group_gz | 166 kB 00:00:00 (2/2): c7-media/primary_db | 3.1 MB 00:00:00 repo id repo name status c7-media CentOS-7 - Media 3971 repolist: 3971 ### 其二:配置阿里云源 这里就接着上面继续配置 安装wget [root@197a502a5c1b ~]# yum install -y wget 把网路源名称改回来 [root@197a502a5c1b ~]# mv /etc/yum.repos.d/CentOS-Base.repo.bak /etc/yum.repos.d/CentOS-Base.repo 取网上找到阿里云开源镜像网站 [阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区](https://mirrors.aliyun.com "阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区") 使用wget把它下载到指定位置 ​ [root@197a502a5c1b ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo ​ 清除缓存,重新加载 [root@197a502a5c1b ~]# yum clean all [root@197a502a5c1b ~]# yum repolist repo id repo name status base/7/x86_64 CentOS-7 - Base - mirrors.aliyun.com 10072 c7-media CentOS-7 - Media 3971 extras/7/x86_64 CentOS-7 - Extras - mirrors.aliyun.com 526 updates/7/x86_64 CentOS-7 - Updates - mirrors.aliyun.com 6173 repolist: 20742 退出容器,把容器制成镜像 **docker commit 的参数** Options: -a, --author string Author (e.g., "John Hannibal Smith ") #表示作者名 -c, --change list Apply Dockerfile instruction to the created image # 对创建的镜像使用dockerfile命令 -m, --message string Commit message #描述信息 -p, --pause Pause container during commit (default true) #暂停容器做镜像 [root@localhost ~]# docker commit -a "xiaoluo" -m "my yum" -p 197a502a5c1b mycentos:1 sha256:9bbe687a6e89fbf654ed06d1c9c18301e370b741474b008c5447d337ff2c3ae6 查看镜像,这个镜像比我们直接拉取的镜像,大很多,为什仫呢,因为它具有配置的源,自然而然会使镜像变大 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos 1 9bbe687a6e89 39 seconds ago 479MB ### 测试 使用该镜像创建容器 [root@localhost ~]# docker run -it mycentos:1 /bin/bash [root@7cf0ea61ad7a /]# 查看仓库 [root@7cf0ea61ad7a /]# yum repolist Loaded plugins: fastestmirror, ovl Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com repo id repo name status !base/7/x86_64 CentOS-7 - Base - mirrors.aliyun.com 10072 !c7-media CentOS-7 - Media 3971 !extras/7/x86_64 CentOS-7 - Extras - mirrors.aliyun.com 526 !updates/7/x86_64 CentOS-7 - Updates - mirrors.aliyun.com 6173 repolist: 20742 ## 基于dockerfile制作镜像 **DockerFile是用来构建Docker镜像的文本文件,是一条条构建镜像所需要的指令和参数构成的脚本** > **构建步骤:** > > 1、编写DockerFile文件 > > 2、docker build 构建镜像 > **DockerFile内容基础知识** > > 1. **每条保留指令都必须为大写字母且后面要跟随至少一个参数** > 2. **指令按照从上向下,顺序执行** > 3. #**表示注释** > 4. **每个指令都会创建一个新的镜像层并且对于镜像进行提交** > **Docker执行DockerFile的大致流程** > > 1. **Docker从基础镜像运行一个容器** > 2. **每执行一条指令就会对于容器做出修改** > 3. **执行类似docker commit的操作提交一个新的镜像层** > 4. **Docker再基于刚提交的镜像运行一个新的容器** > 5. **执行DockeFile 中的下一条指令直到所有指令都执行完成** ### 指令介绍(就相当于命令) #### **FROM** 功能为指定**基础镜像** ,并且**必须是第一条指令。** 如果不以任何镜像为基础,那么写法为:FROM scratch。 同时意味着接下来所写的指令将作为镜像的第一层开始 这里简单做个废话说明: 所谓基础镜像就是指通过docker pull拉取的或者docker commit创建的镜像。再强调一下由于现在2024年10月22日,centos7从2024年6月30号已经停止维护yum源,所以我们得先去给容器配置yum源再将其打包为镜像。 格式: FROM 镜像名:版本号 版本号为可选项,没有默认为最新版本号 #### **LABLE** 原来是MAINTAINER这个根据英文意思可知,维护者不就是指定作者吗,但新版docker改为使用LABLE指明 但原本的功能为给镜像指定标签 此命令可选择性使用 **格式:** LABLE 名字 #### **ADD** 一个复制命令,把文件复制到镜像中。如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。可以进行远程连接的命令 格式: ADD 本地路径/网络路径 容器创建好后存放的位置 #### **COPY** 也是一条复制的命令就相当于linux中的cp命令,它与ADD的区别就在于COPY只能复制本地文件 格式: COPY 本地路径 容器创建好后存放的位置 #### **EXPOSE** 功能为暴漏容器运行时的监听端口给外部 EXPOSE并不会使容器访问主机的端口,但是主机可以访问到容器的端口,这是一个单方面的指向 如果想使得容器与主机的端口有映射关系,必须在容器启动(docker run)的时候加上 -p参数 格式: EXPOSE 端口号 协议类型 不指定协议,默认为tcp协议 #### **ENV** 功能为设置环境变量,同docker run -e一样,镜像定义所需的环境变量,并可被ENV指令后面的其它指令所调用。 使用docker run启动容器的时候加上 -e 的参数为定义的变量赋值,可以覆盖Dockerfile中ENV指令指定的变量 格式: #第一种格式,不建议使用,只能定义一个变量,在定义又得另起一个指令,浪费资源 ENV 变量名 本地路径/值 #第二种格式,可往后定义多个变量 ENV 变量名=本地路径/值 ...... #### **RUN** 用于指定docker build过程中运行的程序,可以是任何命令。 RUN指令后所执行的命令必须在FROM指令后的基础镜像中存在才会被执行。 一般是执行shell命令 格式: RUN shell命令 #### **CMD** 指定启动容器的默认要运行的程序,也就是PID为1的进程命令,且其运行结束后,容器也会终止。如果不指定,默认是bash。 CMD指令指定的默认程序会被docker run命令行指定的参数所覆盖。 Dockerfile中可以存在多个CMD指令,但仅最后一个生效。因为一个docker容器只能运行一个PID为1的进程。 类似于RUN指令,也可以运行任意命令或程序,但是两者的运行时间点不同 RUN指令运行在docker build的过程中,而CMD指令运行在基于新镜像启动容器(docker run)时。 格式: CMD shell命令 #### **ENTRYPOINT** 类似CMD指令的功能,用于为容器指定默认运行程序。 Dockerfile中可以存在多个ENTRYPOINT指令,但仅最后一个生效 与CMD区别在于,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且这些命令行参数会被当做参数传递给ENTRYPOINT指令指定的程序。 不过,docker run的--entrypoint选项的参数可覆盖ENTRYPOINT指定的默认程序。 格式: ENTRYPOINT shell命令 #### **USER** 用于指定docker build过程中执行任何指令所用的用户 默认情况下为root用户 格式: USER 用户名/用户id 这里的用户id是指/etc/passwd中用户的有效UID,不能随便指定,不然可能导致docker run 运行时失败 #### **HEALTHCHECK** 根据英文意思可知,为健康检查,此指令的就是告诉docker检查容器是否正常工作,因为有的时候就算进程在运行,服务也不一定能够起来 检查肯定不是一次性的,要根据频率,进行指定检查 格式: HEALTHCHECK --interval=间隔时间 --timeout=超时时间 --retries=重试次数 cmd 健康检测命令 CMD健康检测命令发出时,返回值有三种情况 0:成功 1:不健康 2:保留,无实际意义。 HEALTHCHECK NONE就是不做健康检查 #### **SHELL** 用来指定运行程序默认要使用的shell类型,一般来说不用指定 格式: SHELL shell类型 #### **STOPSLGNAL** 指定发送使容器退出的系统调用信号,docker stop之所以能停止容器,就是发送了15的信号给容器内PID为1的进程。但是一般不会使用。 格式: STOPSLGNAL 指定的信号值 #### **ARG** ARG命令同EVN类似,也是指定一个变量,但不同的是,ENV指令配合-e参数可以在docker run过程中传参,而使用ARG指令配合--build-arg参数可以在docker build过程中传参,这方便了我们为不同场景构建不同镜像。 格式: ARG 变量名=本地路径/值 ...... #### **ONBULD** 用于在Dockerfile中定义一个触发器。 ONBUILD后面指定的指令在docker build时是不会执行,构建完的镜像在被另一个Dockerfile文件中FROM指令所引用的时才会触发执行。 除了FROM指令和MAINTAINER指令不能成为触发器指令,其他均可以,一般多为RUN和ADD 格式: ONBULD 其他指令 ### 实例构建nginx镜像 创建一个文件夹,用于存放Dockerfile文件 [root@localhost ~]# mkdir /nginx 在该目录下编辑一个安装nginx的脚本 [root@localhost nginx]# vi install.sh yum install -y wget tar gcc gcc-c++ make pcre pcre-devel zlib zlib-devel cd /usr/local/src wget 'http://nginx.org/download/nginx-1.14.2.tar.gz' tar -zxf nginx-1.14.2.tar.gz cd nginx-1.14.2 ./configure --prefix=/usr/local/nginx && make && make install rm -rf /usr/local/src/* 在编辑一个启动脚本 [root@localhost nginx]# vi nginx_start.sh #!/bin/bash /usr/local/nginx/sbin/nginx -g "daemon off;" 在编辑一个Dockerfile文件 [root@localhost nginx]# vi Dockerfile # 使用的是前面是前面docker commit 创建的镜像 FROM mycentos:1 COPY install.sh /tmp/install.sh RUN sh /tmp/install.sh COPY nginx_start.sh /usr/bin/nginx_start.sh > **docker build的参数** > > **-f --file** > > 指定 dockerfile 路径 > > 不指定的话,默认会读取上下文路径( . )下的 dockerfile > > **-t,--tag** > > 指定构建的镜像名和 tag > > **--add-host** > > 可以使用一个或多个 --add-host 标志将其他主机添加到容器的 /etc/hosts 文件中 > > **--network** > > 在构建过程中为 RUN 指令设置网络模式 创建mycentos:nginx这个镜像,根据当前所在位置决定写路径,如果Dockerfile文件就在当前目录下,就可以写 ./ [root@localhost nginx]# docker build -t mycentos:nginx ./ 查看镜像 [root@localhost nginx]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos nginx 15ef5a937045 19 seconds ago 856MB 使用该镜像启动容器,看看是否启动了nginx服务 [root@localhost nginx]# docker run -itd --name=mynginx mycentos:nginx c6ed62b2b1fc6e5a018683b678c9026c7ebe85e3c62f44a7227cc0a74e98caeb 查看容器 [root@localhost nginx]# docker run -itd --name mynginx mycentos:nginx 70e6515c92df549ab0398b4d8a981292b7d98723684aefff3775a5a4c3682d88 [root@localhost nginx]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 70e6515c92df mycentos:nginx "/bin/bash" 9 seconds ago Up 8 seconds mynginx 进入该容器 [root@localhost nginx]# docker exec -it mynginx /bin/bash 启动nginx [root@70e6515c92df /]# cd /usr/local/nginx/ [root@70e6515c92df nginx]# ls client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp [root@70e6515c92df nginx]# cd sbin [root@70e6515c92df sbin]# ls nginx [root@70e6515c92df sbin]# ./nginx 查看是否开启80端口 [root@70e6515c92df ~]# netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 37/nginx: master pr **最后希望大家都能变得越来越好!!!** ![](https://i-blog.csdnimg.cn/direct/9458593cf65446189f3f8101f44978b0.png)

相关推荐
waving-black18 分钟前
利用frp和腾讯云服务器将内网暴露至外网(内网穿透)
linux·服务器·腾讯云·frp·内网穿透
stormsha30 分钟前
Linux中su与sudo命令的区别:权限管理的关键差异解析
linux·运维·服务器·鸿蒙系统·ux·batch命令
新加坡内哥谈技术1 小时前
Meta计划借助AI实现广告创作全自动化
运维·人工智能·自动化
zyjyyds1131 小时前
win11系统 Docker Desktop 突然提示Docker Engine stopped解决情况之一
运维·docker·容器
Altairr1 小时前
Docker基础(一)
运维·docker·容器·eureka
搬运Gong1 小时前
Dockerfile使用与最佳实践
docker·容器·虚悬镜像
筏.k1 小时前
grep、wc 与管道符快速上手指南
linux
文牧之1 小时前
PostgreSQL 的扩展pageinspect
运维·数据库·postgresql
Johny_Zhao2 小时前
华为MAAS、阿里云PAI、亚马逊AWS SageMaker、微软Azure ML各大模型深度分析对比
linux·人工智能·ai·信息安全·云计算·系统运维
CodeOfCC2 小时前
c语言 封装跨平台线程头文件
linux·c语言·windows