• Docker - docker镜像的制作


    目录

    知识点1:容器里的常见文件:

    知识点2:多容器之间的链接

    知识点3:什么是docker镜像?

    如何使镜像的大小尽可能小?

    知识点4:制作一个docker镜像

    创建一个mydocker空目录,用来存放制作镜像的一些文件 

    第1步:编辑Dockerfile

    第2步:编辑requirements.txt文件

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

     第4步:生成镜像文件

    第5步使用镜像,启动容器

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

     第7步: 启动redis容器

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

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


    知识点1:容器里的常见文件:

    docker 容器里的文件存放在/var/lib/docker/containers目录下面,以容器id的形式存放

     

    resolv.conf :容器里的dns服务器的地址使用的是宿主机的dns的配置

                            复制的宿主机的resolv.conf里的内容

    hostname:存放主机名

    hosts:存放域名解析的

    知识点2:多容器之间的链接

    使用场景:

    假设现在有一个redis容器和一个flask容器,flask容器需要访问redis容器,于是就在/etc/hosts文件里面添加一条域名映射,这样就可以通过域名来访问redis容器了

     示例:

    创建一个容器,使用nginx镜像,容器名叫zhangj-nginx-1

    1. [root@docker1 lianxi]# docker run -d -p 6601:80 --name zhangj-nginx-1 nginx
    2. 78b5edcfae49dfb046e64a6ec07cf56a70c536601e2a106ebb0a755bb54396c1
    3. [root@docker1 lianxi]# docker ps
    4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    5. 78b5edcfae49 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:6601->80/tcp, :::6601->80/tcp zhangj-nginx-1

    再创建一个容器,使用nginx镜像,容器名叫zhangj-nginx-2,并链接到zhangj-nginx-1容器

    1. [root@docker1 lianxi]# docker run -d -p 6602:80 --name zhangj-nginx-2 --link zhangj-nginx-1:zhangjian nginx
    2. bea28a46374734a977ba069d4a0c32496e1f204f5fedc5863aec7e52ba766664

     --link zhangj-nginx-1:zhangjian

               要链接的容器名:在zhangj-nginx-2容器的/etc/hosts里的名字

    进入/var/lib/docker/container/对应zhangj-nginx-2的容器id目录查看hosts文件,可以看到已经成功添加域名映射

    1. [root@docker1 lianxi]# cd /var/lib/docker/containers/
    2. [root@docker1 containers]# cd bea28a46374734a977ba069d4a0c32496e1f204f5fedc5863aec7e52ba766664/
    3. [root@docker1 bea28a46374734a977ba069d4a0c32496e1f204f5fedc5863aec7e52ba766664]# ls
    4. bea28a46374734a977ba069d4a0c32496e1f204f5fedc5863aec7e52ba766664-json.log hostconfig.json mounts
    5. checkpoints hostname resolv.conf
    6. config.v2.json hosts resolv.conf.hash
    7. [root@docker1 bea28a46374734a977ba069d4a0c32496e1f204f5fedc5863aec7e52ba766664]# cat hosts
    8. 127.0.0.1 localhost
    9. ::1 localhost ip6-localhost ip6-loopback
    10. fe00::0 ip6-localnet
    11. ff00::0 ip6-mcastprefix
    12. ff02::1 ip6-allnodes
    13. ff02::2 ip6-allrouters
    14. 172.17.0.2 zhangjian 78b5edcfae49 zhangj-nginx-1
    15. 172.17.0.3 bea28a463747
    16. [root@docker1 bea28a46374734a977ba069d4a0c32496e1f204f5fedc5863aec7e52ba766664]#

    知识点3:什么是docker镜像

    A Docker container image is a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings.

    一个docker容器镜像是一个轻量级的独立的,可执行的软件包,包含了运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。 

    镜像是一个软件单元

    镜像是各个不同的层组合而成的,镜像的分层思想

            最底层是基础镜像 ,base image

    FROM openjdk:8-jdk  指定的基础镜像

    镜像里的系统使用宿主机的内核,基础镜像有操作系统的库,

     

     base镜像

    base镜像是提供的最小安装的linux发行版

    scratch :

            FROM scratch

            官方说明:该镜像是一个空的镜像,用于构建busybox等超小镜像,可以说实真正的从零开始构建属于自己的镜像

    如何使镜像的大小尽可能小?

    尽可能使用较小的基础镜像

    减少run和copy的次数

    在镜像制作的过程中每执行一次RUN命令,镜像里就会多一些内容,镜像就会大一些

    镜像是要加载到容器里去运行的,一个容器对应一个进程,进程是需要消耗cpu和内存的

    每层里会记录发生哪些事情,有哪些数据

    所以制作镜像的过程中要尽量减少RUN的次数,减少镜像的层数

     ####################################################################### 

    知识点4:制作一个docker镜像

    从镜像的制作到代码编写,启动容器

    创建一个mydocker空目录,用来存放制作镜像的一些文件 

    1. [root@docker lianxi]# cd mydocker/
    2. [root@docker mydocker]# vim Dockerfile
    3. [root@docker mydocker]# ls
    4. Dockerfile

    第1步:编辑Dockerfile

    1. [root@sc-docker-server mydocker]# vim Dockerfile
    2. FROM python:2.7-slim
    3. WORKDIR /app # 进入到容器后进入的文件夹
    4. ADD . /app # 将linux系统当前目录下的内容到容器的/app目录下,类似于docker cp
    5. RUN pip install --trusted-host pypi.python.org -r requirements.txt # 在容器内部执行的命令
    6. EXPOSE 80 # 暴露80端口
    7. ENV NAME World # 定义了环境变量NAME赋值world
    8. ENV AUTHOR cali # 定义了环境变量AUTHOR ccali
    9. CMD ["python","app.py"] # 容器启动的时候执行命令 python app.py

    ####################################################################### 

    第2步:编辑requirements.txt文件

    1. [root@sc-docker-server mydocker]# vim requirements.txt # 解决依赖关系
    2. Flask
    3. Redis

    #######################################################################  

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

    1. [root@sc-docker-server mydocker]# vim app.py
    2. from flask import Flask
    3. from redis import Redis, RedisError
    4. import os
    5. import socket
    6. # Connect to Redis
    7. redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
    8. app = Flask(__name__)
    9. @app.route("/")
    10. def hello():
    11. try:
    12. visits = redis.incr("counter")
    13. except RedisError:
    14. visits = "cannot connect to Redis, counter disabled"
    15. html = "

      Hello {name}!

      "
      \
    16. "Hostname: {hostname}
      "
      \
    17. "Visits: {visits}"
    18. return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
    19. if __name__ == "__main__":
    20. app.run(host='0.0.0.0', port=80)

    #######################################################################  

     第4步:生成镜像文件

    [root@docker mydocker]# docker build -t sc-hello_1 .
    

    查看制作好的镜像

    1. [root@docker /]# docker images
    2. REPOSITORY TAG IMAGE ID CREATED SIZE
    3. sc-hello_1 latest e1134340fb3b 4 hours ago 159MB

    #######################################################################  

    第5步使用镜像,启动容器

    1. [root@docker mydocker]# docker run -d -p 5544:80 --name tang-flask-1 sc-hello_1
    2. 1512dfd39b295f7812e02c727e4ddfe09c629fa7a9cdb095f5b7eb2942309072
    3. [root@docker mydocker]# docker ps
    4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    5. 1512dfd39b29 sc-hello_1 "python app.py" 6 seconds ago Up 6 seconds 0.0.0.0:5544->80/tcp, :::5544->80/tcp tang-flask-1

    #######################################################################  

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

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

    #######################################################################  

     第7步: 启动redis容器

    [root@docker mydocker]# docker run -d -p 6379:6379 --name sc-redis-1 redis
    

    #######################################################################  

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

    1. [root@docker /]# docker run -d --name tang-flask-2 -p 5545:80 --link sc-redis-1:redis sc-hello_1
    2. 04a4ac0e44c29b5a4f0789d9d4ba9f181d7f8aa8f261409ea5dd79710bddcd24
    3. [root@docker /]# docker ps
    4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    5. 04a4ac0e44c2 sc-hello_1 "python app.py" 4 seconds ago Up 4 seconds 0.0.0.0:5545->80/tcp, :::5545->80/tcp tang-flask-2

    #######################################################################  

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

    curl或者chrome浏览器访问

    宿主机ip:端口

     

     ####################################################################### 

  • 相关阅读:
    SpringBoot网课管理系统的设计与实现源码
    基于模板匹配算法的交通标志识别(MATLAB源码)
    Flutter学习4 - Dart数据类型
    OpenCamera拍照的代码流程
    反超 PowerDesigner,这个国产数据库建模工具很强
    项目管理-2023西电网课课后习题答案-第五章
    ovalbumin-Aspartic acid 鸡卵白蛋白偶联天冬氨酸,Aspartic acid-PEG-OVA 天冬氨酸-聚乙二醇-卵清蛋白
    基于javaweb的职工考勤系统
    2022华数杯A题 B题 C题 思路汇总
    安卓机型系统美化 Color.xml文件必备常识 自定义颜色资源
  • 原文地址:https://blog.csdn.net/qq_48391148/article/details/126591836