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)

相关推荐
liqingdi43736 分钟前
WSL+Ubuntu+miniconda环境配置
linux·windows·ubuntu
luoqice38 分钟前
通过 Samba 服务实现 Ubuntu 和 Windows 之间互传文件
linux
try2find3 小时前
llama-webui docker实现界面部署
docker·容器·llama
知远同学3 小时前
docker学习笔记2-最佳实践
运维·docker·容器
哈哈幸运5 小时前
MySQL运维三部曲初级篇:从零开始打造稳定高效的数据库环境
linux·运维·数据库·mysql·性能优化
soulermax5 小时前
数字ic后端设计从入门到精通2(含fusion compiler, tcl教学)
java·linux·服务器
黑心老人5 小时前
Mac OS系统下kernel_task占用大量CPU资源导致系统卡顿
linux·运维·服务器·macos
光算科技5 小时前
服务器在国外国内用户访问慢会影响谷歌排名吗?
运维·服务器·c++
Zenexus5 小时前
Linux学习笔记协议篇(六):SPI FLASH设备驱动
linux·笔记·arm
口嗨农民工5 小时前
ubuntu18.04启动不了修复
linux·运维·ubuntu