天天看点

[email protected]构建镜像

文章目录

    • Dockerfile构建镜像
      • 一、Dockerfile的简述
      • 二、Dockerfile使用参数(参数编写为大写)
        • 1、FROM
        • 2、MAINTAINER
        • 3、RUN
        • 4、CMD
        • 5、ADD
        • 6、COPY
        • 7、ENV
        • 8、EXPOSE
        • 9、ARG
        • 10、VOLUME
        • 11、WORKDIR
        • 12、ONBUILD
        • 13、LABEL
      • 三、Dockerfile(案列)
        • 【构建nginx镜像】
        • 【构建php镜像】
        • 【数据库镜像】
        • 【总结】
        • 【Dockerfile源码构建PHP镜像】
        • 【构建镜像文件(扩展)】
      • 四、使用构建镜像搭建lnmp
      • 五、Dockerfile(多种构建镜像详解案列)

Dockerfile构建镜像

Dockerfile是由一行行指令语句构成的一个创建docker镜像的配置文件。Dockerfile是由三个部分组成:基础镜像(必须的)、运行指令、容器默认执行命令。

一、Dockerfile的简述

1》Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等),镜像不包含任何动态数据,其内容在构建之后也不会被改变

2》Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦

1)Dockerfile 由一行行命令语句组成, 并且支持以#开头的注释行。 


2)Dockerfile 主体内容分为四部分:基础镜像信息、 维护者信息、 镜像操作指令和容器启动时执行指令


3)Docker 以从上到下的顺序运行 Dockerfile 的指令。为了指定基本映像,第一条指令必须是 FROM。一个声
明以#字符开头则被视为注释。可以在 Docker 文件中使用RUN,CMD,FROM,EXPOSE,ENV 等指令

           
[email protected]构建镜像

二、Dockerfile使用参数(参数编写为大写)

1、FROM

指定基础镜像,必须为第一个命令,目的是为了给构建镜像提供一个基础环境
#格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>



#示例: 
FROM mysql:5.6

FROM mysql:5.7




#注: tag 或 digest 是可选的,如果不使用这两个值时,会使用 latest 版本的基础镜像
           

2、MAINTAINER

指定维护者信息 (一般不常用)
#格式:
MAINTAINER <name>

#示例:
MAINTAINER Jasper Xu
MAINTAINER [email protected]
MAINTAINER Jasper Xu <[email protected]>
           

3、RUN

构建镜像时执行的命令,基于FROM指定的docker镜像运行一个指令,将结果反映到新生成的镜像,RUN指令后面执行的命令必须是镜像中已经存在了的命令
#RUN :用于在镜像容器中执行命令,其有以下两种命令执行方式:
1》shell 执行

#格式:
RUN <command>



2》exec 执行
#格式:
RUN ["executable", "param1", "param2"]




#示例:
RUN ["executable", "param1", "param2"]
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]


#注: 
  RUN 指令创建的中间镜像会被缓存,并会在下次构建中使用。
  如果不想使用这些缓存镜像,可以在构建时指定--no-cache 参数
  如:docker build --no-cache
           

4、CMD

构建容器后调用,也就是在容器启动时才进行调用,指定容器运行的默认命令
#格式:
CMD ["executable","param1","param2"]   (执行可执行文件,优先)
CMD ["param1","param2"]   (设置了 ENTRYPOINT,则直接调用 ENTRYPOINT 添加参数)
CMD command param1 param2 (执行 shell 内部命令)



#示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]




#注: CMD 不同于 RUN,CMD 用于指定在容器启动时所要执行的命令,而 RUN 用于指定镜像构建时所要执行的命令。
nginx前台使用的命令:
CMD nginx -g "daemon off;"
           

5、ADD

将本地文件添加到容器中

tar 类型文件会自动解压(网络压缩资源不会被解压)

#格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径


#示例:
ADD hom* /mydir/       #添加所有以"hom"开头的文件
ADD hom?.txt /mydir/   #? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/  #添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ #添加 "test" 到 /absoluteDir/





#ADD与copy之间的区别:
ADD : 将本地文件添加到镜像
	  ADD支持自动解压,但是仅仅支持解压tar包
	  ADD支持远程下载,但是不会解压下载内容
	
COPY : 将文件复制到镜像
       copy不支持解压功能功能
       copy不支持远程下载功能
           

6、COPY

功能类似 ADD ,但是是不会自动解压文件,也不能访问网络资源(将文件复制到镜像)
#功能描述:
只支持复制文件到镜像中,不支持解压功能



#语法:
COPY < src>… < dest>
COPY [“< src>”,… “< dest>”]


#示列:
COPY  hzl absoluteDir/



#注:
   指令逻辑和 ADD 十分相似,同样 Docker Daemon 会从编译目录寻找文件或目录,dest 为镜像中的绝对路径或者相对于 WORKDIR 的路径
           

7、ENV

设置一个容器的环境变量
#格式:
ENV <key> <value>       #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置
一个变量
ENV <key>=<value> ...   #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行






#示例:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat=fluffy
           

8、EXPOSE

指定容器需要向外界暴露的端口,实际上没有暴露,只有指定了EXPOSE才能够使用-P, 可以指定多个端口

指定于外界交互的端口

#格式:
EXPOSE <port> [<port>...]




#示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp




#注:
   EXPOSE 并不会让容器的端口访问到主机。要使其可访问,需要在 docker run 运行容器时通过-p 来发布这些端口,或通过-P 参数来发布 EXPOSE 导出的所有端口
           

9、ARG

用于指定传递给构建运行时的变量

指定运行时参数,用于构建docker镜像时传入参数: --build-arg=USER=root

#格式:
ARG <name>[=<default value>]




#示例:
ARG site
ARG build_user=www
           

10、VOLUME

用于指定持久化目录,设置需要挂载的目录,没有实现挂载
#格式:
VOLUME ["/path/to/dir"]






#示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]





#注: 一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
  1)卷可以容器间共享和重用
  2)容器并不一定要和其它容器共享卷
  3)修改卷后会立即生效
  4)对卷的修改不会对镜像产生影响
  5)卷会一直存在,直到没有任何容器在使用它
           

11、WORKDIR

工作目录,类似于 cd 命令

设置工作目录:

1)程序运行的开始目录

2)进入容器的最初目录

#格式:
WORKDIR /path/to/workdir



#示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)


#注:通过 WORKDIR 设置工作目录后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用 docker run 运行容器时,可以通过-w 参数覆盖构建时所设置的工作目录
           

12、ONBUILD

用于设置构建触发器 : 当当前镜像用作基础镜像时触发

ONBUILD 后面跟的是Dockerfile指令不是linux命令

#格式: ONBUILD [INSTRUCTION]




#示例:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src

#注:当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
           

13、LABEL

用于为镜像添加元数据
#格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...



#示例:
LABEL version="1.0" description="这是一个 Web 服务器" by="IT 笔录"



#注:使用 LABEL 指定元数据时,一条 LABEL 指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔,推荐将所有的元数据通过一条 LABEL 指令指定,以免生成过多的中间镜像
           

三、Dockerfile(案列)

【构建nginx镜像】

1)#创建nginx镜像文件
-----------------------------------------------------------------------------------------------------
[[email protected] nginx]# vim Dockerfile   #构建镜像
FROM nginx
RUN yum install nginx -y 
RUN useradd www
ADD default.conf  /etc/nginx/conf.d/
ADD nginx.conf  /etc/nginx
EXPOSE 80 443
WORKDIR /root                      #创建工作目录
CMD nginx -g "daemon off;"         #nginx前台运行命令
-----------------------------------------------------------------------------------------------------






2)#修改配置文件一(nginx)
[[email protected] nginx]#cat nginx.conf      
user  www;             #修改用户
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

.....
...







3)#修改配置文件二(nginx)   
[[email protected] nginx]#cat default.conf
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;
    }
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}






4)#构建镜像
[[email protected] nginx]# docker build -t nginx_lnmp:v1 .
Sending build context to Docker daemon  4.608kB
Step 1/6 : FROM centos:7
 ---> 8652b9f0cb4c
Step 2/6 : RUN useradd www
 ---> Using cache
 ---> 604c262a4b42
Step 3/6 : ADD default.conf  /etc/nginx/conf.d/
 ---> 14de68977858
Step 4/6 : ADD nginx.conf  /etc/nginx
 ---> 4aad7ceec6c5
Step 5/6 : EXPOSE 80 443
 ---> Running in fcd1ed826cdb
Removing intermediate container fcd1ed826cdb
 ---> 925ca375e06c
Step 6/6 : CMD nginx -g "daemon off;"
 ---> Running in 8cc6e5a8bcb4
Removing intermediate container 8cc6e5a8bcb4
 ---> ce2cb9bc6cc3
Successfully built ce2cb9bc6cc3
Successfully tagged nginx_lnmp:v1






5)#查看生成的镜像
[[email protected] nginx]# docker images  |grep nginx_lnmp
nginx_lnmp                                                  v1             ce2cb9bc6cc3   53 seconds ago   204MB
           

【构建php镜像】

1)#创建PHP镜像文件
--------------------------------------------------------------------------------------------------
[[email protected] php]# vim Dockerfile   
FROM centos:7
#RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
#RUN rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
#RUN yum install php php-devel php-fpm -y   #低版本安装使用
ADD php.repo /etc/yum.repos.d/php.repo      #安装yum源
RUN yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb --skip-broken
RUN useradd www
ADD www.conf /etc/php-fpm.d/
ADD php-fpm.conf /etc/
EXPOSE 9000
CMD php-fpm -F                             #php前台运行命令

---------------------------------------------------------------------------------------------------------------------------------------

[[email protected] php]# cat Dockerfile         #本地安装php构建
FROM centos:7
ADD php.tar /tmp                       #添加php安装包
RUN yum -y localinstall  /tmp/*.rpm    #本地安装php包
RUN useradd www
ADD www.conf /etc/php-fpm.d/
ADD php-fpm.conf /etc/
EXPOSE 9000
CMD php-fpm -F                        #php前台运行命令

--------------------------------------------------------------------------------------------------------------------------------------





2)#创建php官方源
[[email protected] php]# cp  /etc/yum.repos.d/php.repo .
[[email protected] php]# cat php.repo
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
[[email protected] php]# ll                   #php需要文件
总用量 19852
-rw-r--r-- 1 root root      576 7月  28 22:34 Dockerfile
-rw-r--r-- 1 root root    23007 7月  28 17:11 php-fpm.conf
-rw-r--r-- 1 root root      109 7月  28 19:50 php.repo
-rw-r--r-- 1 root root 20275200 7月  28 22:55 php.tar
-rw-r--r-- 1 root root    17964 7月  28 19:56 www.conf





3)#修改配置文件 www.conf (php)
[[email protected] php]#cat www.conf
[www]
user = apache
group = apache
listen = 0.0.0.0:9000
listen.allowed_clients = 0.0.0.0
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache

[[email protected] php]#cat php-fpm.conf
[global]
[www]
user = www
group = www
listen = 9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
request_terminate_timeout = 0








3)#构建镜像(php)
[[email protected] php]# docker build -t php_lnmp:v1 . 
Sending build context to Docker daemon  44.54kB
Step 1/6 : FROM centos:7
......
....

 ---> 8c615ceff8a3
Step 6/6 : CMD ["php-fpm"]
 ---> Running in 72f4cbd8a2be
Removing intermediate container 72f4cbd8a2be
 ---> 52518650afa9
Successfully built 52518650afa9
Successfully tagged php_lnmp:v1





4)#查看镜像(php)
[[email protected] php]# docker images |grep php
php_lnmp                                                    v1             52518650afa9   About a minute ago   463MB
           

【数据库镜像】

#创建mysql镜像
[[email protected] php]# docker rm -f mysql && docker run -d --name mysql --network=lnmp -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE wordpress mysql:5.7


#直接使用拉取mysql镜像
           

【总结】

#注意:
1》dockerfile执行顺序是按照从上到下
2》如果构建的上一个镜像执行过此步骤,下一个则可以使用缓存(Using cache),重复构建镜像会使用缓存
3》如果上一步文件修改过,再次构建镜像时dockerfile的步骤,全部不会使用缓存





#缓存:
  1、从互联网下载内容不会使用缓存
  2、向镜像内部添加文件的内容(ADD、COPY)
           

【Dockerfile源码构建PHP镜像】

【构建镜像文件(扩展)】

FROM centos7
MAINTAINER Alvin [email protected]
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup   #本地yum源备份
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum makecache
RUN yum update -y
RUN yum install python3 -y
RUN pip3 install django
COPY docker /root/docker
WORKDIR /root/docker
EXPOSE 8080      
CMD ["python3", "manage.py", "runserver", "0.0.0.0:8080"]     #启动服务
           

四、使用构建镜像搭建lnmp

1)#下载wordpress
 [[email protected] ~]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz       
--2021-07-28 04:23:50--  https://cn.wordpress.org/latest-zh_CN.tar.gz
正在解析主机 cn.wordpress.org (cn.wordpress.org)... 198.143.164.252
正在连接 cn.wordpress.org (cn.wordpress.org)|198.143.164.252|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:15783657 (15M) [application/octet-stream]
正在保存至: “latest-zh_CN.tar.gz”

100%[============================================================================================================================>] 15,783,657  1.10MB/s 用时 25s    

2021-07-28 04:24:16 (618 KB/s) - 已保存 “latest-zh_CN.tar.gz” [15783657/15783657])




2)#创建网桥lnmp
[[email protected] nginx]# docker network create lnmp
c7ad0d637a1455ebd5ea9d08e23f5d13971a0172a910ddc8bd4649a68ee27fc4
#查看创建的网桥
[[email protected] nginx]# docker network ls |grep lnmp
4ead920b47c7   lnmp      bridge    local





3)#运行容器并创建数据库(mysql5.7)
[[email protected] mysql]# docker run -d -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=wordpress --network lnmp --name mysql mysql:5.7 
840cdb23efceb5d894f92b280aa247ef2d656f015f5950c4927dbae49305ad42
[[email protected] mysql]# docker ps |grep mysql
840cdb23efce   mysql:5.7   "docker-entrypoint.s…"   20 seconds ago   Up 18 seconds   3306/tcp, 33060/tcp   mysql




4)#检查数据库状态(mysql)
[[email protected] tmp]# docker exec -it mysql bash
[email protected]:/# mysql -uroot -p123
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+
5 rows in set (0.00 sec)





5)#运行创建php容器(php)
[[email protected] ]# docker run -d -v /tmp/html:/usr/share/nginx/html --network lnmp --name php php_lnmp:v1 
a67d5e25f7dd228ab2a712005d15823fb22a0ad8c30d36bfb8d713f08074d2e2
[[email protected] php]# docker ps |grep php
a67d5e25f7dd   php_lnmp:v1   "php-fpm"                20 seconds ago   Up 19 seconds   9000/tcp              php





6)#运行创建nginx容器(nginx)
[[email protected] nginx]# docker run -d  -p 80:80 -v /tmp/html/:/usr/share/nginx/html --name nginx --network lnmp nginx_lnmp:v1 
2e752f264faef9d7e8c2f8e2c214f8e62eb4ac23dceeaa24021bb83eba3ad6a7
[[email protected] nginx]# docker ps |grep nginx
2e752f264fae   nginx_lnmp:v1   "/docker-entrypoint.…"   11 seconds ago   Up 10 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx





7)#项目文件
[[email protected] ~]# mkdir /tmp/html/
[[email protected] ~]# tar xf  latest-zh_CN.tar.gz -C /tmp/
[[email protected] html]# cd /tmp/
[[email protected] html]# mv /tmp/wordpress/* /tmp/html





8)#使用浏览器访问
http://192.168.15.80
           
[email protected]构建镜像

五、Dockerfile(多种构建镜像详解案列)

1)#使用 centos7 作为基础镜像部署 nginx 服务先创建一个nginx.repo文件
vim nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/releasever/basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/releasever/basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true



2)#编写 Dockerfile 文件
[[email protected] ~]# vim Dockerfile
#指定基础镜像(依赖镜像)
FROM centos:7
#执行一个命令
RUN yum install -y yum-utils
#将本地文件添加到容器中
ADD nginx.repo /etc/yum.repos.d/nginx.repo

#更新YUM缓存
RUN yum makecache

#安装nginx
RUN yum install -y nginx

#制定容器启动默认执行的命令
CMD nginx -g ‘daemon off;’



3)#构建镜像
[[email protected] ~]# docker build -t install/nginx:v1

#查看刚刚构建的镜像, 然后实例容器
[[email protected] ~]# docker images
[[email protected] ~]# docker run -dit install/nginx:v1 sh

#查看刚刚实例出的容器, 并进入到容器中
[[email protected] ~]# docker exec -it 94f8e35f3357 bash    

#检测nginx是否部署成功
[[email protected] ~]# crul 127.0.0.1    #出现 html 代码说明部署成功




4)#在容器中编译安装 nginx 服务
#编辑 Dockerfile 文件
[[email protected] ~]# vim Dockerfile

#指定基础镜像(依赖镜像)
FROM centos:7

#执行命令
RUN yum install yum-utils wget zlib zlib-devel pcre pcre-devel make gcc gcc-c++
RUN cd /opt && wget http://nginx.org/download/nginx-1.18.0.tar.gz && tar -xvf nginx.1.18.0/ && cd nginx-1.18.0/ && ./configure && make && make install

#指定进入容器的默认工作目录
WORKDIR /usr/local/nginx/sbin

#指定容器启动默认执行的命令
CMD ./nginx -g ‘daemon off;’






5)#构建镜像
[[email protected] ~]# docker build -t yuan/install/nginx:v2 .
#查看是否构建成功,并实例出容器
[[email protected] ~]# docker images
[[email protected] ~]# docker run -dit --name yuan_nginx yuan/install/nginx:v2 sh
 
#查看容器是否启动成功, 并测试 nginx
[[email protected] ~]# docker exec yuan_nginx crul 127.0.0.1     #出现html代码说明部署成功






6)#构建以 Centos 为依赖镜像并安装 Django 的服务
#首先构建一个Dockerfile文件
[[email protected] ~]#vim Dockerfile

#指定基础镜像
FROM centos:7
#运行命令
RUN yum makecache && yum update -y && yum install -y python3 && pip3 install django
#拷贝本地文件到容器
COPY hzl /root/
#指定进入到容器的工作目录
WORKDIR /root/
#指定向外暴露的端口
EXPOSE 8080
#运行命令
CMD cd ./hzl && python3 manage.py runserver 0.0.0.0:8080
#文件 hzl 的构建
#在宿主机上安装 Django
django-admin startproject hzl 
#创建一个 “hzl” 项目
cd ./hzl                          #进入目录
django-admin startapp application #开始项目
cd ./hzl
vim setting.cong                  #修改配置文件"*"代理
cd … #退出





7)#构建镜像
[[email protected] ~]#docker build -t test333:v1 .
#查看并使用镜像实例化出容器
[[email protected] ~]#docker images
[[email protected] ~]#docker run -dit --name test001 -p 9999:8080 test333:v1 sh


#查看刚开启的容器,并进入容器启动 Django 服务
[[email protected] ~]#docker exec -it test001 bash
[[email protected] ~]# python3 manage.py runserver 0.0.0.0:8080
Watching for file changes with StatReloader
Performing system checks…

System check identified no issues (0 silenced).
December 04, 2020 - 06:50:19
Django version 3.1.4, using settings ‘lingxiu.settings’
Starting development server at http://0.0.0.0:8080/
Quit the server with CONTROL-C.

#使用浏览器验证一下





8)#构建以 python 为依赖镜像并安装 Django 服务
#编辑 Dockerfile 文件
[[email protected] ~]# vim Dockerfile
#指定依赖镜像
FROM python:3.6
#设置作者
MAINTAINER hzl
#执行命令
RUN /usr/local/bin/python -m pip install --upgrade pip
RUN pip3 install django==2.2.2
#拷贝文件
COPY app /root/

#设置工作目录
WORKDIR /root/

#执行命令
CMD cd ./app && python3 manage.py runserver 0.0.0.0:7777





9)#文件 app 的构建
#在宿主机上安装 Django
django-admin startproject app    #创建一个 “app” 项目
cd ./app      #进入目录
django-admin startapp application  #开始项目
cd ./app
vim setting.cong     #修改配置文件"*"代理
cd …      #退出





10)#构建镜像
[[email protected] ~]#docker build -t jjjj .
#查看并使用镜像实例化出容器
[[email protected] ~]#docker images
[[email protected] ~]#docker run -dit --name jjjjtest -p 4444:7777 jjjj:latest sh
#查看刚开启的容器,并进入容器启动 Django 服务
[[email protected] ~]#docker exec -it jjjtest bash
[email protected]:~# python3 manage.py runserver 0.0.0.0:7777
Watching for file changes with StatReloader
Performing system checks…

System check identified no issues (0 silenced).
December 04, 2020 - 10:17:51
Django version 2.2.2, using settings ‘app.settings’
Starting development server at http://0.0.0.0:7777/
Quit the server with CONTROL-C.

#使用浏览器检验一下





11)#使用 NGINX 代理 Django
#先构建一个 Django 服务, 步骤与上一个例子相同
#改变了一下向外暴露的端口
#编写 “Dockerfile” 文件
[[email protected] DjangoDocker]#vim Dockerfile

#指定依赖镜像
FROM pyhton:3.6

#安装 Django
RUN /usr/local/bin/python -m pip install --upgrade pip
RUN pip3 install django==2.2.2
#COPY 文件
COPY app /root/
#指定工作目录
WORKDIR /root/
#运行命令
CMD cd ./app && python3 manage.py runserver 0.0.0.0:8080


[[email protected] DjangoDocker]#ls
app Dockerfile        #这两个文件, “app” 在上一个例子中有构建
#构建镜像,并查看
[[email protected] DjangoDocker]#docker build -t python_django:v6 .
[[email protected] DjangoDocker]#docker images

#实例出容器,并查看
[[email protected] DjangoDocker]#docker run -dit --name p_d_test1 -p 8888:8080 python_django:v6 sh
6906ff9e3ec0f9d583eb27890d82c79deff4358a43e5f1ec768a702547d020bf
[[email protected] DjangoDocker]#docker ps

#进到容器里面,开启服务,再测试
[[email protected] DjangoDocker]#docker exec -it p_d_test1 bash
[email protected]:~# python3 manage.py runserver 0.0.0.0:8080
[[email protected] DjangoDocker]#curl 127.0.0.1:8888





12)#然后来编写 nginx 服务以及代理配置
#编写 “nginx.repo” 文件
[[email protected] NginxDocker]#vim nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/releasever/basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/releasever/basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true


#编写 “default.conf” 文件(代理"Django"配置)
[[email protected] NginxDocker]#vim default.conf
server {
listen 80;
server_name www.py16zxl.com;

    location / {
    # 这里填的是 Django 服务的访问地址与端口(映射端口)
    proxy_pass http://192.168.13.234:8888/;
    index index.html index.htm index.jsp;
    }

}




13)#编写 “Dockerfile” 文件
[[email protected] NginxDocker]#vim Dockerfile
#指定依赖进行
FROM centos:7
#指定作者
MAINTAINER hzl
#安装依赖
RUN yum install -y yum-utils gcc gcc-c++ pcre pcre-devel zlib zlib-devel make wget
#源码安装 nginx1.18.0
RUN wget http://nginx.org/download/nginx-1.18.0.tar.gz && tar -xvf nginx-1.18.0.tar.gz && cd nginx.1.18.0 && ./configure --prefix="/usr/local/nginx-1.18.0" && make && make install
#拷贝 NGINX 配置文件
COPY nginx.repo /etc/yum.repos.d/
#更新 yum 软件包索引
RUN yum makecache fast
#yum 安装 nginx
RUN yum install -y nginx
#指定向外暴露的端口
EXPOSE 8000
#拷贝 nginx 默认配置文件
COPY default.conf /etc/nginx/conf.d/
#容器起来运行的命令
CMD /usr/local/nginx-1.18.0/sbin/nginx -g ‘daemon off;’





#当前需要的文件
[[email protected] NginxDocker]#ls
default.conf Dockerfile nginx.repo

#开始构建镜像,并查看
[[email protected] NginxDocker]#docker build -t nginx_d:v7 .
[[email protected] NginxDocker]#docker images

#实例化出容器,并查看
[[email protected] NginxDocker]#docker run -dit --name nginx_d -p 80:80 nginx_d:v7 sh
[[email protected] NginxDocker]#docker ps

#进入容器,开启 “nginx” 服务,并验证
[[email protected] NginxDocker]#docker exec -it nginx_d bash
[[email protected] /]#nginx
[[email protected] NginxDocker]#curl 127.0.0.1:80

#发现通过访问nginx也可以进入Django页面
           

继续阅读