当前位置: 首页 > article >正文

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

基于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镜像站-阿里云开发者社区

使用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 <hannibal@a-team.com>")

#表示作者名

  -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

最后希望大家都能变得越来越好!!!


http://www.kler.cn/news/368182.html

相关文章:

  • 【vue+leaflet】自定义控件(五)
  • 计算机毕业设计 | springboot+vue凌云在线阅读平台 线上读书系统(附源码)
  • Stable Diffusion视频插件Ebsynth Utility使用方法
  • 若依部署上线遇到的问题
  • 如何理解前端与后端开发
  • Rust 力扣 - 1. 两数相加
  • Vuetify3响应式布局
  • c#时间对象(时间间隔)相关计算
  • 【已解决】edge浏览器会保存历史验证码?新版Edge如何关闭自动填充表单功能?
  • JMeter实战之——模拟登录
  • js实现数据版购物车(实现购物车所有功能)
  • CSS基础—网页布局(重点!)
  • JavaWeb合集18-接口管理Swager
  • YOLOv5/v8/v10/v11详细介绍:网络结构,创新点
  • 升级Unity后产生的Objects内存泄露现象
  • 面试总结(2024/10/16)
  • ubuntu 硬盘扩容
  • python对文件的读写操作
  • 快速入门HTML
  • 影刀RPA实战:验证码识别功能指令
  • 华为手机卡住了怎么办?,快来试试布局性能优化,让你的手机发挥极致性能!!!
  • Linux TCP CC状态机
  • 渗透测试-SQL注入基础知识
  • 游戏提示x3daudio17.dll丢失怎么办? X3DAudio17.dll修复方法
  • C#从零开始学习(接口,强制转化和is)(7)
  • python之多任务爬虫——线程、进程、协程的介绍与使用(16)