• 04 Dockerfile


    Dockerfile 构建镜像

    • 可以自定义,Dockerfile是由一条条指令语句构成的一个创建Docker镜像的配置文件。
    • Dockerfile是由三个部分组成:基础镜像(必须的),运行指令,容器默认执行命令。 Dockerfile 由一行行命令语句组成, 并且支持以#开头的注释行。一般而言, Dockerfile 主体内容分为四 部分:基础镜像信息、 维护者信息、 镜像操作指令和容器启动时执行指令。 Docker 以从上到下的顺序运行 Dockerfile 的指令。为了指定基本映像,第一条指令必须是 FROM。一个声 明以#字符开头则被视为注释。可以在 Docker 文件中使用 RUN,CMD,FROM,EXPOSE,ENV 等指令。

    FROM

    [root@docker docker]# cat Dockerfile 
    FROM nginx    #指定一个镜像作为基础镜像,必须要有
    

    MAINTAINER

    # 指定维护者信息,1.18版本后就去掉了,没有固定格式,描述信息
    

    RUN

    # 基于FROM指定的docker镜像运行一个指令,把结果反映到新生成的镜像中
    [root@docker docker]# cat Dockerfile 
    FROM nginx
    
    RUN echo 111 > /usr/share/nginx/html/index.html
    # 必须是镜像中已经存在了的指令ip a构建会报错
    
    # 构建
    [root@docker docker]# docker build -t test:v3 .
    Sending build context to Docker daemon  2.048kB
    Step 1/2 : FROM nginx
     ---> 4f380adfc10f
    Step 2/2 : RUN echo 111 > /usr/share/nginx/html/index.html
     ---> Running in af80a3ed43d8
    Removing intermediate container af80a3ed43d8
     ---> 5422a1d2d672
    Successfully built 5422a1d2d672
    Successfully tagged test:v3
    
    # 查看
    [root@docker docker]# docker run -it test:v3 bash
    root@89fbd2a8c72d:/# cat /usr/share/nginx/html/index.html 
    111
    

    CMD

    # 指定容器运行的默认命令
    CMD nginx -g "daemon off;"
    

    ADD & COPY

    ADD 将本地文件添加到镜像 ---> 压缩包自动解压,仅仅支持tar包;支持远程下载,但是不会解压
    COPY 将文件复制到镜像 ---> 压缩包不会自动解压,也不支持远程下载
    

    案例

    # 使用dockerfile创建一个nmp
    centos --> 源码包 --> 解决依赖 --> ./configure --> make -->  make install
    
    # 案例
    [root@docker nginx]# cat Dockerfile 
    FROM centos:7
    
    RUN rm -rf /etc/yum.repos.d/*
    
    ADD nginx.repo /etc/yum.repos.d/
    
    RUN yum install nginx -y
    
    CMD nginx -g "daemon off;"
    
    # 构建
    [root@docker nginx]# docker build -t baim0_nginx:v1 .
    
    # 查看测试
    [root@docker nginx]# docker run -d --network host --name nginx1 baim0_nginx:v1
    2396bcc36e69fb5b8a5109297f6fda2eb4b5b1bd3e8434447c8b3e3f73c652f1
    [root@docker nginx]# 
    [root@docker nginx]# docker ps
    CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS         PORTS     NAMES
    2396bcc36e69   baim0_nginx:v1   "/bin/sh -c 'nginx -…"   5 seconds ago   Up 4 seconds             nginx1
    

    LABEL

    # 用于为镜像添加元数据
    

    ENV

    # 设置容器的环境变量
    ENV baim0=shuaige
    
    后续所有的操作,通过$NAMME就可以直接获取变量值使用了,维护dockerfile更加方便
    
    ARG和ENV一样,都是设置环境变量
    ENV无论是在镜像构建时,还是容器运行,该变量都可以使用
    ARG只是用于构建镜像需要设置的变量,容器运行时就消失了
    

    EXPOSE

    # 指定容器需要向外界暴露的端口,可以指定多个端口
    EXPOSE 80 443
    EXPOSE 8080
    EXPOSE 11211/tcp 11211/udp
    

    ARG

    # 指定运行时参数,用于构建docker镜像时传入参数使用,相当于定义变量
    
    FROM centos:7
    
    AVG USER=root
    
    ADD nginx.repo /etc/yum.repos.d/
    
    RUN yum install nginx -y
    
    RUN echo $USER
    
    EXPOSE 80
    
    CMD nginx -g "daemon off;"
    

    VOLUME

    # 持久化目录
    # 设置需要挂载的目录,没有实现挂载,仅仅是一个提示
    [root@docker nginx]# docker inspect [镜像] | grep  VOLUME 查看
    
                "Volumes": {
                    "/data1": {},
                    "/data2": {}
                },
    # 案例
    VOLUME ["/data"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
    

    WORKDIR

    # 设置工作目录
    1、 程序运行的开始目录 ---> 相对路径
    2、 进入容器的最初目录 ---> 进去后的目录
    
    WORKDIR [目录]
    WORKDIR /etc/nginx/conf.d
    

    ONBUILD

    # 构建触发器
    # 触发条件: 当当前镜像用作基础镜像时触发(FROM后面的镜像)
    ONBUILD ADD . /app/src
    ONBUILD RUN /usr/local/bin/python-build --dir /app/src #跟的是指令,不是linux命令
    

    容器化部署django项目

    拉取代码

    这个django项目的前后端都是在一起的,所以我们只需要部署后端,通过runserver指定端口启动就可以了

    yum install git -y
    git clone https://gitee.com/lylinux/DjangoBlog.git
    

    部署思路

    前后端代码在一起的时候

    前后端代码分离的时候

    创建项目网桥

    [root@docker ~]# docker network create dj
    d4f6f08c8039e941a742b86b028335c8a914f4c688300aed8bee474000ab462a
    

    准备数据库

    docker run -d -e MYSQL_ROOT_PASSWORD=123  --network dj --name mysql registry.cn-shanghai.aliyuncs.com/baim0/mysql:5.7
    MySQL [(none)]> create  database djangoblog default charset utf8mb4;
    

    启动centos7容器

    docker run -it --network dj -p 80:80 centos:7 bash
    # 系统优化--解决容器内字符编码问题
    [root@b8fac4240f7d /]# echo export LANG="en_US.UTF-8" >> /etc/profile
    [root@b8fac4240f7d /]# source /etc/profile
    [root@b8fac4240f7d /]# echo $LANG
    en_US.UTF-8
    
    # 安装python3.6.7
    wget http://www.baim0.xyz:90/install/python3.6.7.sh
    bash python3.6.7.sh
    

    拉取项目代码

    mkdir /code
    cd /code
    yum install git -y
    git clone https://gitee.com/lylinux/DjangoBlog.git
    cd /code/DjangoBlog/
    
    # pip项目所需库,指定清华源下载
    yum install mysql-devel -y
    yum install python-devel -y
    pip3.6.7 install --upgrade pip
    pip3.6.7 install -r requirements.txt  -i https://pypi.tuna.tsinghua.edu.cn/simple
    

    将容器保存为镜像

    [root@docker ~]# docker commit -m "baim0" -a "baim0" -p b8fac4240f7d django:test
    sha256:eef3cf153f5b65f54628371f2080a5033930a4d242796782dfff483bf8809ded
    

    编写dockerfile

    FROM django:test
    
    EXPOSE 8080
    
    VOLUME ["/code"]
    
    CMD PYTHONIOENCODING=utf-8 python3.6.7 /code/manage.py runserver 0.0.0.0:8080
    
    [root@docker ok]# docker build -t django:v1 .
    
    docker run -itd --network dj -p 80:8080 -v /DjangoBlog/:/code django:v1
    # 进入容器同步数据
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': os.environ.get('DJANGO_MYSQL_DATABASE') or 'djangoblog',
            'USER': os.environ.get('DJANGO_MYSQL_USER') or 'root',
            'PASSWORD': os.environ.get('DJANGO_MYSQL_PASSWORD') or '123',
            'HOST': os.environ.get('DJANGO_MYSQL_HOST') or 'mysql',
            'PORT': int(
                os.environ.get('DJANGO_MYSQL_PORT') or 3306),
            'OPTIONS': {
                'charset': 'utf8mb4'},
        }}
    # 在code目录下运行同步数据脚本
    ./manage.py makemigrations
    ./manage.py migrate
    
        - Create model OAuthConfig
        - Create model OAuthUser
    [root@604026d4267a code]# ./manage.py migrate
    Operations to perform:
      Apply all migrations: accounts, admin, auth, blog, comments, contenttypes, oauth, owntracks, servermanager, sessions, sites
    Running migrations:
      Applying contenttypes.0001_initial... OK
      Applying contenttypes.0002_remove_content_type_name... OK
      Applying auth.0001_initial... OK
      Applying auth.0002_alter_permission_name_max_length... OK
    
    
    # 创建超管用户
    # 这里有字符编码的问题,直接创建会报错
    PYTHONIOENCODING=utf-8 python3.6.7 manage.py createsuperuser
    [root@604026d4267a code]# PYTHONIOENCODING=utf-8 python3.6.7 manage.py createsuperuser
    用户名: baim0
    电子邮件地址: 
    Password: 
    Password (again): 
    [2021-07-30 10:18:01,628] INFO [DjangoBlog.utils.news:65 utils] cache_decorator set cache:get_current_site key:353afce6b88d84783de8752421ccc514270c2a45650c1dd798f783549477288e
    [2021-07-30 10:18:01,837] INFO [DjangoBlog.spider_notify.baidu_notify:30 spider_notify] {"remain":100000,"success":0,"not_same_site":["https://example.com/author/baim0.html"]}
    Superuser created successfully.
    
    # 重启docker
    docker restart 604026d4267a
    



    部署django

    FROM python:3.6
    
    RUN cd /opt/ &&
            pip install django &&
            django-admin startproject docker &&
     cd docker/ &&
     django-admin startapp aplication 
    
    WORKDIR /opt/docker
    
    EXPOSE 8080
    
    CMD python manage.py runserver 0.0.0.0:8080
    
    # 2、构建镜像
    [root@docter django]# docker build -t blog-django:v1 . # 构建镜像
    Sending build context to Docker daemon  2.048kB
    ...
    Successfully built 75ea06c8060c
    Successfully tagged blog-django:v1
    # 3、启动容器
    [root@docter django]# docker run -d -p 8080:8080 blog-django:v1 
    fc9b4d2b4109b5d1c012d98fc9540ca781396992ad0a3691dc86fe8c0848ee1a
    # 4、查看容器是否启动
    [root@docter django]# docker ps
    CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS        PORTS                                       NAMES
    fc9b4d2b4109   blog-django:v1   "/bin/sh -c 'python …"   2 seconds ago   Up 1 second   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   sweet_allen
    # 5、修改django配置文件
    1、从容器内复制配置文件
    [root@docter django]# docker cp fc9b4d2b4109:/opt/docker/docker/settings.py .
    [root@docter django]# ll
    total 8
    -rw-r--r-- 1 root root  240 Jul 30 16:52 Dockerfile
    -rw-r--r-- 1 root root 3242 Jul 30 16:04 settings.py
    2、修改配置文件
    [root@docter django]# egrep 'ALLOWED_HOSTS' settings.py 
    ALLOWED_HOSTS = ['*']  # 修改这个配置文件
    # 6、重新启动容器
    [root@docter django]# docker restart fc9b4d2b4109
    fc9b4d2b4109
    [root@docter django]# docker ps
    CONTAINER ID   IMAGE            COMMAND                  CREATED             STATUS          PORTS                                       NAMES
    fc9b4d2b4109   blog-django:v1   "/bin/sh -c 'python …"   About an hour ago   Up 56 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   sweet_allen
    # 7、IP访问
    192.168.15.30:8080
    

    部署java

    # 上传代码包
    wget http://www.baim0.xyz:90/java_test/springboot-master.zip
    
    # 启动编译容器
    docker run -it -v /opt/java/springboot-master:/opt maven:3.6.3-openjdk-8 bash
    
    # 到项目目录下编译
    mvn clean package
    
    # 编译结束执行
    [root@local springboot-master]# cat Dockerfile 
    FROM openjdk:18-jdk
    
    ADD target/*.war /usr/local/webapp/
    
    WORKDIR /usr/local/webapp
    
    EXPOSE 8080
    
    CMD java -jar GitLab-0.0.1-SNAPSHOT.war
    docker build -t test/java:v2 .
    
    # 运行访问
    docker run -d -p 80:8080 test/java:v2
    

  • 相关阅读:
    myeclipse的git插件安装
    安装虚拟机和Linux系统
    Windows 10快速在指定目录打开命令行
    更新Maven的本地库
    Maven安装
    html全屏显示
    除法保留两位小数
    springmvcjson中文乱码处理
    office2016 下载直通车
    JAVA面向对象编程深入理解图
  • 原文地址:https://www.cnblogs.com/zhaokunhao/p/15078571.html
Copyright © 2020-2023  润新知