文章目录
- 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构建镜像
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 等指令
二、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 sorex@163.com
MAINTAINER Jasper Xu <sorex@163.com>
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"]
#注:
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 :
6、COPY
功能类似 ADD ,但是是不会自动解压文件,也不能访问网络资源(将文件复制到镜像)
#功能描述:
只支持复制文件到镜像中,不支持解压功能
#语法:
COPY < src>… < dest>
COPY [“< src>”,… “< dest>”]
#示列:
COPY hzl absoluteDir/
#注:
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
#注:
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镜像文件
-----------------------------------------------------------------------------------------------------
[root@hzl 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)
[root@hzl 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)
[root@hzl 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)#构建镜像
[root@hzl 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)#查看生成的镜像
[root@hzl nginx]# docker images |grep nginx_lnmp
nginx_lnmp v1 ce2cb9bc6cc3 53
【构建php镜像】
1)#创建PHP镜像文件
--------------------------------------------------------------------------------------------------
[root@hzl 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前台运行命令
---------------------------------------------------------------------------------------------------------------------------------------
[root@hzl 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官方源
[root@hzl php]# cp /etc/yum.repos.d/php.repo .
[root@hzl php]# cat php.repo
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
[root@hzl 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)
[root@hzl 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
[root@hzl 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)
[root@hzl 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)
[root@hzl php]# docker images |grep php
【数据库镜像】
#创建mysql镜像
[root@hzl 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 hzl@qq.com
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
[root@docker ~]# 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
[root@hzl nginx]# docker network create lnmp
c7ad0d637a1455ebd5ea9d08e23f5d13971a0172a910ddc8bd4649a68ee27fc4
#查看创建的网桥
[root@hzl nginx]# docker network ls |grep lnmp
4ead920b47c7 lnmp bridge local
3)#运行容器并创建数据库(mysql5.7)
[root@docker mysql]# docker run -d -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=wordpress --network lnmp --name mysql mysql:5.7
840cdb23efceb5d894f92b280aa247ef2d656f015f5950c4927dbae49305ad42
[root@docker 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)
[root@docker tmp]# docker exec -it mysql bash
root@840cdb23efce:/# mysql -uroot -p123
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wordpress |
+--------------------+
5 rows in set (0.00 sec)
5)#运行创建php容器(php)
[root@docker ]# docker run -d -v /tmp/html:/usr/share/nginx/html --network lnmp --name php php_lnmp:v1
a67d5e25f7dd228ab2a712005d15823fb22a0ad8c30d36bfb8d713f08074d2e2
[root@docker php]# docker ps |grep php
a67d5e25f7dd php_lnmp:v1 "php-fpm" 20 seconds ago Up 19 seconds 9000/tcp php
6)#运行创建nginx容器(nginx)
[root@docker nginx]# docker run -d -p 80:80 -v /tmp/html/:/usr/share/nginx/html --name nginx --network lnmp nginx_lnmp:v1
2e752f264faef9d7e8c2f8e2c214f8e62eb4ac23dceeaa24021bb83eba3ad6a7
[root@docker 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)#项目文件
[root@docker ~]# mkdir /tmp/html/
[root@docker ~]# tar xf latest-zh_CN.tar.gz -C /tmp/
[root@docker html]# cd /tmp/
[root@docker html]# mv /tmp/wordpress/* /tmp/html
8)#使用浏览器访问
五、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 文件
[root@hzl ~]# 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)#构建镜像
[root@hzl ~]# docker build -t install/nginx:v1
#查看刚刚构建的镜像, 然后实例容器
[root@hzl ~]# docker images
[root@hzl ~]# docker run -dit install/nginx:v1 sh
#查看刚刚实例出的容器, 并进入到容器中
[root@hzl ~]# docker exec -it 94f8e35f3357 bash
#检测nginx是否部署成功
[root@hzl ~]# crul 127.0.0.1 #出现 html 代码说明部署成功
4)#在容器中编译安装 nginx 服务
#编辑 Dockerfile 文件
[root@hzl ~]# 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)#构建镜像
[root@hzl ~]# docker build -t yuan/install/nginx:v2 .
#查看是否构建成功,并实例出容器
[root@hzl ~]# docker images
[root@hzl ~]# docker run -dit --name yuan_nginx yuan/install/nginx:v2 sh
#查看容器是否启动成功, 并测试 nginx
[root@hzl ~]# docker exec yuan_nginx crul 127.0.0.1 #出现html代码说明部署成功
6)#构建以 Centos 为依赖镜像并安装 Django 的服务
#首先构建一个Dockerfile文件
[root@hzl ~]#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)#构建镜像
[root@hzl ~]#docker build -t test333:v1 .
#查看并使用镜像实例化出容器
[root@hzl ~]#docker images
[root@hzl ~]#docker run -dit --name test001 -p 9999:8080 test333:v1 sh
#查看刚开启的容器,并进入容器启动 Django 服务
[root@hzl ~]#docker exec -it test001 bash
[root@80f1315c030c ~]# 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 文件
[root@hzl ~]# 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)#构建镜像
[root@hzl ~]#docker build -t jjjj .
#查看并使用镜像实例化出容器
[root@hzl ~]#docker images
[root@hzl ~]#docker run -dit --name jjjjtest -p 4444:7777 jjjj:latest sh
#查看刚开启的容器,并进入容器启动 Django 服务
[root@hzl ~]#docker exec -it jjjtest bash
root@b85f93fcc114:~# 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” 文件
[root@hzl 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
[root@hzl DjangoDocker]#ls
app Dockerfile #这两个文件, “app” 在上一个例子中有构建
#构建镜像,并查看
[root@hzl DjangoDocker]#docker build -t python_django:v6 .
[root@hzl DjangoDocker]#docker images
#实例出容器,并查看
[root@hzl DjangoDocker]#docker run -dit --name p_d_test1 -p 8888:8080 python_django:v6 sh
6906ff9e3ec0f9d583eb27890d82c79deff4358a43e5f1ec768a702547d020bf
[root@hzl DjangoDocker]#docker ps
#进到容器里面,开启服务,再测试
[root@hzl DjangoDocker]#docker exec -it p_d_test1 bash
root@6906ff9e3ec0:~# python3 manage.py runserver 0.0.0.0:8080
[root@hzl DjangoDocker]#curl 127.0.0.1:8888
12)#然后来编写 nginx 服务以及代理配置
#编写 “nginx.repo” 文件
[root@hzl 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"配置)
[root@hzl 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” 文件
[root@hzl 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;’
#当前需要的文件
[root@hzl NginxDocker]#ls
default.conf Dockerfile nginx.repo
#开始构建镜像,并查看
[root@hzl NginxDocker]#docker build -t nginx_d:v7 .
[root@hzl NginxDocker]#docker images
#实例化出容器,并查看
[root@hzl NginxDocker]#docker run -dit --name nginx_d -p 80:80 nginx_d:v7 sh
[root@hzl NginxDocker]#docker ps
#进入容器,开启 “nginx” 服务,并验证
[root@hzl NginxDocker]#docker exec -it nginx_d bash
[root@51f54c1d5abb /]#nginx
[root@hzl NginxDocker]#curl 127.0.0.1:80
#发现通过访问nginx也可以进入Django页面