目录
1. docker是什么
Docker是一个开源的容器引擎,它基于LXC容器技术,使用Go语言开发。
源代码托管在Github上,并遵从Apache2.0协议。
Docker采用C/S架构,其可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
简单来说:Docker就是一种快速解决生产问题的一种技术手段。
优点:
环境部署速度快、安全
轻量级应用,一次打包到处运行
管理成本低
缺点:
依赖操作系统,依赖网络
Docker 官网:http://www.docker.com
Github Docker 源码:https://github.com/docker/docker
2. 部署docker
安装部署请查看:CentOS7.6安装docker
3. 镜像管理
Docker镜像是什么?它是一个只读的文件,就类似于我们安装操作系统时候所需要的那个iso光盘镜像,通过运行这个镜像来完成各种应用的部署。
这里的镜像就是一个能被docker运行起来的一个程序。
3.1 搜索、查看、获取、历史
搜索镜像
命令格式:
docker search [image_name]
获取镜像
命令格式:
docker pull [image_name]
# 或者
docker image pull [image_name]
注释:获取的镜像文件在/var/lib/docker 目录下
查看镜像
命令格式:
docker images <image_name>
#或者
docker image ls <image_name>
镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。TAG信息来区分不同发行版本,如果不指定具体标记,默认使用latest标记信息
docker images -a 列出所有的本地的images(包括已删除的镜像记录)
查看镜像历史
docker history [image_name]
我们获取到一个镜像,想知道他默认启动了哪些命令或者都封装了哪些系统层,那么我们可以使用docker history这条命令来获取我们想要的信息
3.2 重命名、删除
命令格式:
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"
3.3 导出、导入
导出镜像
将已经下载好的镜像,导出到本地,以备后用。
命令格式:
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 不能指定镜像的名称
4. 容器管理
容器是什么?
容器就类似于我们运行起来的一个操作系统,而且这个操作系统启动了某些服务。
这里的容器指的是运行起来的一个Docker镜像。
4.1 查看、启动容器
查看容器
命令格式:
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]
4.2 关闭、删除容器
关闭容器
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)
4.3 进入、退出容器
创建并进入容器
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
4.4 基于容器创建镜像
命令格式:
docker commit -m '改动信息' -a "作者信息" [container_id] [new_image:tag]
4.5 日志、信息
查看容器运行日志
docker logs [容器id]
查看容器详细信息
docker inspect [容器id]
查看容器网络信息
docker container inspect -f '{{.NetworkSettings.IPAddress}}' [容器id]
5. 仓库管理
5.1 仓库简介
Docker仓库
Docker的仓库有三大类:
公有仓库:Docker hub、Docker cloud、等
私有仓库:registry、harbor等
本地仓库:在当前主机存储镜像的地方。
相关命令
和仓库相关的命令:
docker login [仓库名称]
docker pull [镜像名称]
docker push [镜像名称]
docker search [镜像名称]
5.2 私有仓库部署
创建仓库流程
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
6. 数据管理
docker的镜像是只读的,虽然依据镜像创建的容器可以进行操作,但是我们不能将数据保存到容器中,因为容器会随时关闭和开启,那么如何将数据保存下来呢?答案就是:数据卷和数据卷容器
6.1 数据卷简介
就是将宿主机的某个目录,映射到容器中,作为数据存储的目录,我们就可以在宿主机对数据进行存储,缺点是:太单一
docker 数据卷命令详解
# docker run --help
。。。
-v, --volume list Bind mount a volume (default [])
挂载一个数据卷,默认为空
我们可以使用命令 docker run 用来创建容器,可以在使用docker run 命令时添加 -v 参数,就可以创建并挂载一个到多个数据卷到当前运行的容器中。
-v 参数的作用是将宿主机的一个目录(绝对路径)作为容器的数据卷挂载到docker容器中,使宿主机和容器之间可以共享一个目录,如果本地路径不存在,Docker也会自动创建。
-v 宿主机文件:容器文件
6.2 数据卷实践
关于数据卷的管理我们从两个方面来说:
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
6.3 数据卷容器简介
什么是数据卷容器?
将宿主机的某个目录,使用容器的方式来表示,然后其他的应用容器将数据保存在这个容器中,达到大批量应用数据同时存储的目的
docker 数据卷命令详解
# docker run --help
。。。
-v, --volumes-from value Mount volumes from the specified container(s) (default [])
从指定的容器挂载卷,默认为空
数据卷容器操作流程
如果使用数据卷容器,在多个容器间共享数据,并永久保存这些数据,需要有一个规范的流程才能做得到:
1、创建数据卷容器
2、其他容器挂载数据卷容器
注意:数据卷容器不启动
6.4 数据卷容器实践
创建一个数据卷容器
命令格式:
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/
~#
结果证明:容器间可以共享数据卷里容器,不过数据是保存在数据卷内,并没有保存到宿主机的文件目录中
7 网络管理
7.1 端口映射详解
端口映射简介
默认情况下,容器和宿主机之间网络是隔离的,我们可以通过端口映射的方式,将容器中的端口,映射到宿主机的某个端口上。这样我们就可以通过 宿主机的ip+port的方式来访问容器里的内容
端口映射种类
1、随机映射 -P(大写)
2、指定映射 -p 宿主机端口:容器端口
注意:
生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突,
不管哪种映射都会影响性能,因为涉及到映射
7.2 随机映射实践
默认随机映射
命令格式:
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
检查效果
7.3 指定映射实践
指定端口映射
命令格式:
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
查看容器进程
8. Docker 进阶
8.1 Dockerfile简介
什么是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存放位置,如果是当前目录,则用 .(点)表示
8.2 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 dashuai@qq.com
# 执行命令
# 增加软件源 -- 由于网络原因,我们不执行这一步
# 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
8.3 基础指令详解
基础指令
FROM
FROM <image>
FROM <image>:<tag>。
解释:
FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
MAINTAINER
MAINTAINER <name>
解释:
指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息
RUN
RUN <command> (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 <port> [<port>...]
解释:
设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容
器时增加-p或者-P参数对容器的端口进行分配。
ENTRYPOINT
ENTRYPOINT ["executable", "param1","param2"] (exec 模式)
ENTRYPOINT command param1 param2 (shell模式)
解释:
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
8.4 文件编辑指令详解
目录文件编辑指令
ADD
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
解释:
将指定的 <src> 文件复制到容器文件系统中的 <dest>
src 指的是宿主机,dest 指的是容器
如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。
COPY
格式:
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
解释:
单纯复制文件场景,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/"]
...
8.5 环境指令详解
环境设置指令
ENV
格式:
ENV <key> <value>
ENV <key>=<value> ...
解释:
设置环境变量,可以在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"]
8.6 Dockerfile构建过程
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 000000@qq.com
# 创建构建刷新时间
ENV REFRESH_DATE 2018-11-02
# 执行命令
...
构建历史:
查看构建过程查看
docker history
清理构建缓存:
docker system prune
docker system prune --volumes
8.7 Dockerfile构建django环境
8.7.1 手工部署django项目环境
需求:
基于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 root@192.168.8.14:/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/
8.7.2 Dockerfile案例实践
环境分析:
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 000000@qq.com
# 执行命令
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
访问镜像,查看效果