一篇文章弄懂Docker镜像的制作、上传、拉取和部署

目录
  • 一、镜像(images)
    • 1. 什么是镜像?
    • 2. 镜像的组成和用途
      • (1)Dockerfile
      • (2)scratch
      • (3)一个完整的操作系统需要:
    • 3. 为什么要自己制作镜像?
  • 二、镜像制作的步骤(10步法)
    • 第1步:编辑Dockerfile
    • 第2步:编辑requirements.txt文件
    • 第3步:编辑app.py文件,我们的程序文件
    • 第4步:生成镜像文件
    • 第5步:检查镜像是否成功
    • 第6步:使用镜像,启动容器
    • 第7步:访问容器的web服务
    • 第8步:启动redis容器
    • 第9步:再次启动一个自己制作镜像的容器,链接到redis容器
    • 第10步:访问容器的web服务
  • 三. 镜像制作的作业
    • 作业
    • 作业步骤:
  • 总结

一、镜像(images)

1. 什么是镜像?

(1)按照百度百科的解释:镜像(Mirroring)是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。

(2)可以把许多文件做成一个镜像文件,与GHOST等程序放在一个盘里用GHOST等软件打开后,又恢复成许多文件,RAID 1和RAID 10使用的就是镜像。

(3)常见的镜像文件格式有ISO、BIN、IMG、TAO、DAO、CIF、FCD。

看完之后是不是更晕了?

其实简单来说,镜像就是是一个app的封装,里面有程序代码,基础系统,依赖库,工具。
再通俗地讲,有点类似APP 的安装包。

2. 镜像的组成和用途

(1)Dockerfile

: 是制作镜像的文件的配方

就像一种祖传秘方: 云南白药: 林芝,人参,鹿茸,三七等

(2)scratch

: 是最基础的docker镜像,相当于一个地基—》空白的镜像,什么都没有 --》白手起家

用别的镜像做基础镜像: 其他镜像可以之为基础进行扩展–就像站在巨人的肩膀上。

但是我们需要,万丈高楼平地起,一步一个脚印👣去制作镜像

(3)一个完整的操作系统需要:

1.kernel
2.系统调用
3.应用程序、库
4.shell等

bootfs --》容器启动的时候需要的内容

rootfs --》容器内部的操作系统

docker save

docker export

原理:

容器启动的时候,内核启动bootfs后直接将基础镜像加载,然后一层一层的加载–》自下而上

容器运行后访问文件的时候,从上而下,从可写层,一层一层往下访问。

3. 为什么要自己制作镜像?

以前在Linux 中下载mysql,Centos 系统中需要使用yum 命令,在学习完doker技术以后,需要什么软件,只需要在docker 上面pull 就可以得到,docker 就像是一个巨大的资源库,只有你想不到的东西,没有它没有的东西。

有些同学说:是技术限制了我对 docker 的想象,流下了悔恨的泪水。

哪有些同学就说了,那既然docker 这么方便,上面有那么多的镜像文件,为什么还需要我们自己去制作呢?需要啥 pull 啥不就可以了嘛?

但是,在公司中往往需要自己制作镜像文件,因为别人制作的东西往往会不放心,或者某些特定的需求不能满足。就像你去买茅台酒,商家说这是十年的茅台,你就信他?这就是十年的茅台?不去鉴定一下?如果是土豪,就当我没说,哈哈啊哈

二、镜像制作的步骤(10步法)

第1步:编辑Dockerfile

[root@sc-docker-server ~]# mkdir /mydocker/
[root@sc-docker-server ~]# cd /mydocker/
[root@sc-docker-server mydocker]#

[root@sc-docker-server mydocker]# vim Dockerfile
FROM python:2.7-slim
WORKDIR /app
ADD . /app
RUN pip install --trusted-host  pypi.python.org -r requirements.txt
EXPOSE 80
ENV NAME World
ENV AUTHOR cali
CMD ["python","app.py"]

第2步:编辑requirements.txt文件

[root@sc-docker-server mydocker]# vim requirements.txt
Flask
Redis

第3步:编辑app.py文件,我们的程序文件

[root@sc-docker-server mydocker]# vim app.py
from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

第4步:生成镜像文件

[root@sc-docker-server mydocker]#docker build -t sc_friendlyhello_1 .
docker build -t sc_friendlyhello_1 .
Sending build context to Docker daemon  4.608kB
Step 1/9 : FROM python:2.7-slim
 ---> eeb27ee6b893
Step 2/9 : WORKDIR /app
 ---> Using cache
 ---> 81aa71984f63
Step 3/9 : ADD . /app
 ---> Using cache
 ---> a5c7c6ed471c
Step 4/9 : VOLUME ["/data_flask"]
 ---> Using cache
 ---> d4db66a741db
Step 5/9 : RUN pip install --trusted-host  pypi.python.org -r requirements.txt
 ---> Using cache
 ---> bcdee009e5f7
Step 6/9 : EXPOSE 80
 ---> Using cache
 ---> 475474ce55ff
Step 7/9 : ENV NAME World
 ---> Using cache
 ---> 0f03ead6c99b
Step 8/9 : ENV AUTHOR cali
 ---> Using cache
 ---> f844eb0f1a78
Step 9/9 : CMD ["python","app.py"]
 ---> Using cache
 ---> ab30484b56b8
Successfully built ab30484b56b8
Successfully tagged sc_friendlyhello_1:latest
[root@sc-docker-server mydocker]#

第5步:检查镜像是否成功

[root@sc-docker-server mydocker]# docker images
REPOSITORY                 TAG        IMAGE ID       CREATED          SIZE
sc_friendlyhello_1         latest     ab30484b56b8   32 minutes ago   159MB

第6步:使用镜像,启动容器

docker run -d -p 5080:80  --name sc-hello-1 sc_friendlyhello_1

第7步:访问容器的web服务

curl或者chrome浏览器访问
宿主机ip:5080
Hello World!
Hostname: f4aeb5d5305a
Visits: cannot connect to Redis, counter disabled

因为redis数据库容器没有启动,flask web服务不能连接到redis数据库

第8步:启动redis容器

docker run -d -p 6379:6379 --name sc-redis-1 redis

第9步:再次启动一个自己制作镜像的容器,链接到redis容器

docker run -d --name sc-hello-2 -p 5081:80 --link sc-redis-1:redis sc_friendlyhello_1

第10步:访问容器的web服务

curl或者chrome浏览器访问
宿主机ip:5081
Hello World!
Hostname: aad7da1892b5
Visits: 15

三. 镜像制作的作业

作业

1.升级 sc_friendlyhello_1的镜像里的基础镜像为python:3.9
自己的镜像更名为sc_friendlyhello_2
2.启动容器和redis容器,测试访问**

作业步骤:

安装上传的文件

root@sc-docker-server ~]# yum install lrzsz -y  安装上传的软件
上次元数据过期检查:0:25:32 前,执行于 2021年08月18日 星期三 09时52分02秒。
软件包 lrzsz-0.12.20-43.el8.x86_64 已安装。
依赖关系解决。
无需任何处理。
完毕!
[root@sc-docker-server ~]#

第1步:下载app源代码

https://github.com/docker/getting-started 在windows里下载,然后上传到linux里 yum install git -y 

linux里: git clone https://github.com/califeng/getting-started.git

第2步:解压app源代码压缩包

[root@sc-docker-server ~]# yum install zip unzip -y

    [root@sc-docker-1 ~]# unzip getting-started-master.zip

第3步:进入app目录,去新建一个Dockerfile

    [root@sc-docker-1 getting-started-master]# cd app/
    [root@sc-docker-1 app]# vim Dockerfile
FROM node:12-alpine
WORKDIR /app
COPY  . .
RUN yarn install --production
CMD ["node", "src/index.js"]

第4步:制作镜像

[root@sc-docker-1 app]# docker build -t getting-started .
-t getting-started 是指定制作的镜像的名字,名字可以自己定义

[root@sc-docker-1 app]# docker images  查看制作的镜像
REPOSITORY                TAG         IMAGE ID       CREATED          SIZE
getting-started           latest      5b903e857b8c   25 seconds ago   179MB
redis                     latest      cc69ae189a1a   2 days ago       105MB
nginx                     1.19.7      35c43ace9216   7 days ago       133MB
nginx                     latest      35c43ace9216   7 days ago       133MB
mysql                     5.7.33      5f47254ca581   2 weeks ago      449MB
nginx                     1.19.6      f6d0b4767a6c   6 weeks ago      133MB
node                      12-alpine   0206ff8a5f9e   7 weeks ago      88.9MB
richarvey/nginx-php-fpm   latest      5c3ad1891297   5 months ago     506MB
hello-world               latest      bf756fb1ae65   13 months ago    13.3kB
jcdemo/flaskapp           latest      4f7a2cc79052   2 years ago      88.7MB
[root@sc-docker-1 app]#

第5步:启动自己制作的镜像的容器

[root@sc-docker-1 app]# docker run -dp 3000:3000 getting-started
8f150a72e7d2d1650685b00a18d237469fa07c8cd56977773dd266b281a3b4ad
[root@sc-docker-1 app]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                    NAMES
8f150a72e7d2   getting-started   "docker-entrypoint.s…"   5 seconds ago   Up 3 seconds   0.0.0.0:3000->3000/tcp   strange_benz
deabb58e01b0   nginx             "/docker-entrypoint.…"   26 hours ago    Up 2 hours     0.0.0.0:6655->80/tcp     chenpeng
[root@sc-docker-1 app]#

第6步:打开浏览器去访问容器里的网站

容器里的网站:http://192.168.0.161:3000/

总结

1.镜像的制作是作为docker 技术中必备的技能,你说你会docker ,别人一定会问你镜像的制作吗?你说制作那玩意干啥,别人就会会心一笑,心里一想这个人的技术一定很low,连这个都不会,还说自己会docker,呵呵。

2.后面有关镜像制作有详细的步骤,镜像制作十步法会教你怎么去做的,慢慢来,一步一步来做。

到此这篇关于Docker镜像制作、上传、拉取和部署的文章就介绍到这了,更多相关Docker镜像制作、上传、拉取和部署内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker 镜像和容器的区别详解

    最近学习Docker,被Docker 的镜像和容器搞的晕头转向,索性上网查找相关资料并整理下彻底的理解这块内容,有需要的小伙伴可以看下,少走点弯路. Docker的镜像和容器的区别 一.Docker镜像 要理解Docker镜像和Docker容器之间的区别,确实不容易. 假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的.这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态. 一个Docker镜像可以构建于另一个Docker镜像之上,这种层

  • docker 如何删除none镜像

    删除none的镜像,要先删除镜像中的容器.要删除镜像中的容器,必须先停止容器. $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 168b258ceea3 34 seconds ago 460.6 MB <none> <none> b2c5d34941c6 23 minutes ago 588.7 MB tankzhang/es v1 85fc66558c37 13 days

  • Docker中如何删除image(镜像)的方法

    docker中删除images的命令是docker rmi,但有时候执行此命令并不能删除images [yaxin@ubox ~] $docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE eg_sshd latest ed9c93747fe1 45 hours ago 329.8 MB CentOS65 latest e55a74a32125 2 days ago 360.6 MB [yaxin@ubox ~]$docker rmi

  • Docker push镜像失败解决方法

    Docker push镜像失败的问题. 以下是输入push自己的tomcat后出现了失败 [root@slave3 ~]# docker push lekkoliu/tomcat8:latest The push refers to a repository [docker.io/lekkoliu/tomcat8] cefee3f6c961: Preparing 82f021d9c2b9: Preparing 4f91f02b4e49: Preparing a4b3ce7e1d4a: Prepa

  • Docker中配置国内镜像设置

    本文介绍了Docker中配置国内镜像设置,分享给大家,具体如下: 1. 为什么要为docker配置国内镜像 在正常情况下,docker有一个默认连接的国外官方镜像,在国外的网友访问该官方镜像自然不成问题,但是国内毕竟不是国外,由于国情不同,中国的网络访问国外官方镜像网速一向很慢,而且往往还会遭遇断网的窘境,所以说我们要想正常使用docker的镜像,那么我们就不得不配置相应的国内镜像. 2. 可以使用的国内镜像有哪些 Docker可以配置的国内镜像有很多可供选择,比如说:阿里云,网易蜂巢,DaoC

  • Docker创建镜像、怎么修改、上传镜像等详细介绍

    Docker 创建镜像.修改.上传镜像 –创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 一.创建镜像 创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 二.修改已有镜像 1.先使用下载的镜像启动容器. $ docker run -t -i training/sinatra /bin/bash root@0b2616b0e5a8:/# 注意:记住容器的 ID,稍后还会用到. 2.

  • Docker创建镜像两种方法详解

     Docker创建镜像             最近学习Docker 的知识,偶然在网上看到关于Docker 创建对象的两种方法很好,这里记录下,也许可以帮助到你. 我们都知道Docker中我们是基于镜像来运行的容器,那如何创建镜像呢?创建镜像有两种方法,一是使用docker commit命令,二是使用docker build命令和Dockerfile文件.这里我们说的创建镜像是指基于一个已有的基础镜像比如ubuntu等,而不是从零创建一个全新的镜像. 下面分别简单介绍一下两种方法.      

  • docker拉取镜像查看版本的方法步骤

    要想查看镜像的版本好TAG,需要在docker hub查看 地址如下:https://hub.docker.com 进入之后,在页面左上角搜索框搜索 以nginx为例: 搜索完成如下: 点击进入详情 点击标签 选择自己想要拉取的标签 即可 例如 拉取标签为1.15.5的nginx镜像 # docker pull nginx:1.15.5 1.15.5: Pulling from library/nginx f17d81b4b692: Pull complete d5c237920c39: Pul

  • Docker拉取镜像的完整步骤

    1. docker pull 拉取镜像 使用 $ docker pull {IMAGE_NAME} 拉取镜像时,有两种情况: IMAGE_NAME 第一个斜杠之前有域名标识 Docker 会将 IMAGE_NAME 识别为带域名的镜像.例如,myregistry.io/space1/image1:latest ,Docker 会去 myregistry.io 指向的服务器请求镜像数据.一个 Docker 镜像分为很多层,如果本地存在该层,则不会再次拉取. IMAGE_NAME 第一个斜杠之前没有

  • 在 docker 之间导出导入镜像的方法

    很喜欢玩docker,但最新遇到一个问题,公司给的新机器的dns有问题,导致pull不下来镜像. 没办法了,没有镜像什么神马都干不了,又不能花很多时间去搭建私有的镜像库,只有另寻办法了. 废话少说,经过探究,发现 docker 提供把镜像导出export(保存save)为文件的机制,这样就可以把镜像copy到任意地方了. 1. 导出 export - 导入 import 格式:docker export CONTAINER(容器) 使用 docker ps -a 查看本机已有的容器,如: 我们使

随机推荐