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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- shutil模块,为什么说它是os模块的兄弟模块?
- HTML5+CSS3项目实战之河马牙医首页、百度首页、Mac桌面、简书首页、登录注册页面、苏宁易购首页
- 【Vue.js】Vue.js中的Vuex、Vue-Ajax和京东购物车项目实战
- ubuntu16.04安全小结-01
- 重新认识HTTP3xx重定向机制
- 【Vue.js】Vue.js中常用的UI组件库和Vue Router
- 四大查找算法
- 从Python调用堆栈获取行号等信息
- 详解supervisor进程管理
- Python时间模块常用操作总结
- rtmp规范1.0
- 实战|Python轻松实现动态网页爬虫(附详细源码)
- 排序算法 --- 桶排序
- 8086汇编语言——操作内存中的数据
- JVM内存模型不再是秘密