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

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