目录
1. docker是什么
2. 部署docker
3. 镜像管理
3.1 搜索、查看、获取、历史
3.2 重命名、删除
3.3 导出、导入
4. 容器管理
4.1 查看、启动容器
4.2 关闭、删除容器
4.3 进入、退出容器
4.4 基于容器创建镜像
4.5 日志、信息
5. 仓库管理
5.1 仓库简介
5.2 私有仓库部署
6. 数据管理
6.1 数据卷简介
6.2 数据卷实践
6.3 数据卷容器简介
6.4 数据卷容器实践
7 网络管理
7.1 端口映射详解
7.2 随机映射实践
7.3 指定映射实践
8. Docker 进阶
8.1 Dockerfile简介
8.2 Dockerfile快速入门
8.3 基础指令详解
8.4 文件编辑指令详解
8.5 环境指令详解
8.6 Dockerfile构建过程
8.7 Dockerfile构建django环境
8.7.1 手工部署django项目环境
8.7.2 Dockerfile案例实践
Docker是一个开源的容器引擎,它基于LXC容器技术,使用Go语言开发。
源代码托管在Github上,并遵从Apache2.0协议。
Docker采用C/S架构,其可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
简单来说:Docker就是一种快速解决生产问题的一种技术手段。
优点:
环境部署速度快、安全
轻量级应用,一次打包到处运行
管理成本低
缺点:
依赖操作系统,依赖网络
Docker 官网:http://www.docker.com
Github Docker 源码:https://github.com/docker/docker
安装部署请查看:CentOS7.6安装docker
Docker镜像是什么?它是一个只读的文件,就类似于我们安装操作系统时候所需要的那个iso光盘镜像,通过运行这个镜像来完成各种应用的部署。
这里的镜像就是一个能被docker运行起来的一个程序。
搜索镜像
命令格式:
docker search [image_name]
获取镜像
命令格式:
docker pull [image_name]
# 或者
docker image pull [image_name]
注释:获取的镜像文件在/var/lib/docker 目录下
查看镜像
命令格式:
docker images
#或者
docker image ls
镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。TAG信息来区分不同发行版本,如果不指定具体标记,默认使用latest标记信息
docker images -a 列出所有的本地的images(包括已删除的镜像记录)
查看镜像历史
docker history [image_name]
我们获取到一个镜像,想知道他默认启动了哪些命令或者都封装了哪些系统层,那么我们可以使用docker history这条命令来获取我们想要的信息
镜像重命名
命令格式:
docker tag [old_image]:[old_version] [new_image]:[new_version]
删除镜像
命令格式:
docker rmi [image_id/image_name:image_version]
# 或者
docker image rm [image_id/image_name:image_version]
注意:如果一个image_id存在多个名称,那么应该使用name:tag的格式删除镜像,清除状态为dangling的镜像
# 清理不再使用的docker镜像(none镜像)-a移除所有
docker image prune
# 删除部分镜像
docker image prune -a --filter "until=24h"
导出镜像
将已经下载好的镜像,导出到本地,以备后用。
命令格式:
docker save -o [包文件] [镜像]
docker save [镜像1] ... [镜像n] > [包文件]
或者
docker image save –o [包文件] [镜像1] ... [镜像n]
docker image save [镜像1] ... [镜像n] > [包文件]
注意:docker save 会保存镜像的所有历史记录和元数据信息
导入镜像
命令格式:
docker load < [image.tar_name]
docker load --input [image.tar_name]
注意: docker load 不能指定镜像的名称
容器是什么?
容器就类似于我们运行起来的一个操作系统,而且这个操作系统启动了某些服务。
这里的容器指的是运行起来的一个Docker镜像。
查看容器
命令格式:
docker ps
# 或者
docker container ls
注意:管理docker容器可以通过名称,也可以通过ID,ps是显示正在运行的容器, -a是显示所有运行过的容器,包括已经不运行的容器
启动容器
命令格式:
docker run <参数,可选> [docker_image] [执行的命令]
# 或
docker container run <参数,可选> [docker_image] [执行的命令]
# 守护进程方式启动容器
docker run -d [docker_image]
启动已终止的容器:在生产过程中,常常会出现运行和不运行的容器,我们使用 start 命令开起一个已关闭的容器
docker start [container_id]
# 或
docker container start [container_id]
关闭容器
docker stop [container_id]
# 或
docker container stop [container_id]
删除容器
正常删除容器:
docker rm [container_id]
# 或
docker container rm [container_id]
删除所有已停止的容器
docker container prune
强制删除运行容器
docker rm -f [container_id]
删除部分容器
docker container prune --filter "until=24h"
拓展批量关闭容器
docker rm -f $(docker ps -a -q)
创建并进入容器
docker run --name [container_name] -it [docker_image] /bin/bash
# 或者
docker container run --name [container_name] -it [docker_image] /bin/bash
docker 容器启动命令参数详解:
--name:给容器定义一个名称
-i:则让容器的标准输入保持打开。
-t:让docker分配一个伪终端,并绑定到容器的标准输入上
/bin/bash:执行一个命令
退出容器:
方法一:exit
方法二:Ctrl + D
手工方式进入容器
docker exec -it 容器id /bin/bash
# 或者
docker container exec -it 容器id /bin/bash
命令格式:
docker commit -m '改动信息' -a "作者信息" [container_id] [new_image:tag]
查看容器运行日志
docker logs [容器id]
查看容器详细信息
docker inspect [容器id]
查看容器网络信息
docker container inspect -f '{{.NetworkSettings.IPAddress}}' [容器id]
Docker仓库
Docker的仓库有三大类:
公有仓库:Docker hub、Docker cloud、等
私有仓库:registry、harbor等
本地仓库:在当前主机存储镜像的地方。
相关命令
和仓库相关的命令:
docker login [仓库名称]
docker pull [镜像名称]
docker push [镜像名称]
docker search [镜像名称]
创建仓库流程
1、根据registry镜像创建容器
2、配置仓库权限
3、提交镜像到私有仓库
4、测试
实施方案
下载registry镜像
docker pull registry
启动仓库容器
docker run -d -p 5000:5000 registry
检查容器效果
curl 127.0.0.1:5000/v2/_catalog
配置容器权限
vim /etc/docker/daemon.json
{"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": ["192.168.8.14:5000"]}
注意:私有仓库的ip地址是宿主机的ip,而且ip两侧有双引号
重启docker服务
systemctl restart docker
systemctl status docker
效果查看
启动容器
docker start 315b5422c699
标记镜像
docker tag ubuntu-mini 192.168.8.14:5000/ubuntu-14.04-mini
提交镜像
docker push 192.168.8.14:5000/ubuntu-14.04-mini
下载镜像
docker pull 192.168.8.14:5000/ubuntu-14.04-mini
docker的镜像是只读的,虽然依据镜像创建的容器可以进行操作,但是我们不能将数据保存到容器中,因为容器会随时关闭和开启,那么如何将数据保存下来呢?答案就是:数据卷和数据卷容器
就是将宿主机的某个目录,映射到容器中,作为数据存储的目录,我们就可以在宿主机对数据进行存储,缺点是:太单一
docker 数据卷命令详解
# docker run --help
。。。
-v, --volume list Bind mount a volume (default [])
挂载一个数据卷,默认为空
我们可以使用命令 docker run 用来创建容器,可以在使用docker run 命令时添加 -v 参数,就可以创建并挂载一个到多个数据卷到当前运行的容器中。
-v 参数的作用是将宿主机的一个目录(绝对路径)作为容器的数据卷挂载到docker容器中,使宿主机和容器之间可以共享一个目录,如果本地路径不存在,Docker也会自动创建。
-v 宿主机文件:容器文件
关于数据卷的管理我们从两个方面来说:
1、目录
2、普通文件
数据卷实践 之 目录
docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录] [镜像名称] [命令(可选)]
命令演示:
创建测试文件
echo "file1" > /tmp/file1.txt
启动一个容器,挂载数据卷
docker run -itd --name test1 -v /tmp:/test1 nginx
测试效果
~# docker exec -it a53c61c77 /bin/bash
root@a53c61c77bde:/# cat /test1/file1.txt
file1
数据卷实践 之 文件
docker run -itd --name [容器名字] -v [宿主机文件]:[容器文件] [镜像名称] [命令(可选)]
注意:容器里面的文件虽然可以改名,但类型必须和宿主机文件一致
命令演示:
创建测试文件
echo "file1" > /tmp/file1.txt
启动一个容器,挂载数据卷
docker run -itd --name test2 -v /tmp/file1.txt:/nihao/nihao.sh nginx
测试效果
~# docker exec -it 84c37743 /bin/bash
root@84c37743d339:/# cat /nihao/nihao.sh
file1
数据卷实践 之 删除
docker volume rm
docker volume prune
什么是数据卷容器?
将宿主机的某个目录,使用容器的方式来表示,然后其他的应用容器将数据保存在这个容器中,达到大批量应用数据同时存储的目的
docker 数据卷命令详解
# docker run --help
。。。
-v, --volumes-from value Mount volumes from the specified container(s) (default [])
从指定的容器挂载卷,默认为空
数据卷容器操作流程
如果使用数据卷容器,在多个容器间共享数据,并永久保存这些数据,需要有一个规范的流程才能做得到:
1、创建数据卷容器
2、其他容器挂载数据卷容器
注意:数据卷容器不启动
创建一个数据卷容器
命令格式:
docker create -v [容器数据卷目录] --name [容器名字] [镜像名称] [命令(可选)]
执行效果
docker create -v /data --name v-test nginx
创建两个容器,同时挂载数据卷容器
命令格式:
docker run --volumes-from [数据卷容器id/name] -tid --name [容器名字] [镜像名称] [命令(可选)]
执行效果:
创建 vc-test1 容器
docker run --volumes-from 4693558c49e8 -tid --name vc-test1 nginx /bin/bash
创建 vc-test2 容器
docker run --volumes-from 4693558c49e8 -tid --name vc-test2 nginx /bin/bash
确认卷容器共享
进入vc-test1,操作数据卷容器
~# docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
root@c408f4f14786:/# echo 'v-test1' > /data/v-test1.txt
root@c408f4f14786:/# exit
进入vc-test2,确认数据卷
~# docker exec -it vc-test2 /bin/bash
root@7448eee82ab0:/# ls /data/
v-test1.txt
root@7448eee82ab0:/# echo 'v-test2' > /data/v-test2.txt
root@7448eee82ab0:/# exit
回到vc-test1进行验证
~# docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
v-test1.txt v-test2.txt
root@c408f4f14786:/# cat /data/v-test2.txt
v-test2
回到宿主机查看/data/目录
~# ls /data/
~#
结果证明:容器间可以共享数据卷里容器,不过数据是保存在数据卷内,并没有保存到宿主机的文件目录中
端口映射简介
默认情况下,容器和宿主机之间网络是隔离的,我们可以通过端口映射的方式,将容器中的端口,映射到宿主机的某个端口上。这样我们就可以通过 宿主机的ip+port的方式来访问容器里的内容
端口映射种类
1、随机映射 -P(大写)
2、指定映射 -p 宿主机端口:容器端口
注意:
生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突,
不管哪种映射都会影响性能,因为涉及到映射
默认随机映射
命令格式:
docker run -d -P [镜像名称]
命令效果:
启动一个 nginx 镜像
docker run -d -P nginx
查看效果
注意:
宿主机的32768被映射到容器的80端口,-P 自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动随机选择,但是如果连续启动多个容器的话,则下一个容器的端口默认是当前容器占用端口号+1
在浏览器中访问 http://192.168.8.14:32768/,效果显示:
注意:浏览器输入的格式是: docker容器宿主机的ip:容器映射的端口
指定主机随机映射
令格式
docker run -d -p [宿主机ip]::[容器端口] --name [容器名称] [镜像名称]
命令效果
docker run -d -p 192.168.8.14::80 --name nginx-2 nginx
检查效果
指定端口映射
命令格式:
docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字] [镜像名称]
注意:
如果不指定宿主机ip的话,默认使用 0.0.0.0,
容器端口必须清楚,而且必须写出来
命令实践:
现状我们在启动容器的时候,给容器指定一个访问的端口 1199
docker run -d -p 192.168.8.14:1199:80 --name nginx-1 nginx
查看新容器ip
docker inspect --format='{{.NetworkSettings.IPAddress}}' 0ad3acfbfb76
查看容器端口映射
查看宿主机开启端口
查看浏览器效果:
多端口映射方法
命令格式
docker run -d -p [宿主机端口1]:[容器端口1] -p [宿主机端口2]:[容器端口2] --name [容器名称] [镜像名称]
开起多端口映射实践
docker run -d -p 520:443 -p 6666:80 --name nginx-3 nginx
查看容器进程
什么是Dockerfile
Dockerfile类似于我们学习过的脚本,将我们在上面学到的docker镜像,使用自动化的方式实现出来。
Dockerfile的作用
1、找一个镜像: ubuntu
2、创建一个容器: docker run ubuntu
3、进入容器: docker exec -it 容器 命令
4、操作: 各种应用配置
....
5、构造新镜像: docker commit
Dockerfile 使用准则
1、大: 首字母必须大写D
2、空: 尽量将Dockerfile放在空目录中。
3、单: 每个容器尽量只有一个功能。
4、少: 执行的命令越少越好。
Dockerfile 基础四指令:
基础镜像信息 从哪来?
维护者信息 我是谁?
镜像操作指令 怎么干?
容器启动时执行指令 嗨!!!
Dockerfile使用命令:
构建镜像命令格式:
docker build -t [镜像名]:[版本号] [Dockerfile所在目录]
构建样例:
docker build -t nginx:v0.2 /opt/dockerfile/nginx/
参数详解:
-t 指定构建后的镜像信息,
/opt/dockerfile/nginx/ 则代表Dockerfile存放位置,如果是当前目录,则用 .(点)表示
准备环境
创建Dockerfile专用目录
mkdir /docker/images/ssh -p
cd /docker/images/ssh
创建秘钥认证
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub > authorized_keys
准备软件源
cp /etc/apt/sources.list ./
定制文件
创建Dockerfile文件
# 构建一个基于ubuntu的ssh定制镜像
# 基础镜像
FROM ubuntu-ssh
# 镜像作者
MAINTAINER dashuai [email protected]
# 执行命令
# 增加软件源 -- 由于网络原因,我们不执行这一步
# ADD sources.list /etc/apt/sources.list
# 安装 ssh 服务
RUN apt-get update && apt-get install -y openssh-server curl vim net-tools && mkdir -p /var/run/sshd && mkdir -p /root/.ssh && sed -i "s/.*pam_loginuid.so/#&/" /etc/pam.d/sshd && apt-get autoclean && apt-get clean && apt-get autoremove
# 复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
# 对外端口
EXPOSE 22
# 启动ssh
ENTRYPOINT ["/usr/sbin/sshd","-D"]
构建镜像
docker build -t ubuntu-ssh .
效果查看
使用新镜像启动一个容器,查看效果
docker run -d -p 10086:22 ubuntu-ssh
容器检查
docker ps
docker port c03d146b64d4
ssh查看效果
ssh 192.168.8.14 -p 10086
注意: 若出现“sign_and_send_pubkey: signing failed: agent refused operation报错”
执行代码解决: eval "$(ssh-agent -s)"
ssh-add
基础指令
FROM
FROM
FROM :。
解释:
FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
MAINTAINER
MAINTAINER
解释:
指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息
RUN
RUN (shell模式)
RUN["executable", "param1", "param2"]。 (exec 模式)
解释:
表示当前镜像构建时候运行的命令
注释:
shell模式:类似于 /bin/bash -c command
举例: RUN echo hello
exec 模式:类似于 RUN ["/bin/bash", "-c", "command"]
举例: RUN ["echo", "hello"]
EXPOSE
EXPOSE [...]
解释:
设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容
器时增加-p或者-P参数对容器的端口进行分配。
ENTRYPOINT
ENTRYPOINT ["executable", "param1","param2"] (exec 模式)
ENTRYPOINT command param1 param2 (shell模式)
解释:
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
目录文件编辑指令
ADD
格式:
ADD ...
ADD ["",... ""]
解释:
将指定的 文件复制到容器文件系统中的
src 指的是宿主机,dest 指的是容器
如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。
COPY
格式:
COPY ...
COPY ["",... ""]
解释:
单纯复制文件场景,Docker推荐使用COPY
VOLUME
格式:
VOLUME ["/data"]
解释:
VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点
通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
举例:
VOLUME ["/var/lib/tomcat7/webapps/"]
ADD实践
拷贝普通文件
Dockerfile文件内容
...
# 执行命令
...
# 增加文件
ADD ["sources.list","/etc/apt/sources.list"]
...
拷贝压缩文件
Dockerfile文件内容
...
# 执行命令
...
# 增加文件
ADD ["linshi.tar.gz","/nihao/"]
...
COPY实践
修改Dockerfile文件内容:
...
# 执行命令
...
# 增加文件
COPY index.html /var/www/html/
...
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
VOLUME实践
修改Dockerfile文件内容:
# 在上一个Dockerfile文件内容基础上,在COPY下面增加一个VOLUME
VOLUME ["/data/"]
...
环境设置指令
ENV
格式:
ENV
ENV = ...
解释:
设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定
WORKDIR
格式:
WORKDIR /path/to/workdir (shell 模式)
解释:
切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd
可以多次切换(相当于cd命令),
也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
举例:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为 /a/b/c。
ENV实践
修改Dockerfile文件内容:
# 在上一个Dockerfile文件内容基础上,在RUN下面增加一个ENV
ENV NIHAO=helloworld
WORKDIR实践
修改Dockerfile文件内容:
# 在上一个Dockerfile文件内容基础上,在RUN下面增加一个WORKDIR
WORKDIR /nihao/itcast/
RUN ["touch","itcast.txt"]
Dockerfile构建过程:
从基础镜像1运行一个容器A
遇到一条Dockerfile指令,都对容器A做一次修改操作
执行完毕一条命令,提交生成一个新镜像2
再基于新的镜像2运行一个容器B
遇到一条Dockerfile指令,都对容器B做一次修改操作
执行完毕一条命令,提交生成一个新镜像3
...
构建过程镜像介绍
构建过程中,创建了很多镜像,这些中间镜像,我们可以直接使用来启动容器,通过查看容器效果,从侧面能看到我们每次构建的效果。提供了镜像调试的能力,我们可以通过docker history <镜像名> 来查看整个构建过程所产生的镜像
拓展:执行的步骤越多越好呢?还是越少越好?
构建缓存
我们第一次构建很慢,之后的构建都会很快,因为他们用到了构建的缓存。
不适用构建缓存方法常见两种:
全部不同缓存:docker build --no-cache -t [镜像名]:[镜像版本] [Dockerfile位置]
只要构建的缓存时间不变,那么就用缓存,如果时间一旦改变,就不用缓存了
样例:
# 构建一个基于ubuntu-base的docker定制镜像
# 基础镜像
FROM ubuntu-base
# 镜像作者
MAINTAINER President.Wang [email protected]
# 创建构建刷新时间
ENV REFRESH_DATE 2018-11-02
# 执行命令
...
构建历史:
查看构建过程查看
docker history
清理构建缓存:
docker system prune
docker system prune --volumes
需求:
基于docker镜像,手工部署django项目环境
方案分析:
1、docker环境部署
2、django环境部署
3、djanog项目部署
4、测试
技术关键点:
1、docker环境部署
使用docker镜像启动一个容器即可
2、django环境部署
django软件的依赖环境
django软件的基本环境配置
3、django项目部署
django框架的下载
项目文件配置
启动django项目
4、测试
宿主机测试
解决方案:
1、docker环境配置
1.1 获取docker镜像
1.2 启动docker容器
2、django环境部署
2.1 基础环境配置
2.2 django环境配置
3、django项目部署
3.1 创建django项目
3.2 创建django应用
3.3 项目启动
4、测试
4.1 宿主机测试
方案实施:
1、docker环境配置
1.1 获取docker镜像:ubuntu-ssh
1.2 启动docker容器
启动容器,容器名称叫 django
docker run -d -p 10086:22 --name django ubuntu-ssh
进入容器
ssh 192.168.8.14 -p 10086
2、django环境部署
2.1 基础环境配置
基础目录环境
mkdir /data/{server,softs} -p
cd /data/softs
scp [email protected]:/data/softs/Django-2.1.2.tar.gz ./
注意:因为我们的docker镜像就是唯一的,所以就没有必要单独创建python虚拟环境了
2.2 django环境配置
安装基本依赖软件
yum install python3-pip -y
安装django软件
cd /data/softs
tar xf Django-2.1.2.tar.gz
cd Django-2.1.2
python3 setup.py install
3、django项目部署
3.1 创建django项目
创建项目
cd /data/server
django-admin startproject djangotest
3.2 创建django应用
创建应用
cd /data/server/djangotest
python3 manage.py startapp test1
注册应用
# vim itcast/settings.py
INSTALL_APP = [
。。。
'test1',
]
配置应用
admin-1@python:/data/soft# cat /data/server/djangotest/test1/views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def hello(resquest):
return HttpResponse("itcast V1.0")
url文件配置
admin-1@python:/data/soft# cat /data/server/djangotest/djangotest/urls.py
...
from test1.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', hello),
]
3.3 项目启动
设置访问主机
# vim itcast/settings.py
...
ALLOWED_HOSTS = ['*']
启动项目
python3 manage.py runserver 172.17.0.2:8000
注意:
要提前用ifconfig来检查一下当前容器的IP地址,以方面接下来的测试
4、测试
4.1宿主机测试
查看容器的ip地址
docker inspect django
浏览器、或curl查看效果:
172.17.0.2:8000/hello/
环境分析:
1、软件源文件,使用国外源,速度太慢,所以我们可以自己使用国内的软件源。
因为我们在手工部署的时候,使用的是官方(国外)的源,所以为了部署快一点呢,我使用国内的源。
2、软件安装,涉及到了各种软件
3、软件运行涉及到了软件的运行目录
4、项目访问,涉及到端口
关键点分析:
1、增加文件,使用 ADD 或者 COPY 指令
2、安装软件,使用 RUN 指令
3、命令运行,使用 WORKDIR 指令
4、项目端口,使用 EXPOSE 指令
5、容器运行,使用 ENTRYPOINT
定制方案:
1、基于ubuntu-ssh基础镜像进行操作
2、安装环境基本软件
3、定制命令工作目录,并增加文件
4、开放端口
5、执行项目
Dockerfile定制
进入标准目录
mkdir /docker/images/django -p
cd /docker/images/django
第一版dockerfile内容
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu-ssh
# 镜像作者
MAINTAINER President.Wang [email protected]
# 执行命令
RUN apt-get install python3-pip -y
# 增加文件
ADD Django-2.1.2.tar.gz /data/softs/
WORKDIR /data/softs/Django-2.1.2
RUN python3 setup.py install
# 创建项目
WORKDIR /data/server
RUN django-admin startproject itcast
# 创建应用
WORKDIR /data/server/djangotest
RUN python3 manage.py startapp test1
RUN sed -i "/staticfiles/a\ 'test1'," djangotest/settings.py
# 配置应用
COPY views.py /data/server/djangotest/test1/
RUN sed -i '/t p/a\from test1.views import *' djangotest/urls.py
RUN sed -i "/\]/i\ path('hello/', hello)," djangotest/urls.py
# 启动项目
RUN sed -i "s#S = \[\]#S = \['*'\]#" djangotest/settings.py
# 对外端口
EXPOSE 8000
# 运行项目
ENTRYPOINT ["python3","manage.py","runserver","0.0.0.0:8000"]
把Django-2.1.2.tar.gz和views.py文件放到这个目录中
效果查看
构建镜像
docker build -t ubuntu-django .
运行镜像
docker run -p 8000:8000 -d ubuntu-django
访问镜像,查看效果