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

使用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的大致流程

  5. Docker从基础镜像运行一个容器

  6. 每执行一条指令就会对于容器做出修改

  7. 执行类似docker commit的操作提交一个新的镜像层

  8. Docker再基于刚提交的镜像运行一个新的容器

  9. 执行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

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

相关推荐
bitcsljl7 分钟前
Linux 命令行快捷键
linux·运维·服务器
ac.char9 分钟前
在 Ubuntu 下使用 Tauri 打包 EXE 应用
linux·运维·ubuntu
Cachel wood29 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Youkiup37 分钟前
【linux 常用命令】
linux·运维·服务器
qq_2975046140 分钟前
【解决】Linux更新系统内核后Nvidia-smi has failed...
linux·运维·服务器
_oP_i1 小时前
.NET Core 项目配置到 Jenkins
运维·jenkins·.netcore
weixin_437398211 小时前
Linux扩展——shell编程
linux·运维·服务器·bash
小燚~1 小时前
ubuntu开机进入initramfs状态
linux·运维·ubuntu
年薪丰厚1 小时前
如何在K8S集群中查看和操作Pod内的文件?
docker·云原生·容器·kubernetes·k8s·container
小林熬夜学编程1 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http