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