04 Dockerfile

时间:2021-07-30
本文章向大家介绍04 Dockerfile,主要包括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



原文地址:https://www.cnblogs.com/zhaokunhao/p/15078571.html