Docker打包应用部署
centos 安装docker
其他操作系统自行百度
Image 文件
Docker把应用程序及其依赖打包在一个image文件里面,可以理解为一个容器的说明书. 通过这个image文件可以生成容器的实例.同一个image文件可以生成同时运行的多个实例.
image文件是一个二进制文件,实际上,一个image文件往往继承自另外一个image文件,加上一些个性化设置而成.举例来说:你可以在ubuntu的image基础上加上Apache服务器,形成你自己的image.
# 列出本机的所有 image 文件。
$ docker image ls
# 删除 image 文件
$ docker image rm [imageName]
并且image文件是通用的,一台机器上的image文件拷贝到另一台机器上,照样可以使用.一般来说,我们往往是使用别人制定好的image文件,及时要定制,也可以对已有的image文件进行加工,而不是从头制作,这样可以节省很多时间.
为了方便,image制作完成后,可以上传到网上的仓库,Docker 的官方仓库 https://hub.docker.com/ 是最重要、最常用的 image 仓库。此外,出售自己制作的 image 文件也是可以的。
container 容器文件
image文件生成的实例本身也是一个文件,成为容器文件.也即是说,一旦容器生成,就会存在两个文件:一个image文件,一个容器文件.而且关闭容器并不会删除容器文件,只是容器停止运行而已.
# 列出本机正在运行的容器
$ docker container ls
# 列出本机所有容器,包括终止运行的容器
ig:~ itguang$ docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
649a6b785a86 ubuntu "bash" 10 minutes ago Exited (137) 9 minutes ago loving_austin
85b9c705e73f hello-world "/hello" 10 minutes ago Exited (0) 10 minutes ago silly_lumiere
c9281ad7f7b8 ubuntu "bash" 17 minutes ago Exited (127) 11 minutes ago stupefied_curran
e06bf36259ef hello-world "/hello" 24 minutes ago Exited (0) 24 minutes ago flamboyant_chaplygin
ig:~ itguang$
可以看出,我现在已经有了四个容器,终止运行的容器文件依然会占用硬盘空间,可以使用docker container rm [container_id]命令删除.
ig:~ itguang$ docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9281ad7f7b8 ubuntu "bash" 22 minutes ago Exited (127) 17 minutes ago stupefied_curran
e06bf36259ef hello-world "/hello" 29 minutes ago Exited (0) 29 minutes ago flamboyant_chaplygin
ig:~ itguang$ docker container rm c9281ad7f7b8 e06bf36259ef
Dockerfile 文件
学会了如何使用image文件和生成容器文件之后,接下来你可能会想直到这个image文件是如何生成的呢?如果你要推广自己的软件,势必要制作自己的image文件.
这时候就要用到Dockerfile文件,他是一个文本文件,用来配置image.Docker容器根据Dockerfile文件生成image二进制文件.
下面通过一个实例,来演示如何编写Dockerfile文件生成自己的image二进制文件.
实例:制作自己的 Docker 容器
下面我以 koa-demos 项目为例,介绍怎么写 Dockerfile 文件,实现让用户在 Docker 容器里面运行 Koa 框架。
1.先下载源代码:
$ git clone https://github.com/ruanyf/koa-demos.git
$ cd koa-demos
2.编写 Dockerfile 文件
首先,在项目的根目录下,新建一个文本文件.dockerignore,写入下面的内容。
.git
node_modules
npm-debug.log
上面的代码表示,这三个路径要排除,不要打包进image文件,如果你没有路径可以排除,这个文件也可以不用建立.
然后在项目根目录下再新建一个Dockerfile文本文件,写入下面的内容:
FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
上面代码解释如下:
From node:8.4 : 该image继承自官方的node image,冒号表示标签,这里表示8.4,即8.4版本的node.
COPY . /app :将当前目录下的所有文件都拷贝到image文件的 /app 目录.
WORKDIR /app : 指定接下来的工作目录为 /app .
RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
EXPOSE 3000 : 将容器的3000 端口暴露出来,允许外部连接这个端口.
创建 image 文件.
有了 Dockerfile文件以后就可以使用 docker image build 命令创建image文件了.
$ docker image build -t koa-demo .
# 或者
$ docker image build -t koa-demo:0.0.1 .
上面代码中,-t参数用来指定image文件的名字,后面还可以用冒号指定标签,如果不指定,默认标签就是latest,最后那个.表示Dockerfile文件所在的路径.这个例子Dockerfile文件在当前路径,所以就是一个.
如果构建成功,会有如下提示信息:
...
Successfully built 979e0930e4b6
Successfully tagged koa-demo:latest
我们使用docker images 查看当前的image文件
ig:koa-demos itguang$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
koa-demo latest 979e0930e4b6 About a minute ago 676MB
ubuntu latest 452a96d81c30 8 days ago 79.6MB
hello-world latest e38bc07ac18e 3 weeks ago 1.85kB
node 8.4 386940f92d24 8 months ago 673MB
生成容器
前面讲过,docker container run 命令会从image文件生成容器,
$ docker container run -p 8000:3000 -it koa-demo /bin/bash
# 或者
$ docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash
上面各个参数解释如下:
-p : 容器的3000端口映射到本地的8000端口.
-it : 容器的shell会映射到当前本地的shell,你在本机窗口输入的命令会传入到容器中.
koa-demo:0.0.1 :image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。
/bin/bash : 容器启动以后,容器内部第一个执行的命令.这里是启用Bash,以保证用户可以使用shell
如果一切正常,运行上面的命令以后,就会返回一个命令行提示符。
root@6be4c4a279df:/app#
这表示你已经在容器里面了,返回的提示符就是容器内部的 Shell 提示符。执行下面的命令。
root@6be4c4a279df:/app# node demos/01.js
这时,Koa 框架已经运行起来了。打开本机的浏览器,访问 http://127.0.0.1:8000,网页显示”Not Found”,这是因为这个 demo 没有写路由。
这个例子中node进程运行在Docker容器的虚拟环境里面,进程接触到的文件系统和网络接口都是虚拟的,与本机文件系统和网络接口都是隔离的,因此需要定义容器与物理机的端口映射(map).
现在,在容器的命令行下,按ctrl+c停止node进程,按ctrl+d(或者exit)退出容器.此外,也可以使用docker container kill [container-id]终止容器的运行.
# 在本机的另一个终端窗口,查出容器的 ID
$ docker container ls
# 停止指定的容器运行
$ docker container kill [containerID]
也可以使用docker container run 命令的 --rm 参数,在容器终止运行后自动删除容器文件.
$ docker container run --rm -p 8000:3000 -it koa-demo /bin/bash
CMD 命令
上一节的例子里面,容器启动以后,需要手动输入命令node demos/01.js。我们可以把这个命令写在 Dockerfile 里面,这样容器启动以后,这个命令就已经执行了,不用再手动输入了。
FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
CMD node demos/01.js
上面的Dockerfile文件最后面多了一行CMD node demos/01.js,表示容器启动后,自动执行node demos/01.js.
你可能会问RUN 命令和 CMD 命令的区别是什么呢?
简单来说:RUN命令在image文件的构建阶段执行,执行结果会打包进image文件;CMD命令则是在容器启动后执行.另外一个Dockerfile文件只能包含多个RUN命令,但只能包含一个CMD命令,
注意:制定了CMD命令后,docker container run命令就不能附加命令了,比如前面的/bin/bash,否则,它会覆盖CMD命令
现在启动容器可以用下面的命令:
$ docker container run --rm -p 8000:3000 -it koa-demo:0.0.1
发布image文件
容器运行成功后,就确认了image文件的有效性,这是我们就可以考虑把image文件分享到网上.
首先,去 hub.docker.com 或 cloud.docker.com注册一个账户。然后,用下面的命令登录。
$ docker login
接着,为本地的 image 标注用户名和版本。
$ docker image tag [imageName] [username]/[repository]:[tag]
# 实例
$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1
也可以不标注用户名,重新构建一下 image 文件。
$ docker image build -t [username]/[repository]:[tag] .
最后,发布 image 文件。
$ docker image push [username]/[repository]:[tag]
发布成功以后,登录 hub.docker.com,就可以看到已经发布的 image 文件。
其他有用的命令
docker的主要用法就是上面这些,另外还有一些常见的命令:
docker container start
前面的docker container run命令是新建容器,每运行一次,就会新建一个容器.同样的命令运行两次就会生成两个一模一样的容器文件.如果希望重复使用容器,就需要使用docker container start命令,它用来启动已经生成,已经停止运行的容器文件.
$ docker container start [container_id]
docker container stop
前面的docker container kill命令终止容器的运行,相当于向容器的主进程发送SIGKILL信号,而docker container stop也是用来终止容器的运行,相当于向容器的主进程发送SIGTERM信号,然后过一段时间在发送SIGKILL信号.
$ docker container stop [container_id]
这个信号的差别就是,程序收到SIGTERM信号后,可自行进行收尾清理工作,但也可以不理会这个信号;但如果收到SIGKILL信号,就会立即终止这个容器的运行,那些正在进行的操作会全部丢失
docker container logs
docker container logs用来查看容器的输出,即容器里shell的标准输出.比如: 如果docker run命令运行容器的时候,没有使用-it参数,就要使用这个命令查看输出.
$ docker container logs [container_id]
docker container exec
docker container exec命令用于进行一个正在运行的容器.如果docker container run命令运行容器的时候,没有使用-it参数,就要使用这个命令进入进入容器,一旦进入容器,就可以在容器的shell执行命令了.
$ docker container exec [container_id] /bin/bash
docker container cp
docker container cp命令用于从正在运行的容器里,将文件拷贝到本机.下面是拷贝当前 目录的写法:
$ docker container cp [container_id]:[/path/to/file] .
************************************************************************************************************************************************
上面摘录了https://blog.csdn.net/itguangit/article/details/80222387此篇,
接下来说一下具体在python环境中如何使用,
docker 简单操作相同,在创建Dockerfile 文件是
先把自己脚本中第三方库 录入到 requirements.txt 具体方法
pip freeze > requirements.txt
文件写入:
FROM python:3.7
COPY . /app
WORKDIR /appRUN pip install -r requirements.txt
EXPOSE 3000
然后登录打包执行上传:
docker login
docker image build -t xxx/xx:tag
docker push xxx/xx:tag
部署到其他机器上:
只需要其他机器安装docker 然后下载该镜像
docker pull xxx/xx:tag
运行即可:
docker comtainer run -p 8000:3000 -it xxx/xx:tag /bin/bash
Docker打包应用部署相关推荐
- Docker打包项目部署的时候后端生成的图片验证码不显示
原因是因为大部分的docker打包教程给予的项目中的docker配置文件中的jdk依赖都不是完整版,导致会有一些包没有 所以会导致标题之类的问题 搭建教程:https://blog.csdn.ne ...
- 将你的前端应用打包成docker镜像并部署到服务器?仅需一个脚本搞定
1.前言 前段时间,自己搞了个阿里云的服务器.想自己在上面折腾,但是不想因为自己瞎折腾而污染了现有的环境.毕竟,现在的阿里云已经没有免费的快照服务了.要想还原的话,最简单的办法就是重新装系统.而一旦重 ...
- docker image name 更改_将前端应用打包成docker镜像并部署?仅需一个脚本就搞定
1.前言 前段时间,自己搞了个阿里云的服务器.想自己在上面折腾,但是不想因为自己瞎折腾而污染了现有的环境.毕竟,现在的阿里云已经没有免费的快照服务了.要想还原的话,最简单的办法就是重新装系统.而一旦重 ...
- docker 打包镜像_Spring Boot2 系列教程(四十一)部署 Spring Boot 到远程 Docker 容器
不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案. 不同于传 ...
- docker打包镜像上传_Jenkins | 一键打包部署Spring Boot 应用的Docker镜像
一.前言 1.本文主要内容 将在项目中实际使用到的相关东西整理记录一波,同时可以方便其他同学在使用到的时候参考一下(自己也备忘),有不对的地方,欢迎指出~~ Docker部署SpringBoot 项目 ...
- BI系统打包Docker镜像及部署的技术难度和实现
BI系统打包Docker镜像及部署的技术难度和实现 随着容器化技术盛行,Docker在前端领域也有着越来越广泛的应用:传统的前端部署方式需要我们将项目打包生成一系列的静态文件,然后上传到服务器,配置n ...
- docker 打包_Springboot2.0学习11 使用maven插件打包docker部署应用
一.本文目标 使用Maven插件构建SpringBoot应用的docker镜像 镜像推送至Docker Registry 启动容器 本文开发环境 : jdk1.8 maven idea SpringB ...
- docker安装以及部署springboot项目
一.docker安装 1.安装 Docker Engine-Community 安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本: ...
- Spring Boot应用的打包和部署
现在的IT开发,DevOps渐渐获得技术管理人员支持.云计算从ECS转向Docker容器技术.微服务的概念和讨论也越来越热,以上这些研究方面,最终都聚焦于软件的打包.分发和部署上. [Twelve-F ...
最新文章
- AI学会灌水和造假!Google新研究揭露了AI现实应用的陷阱
- Centos 7.2安装FTP服务并进行相关设置
- l293d电机驱动原理_一文搞懂步进电机特性、原理及驱动器设计
- mysql数据库在什么上运行_mysql – 在所有数据库上运行SQL查询
- HP DL360 G7安装esxi 6.0
- Mysql 会导致锁表的语法
- php代码上线,实现版本切换
- mysql试题错误记录字段_MySQL这三道常见的面试题,你有被问过吗?
- 笑跪!博士写论文解释科学擀面,学霸们每天都在想些啥…
- 用计算机探索规律反思,用计算器探索规律教学反思
- 安全员b本计算机考试,2019年安全员B证考试题库试题资料一.doc
- 松露菌行业调研报告 - 市场现状分析与发展前景预测
- 【排序算法】归并排序-递归方法
- 2022互联网年终奖大赏!你们年终奖发了多少?
- 矩阵的java程序怎么编写_如何编写Java程序以添加两个矩阵
- webstorm快捷键生成html页面,webStorm快捷键总结
- 软考高项:十大知识领域47个过程组速记
- 学习Android开发只要这些东西,Android篇
- 密码学之RSA加密原理解析
- 能力素质有所欠缺_表达能力至关重要
热门文章
- 计算机在英语口语教学中的应用,计算机在高职高专英语口语教学中的运用
- 电影里感动你我的对白(不断收集更新中)
- 用Qt将一组静态连续图片制作成动图(定时器和QPixmap实现)
- php excel多级下拉菜单自动匹配,让Excel如程序般酷炫,两步让多级下拉菜单自动匹配内容...
- 害怕JAVA技术面_字节跳动Java岗三面,鬼知道我经历了些什么,泪谈一下面试过程(附面试解析)!...
- 基于区块链的供应链金融服务平台
- 使用YOLOv3实现目标检测
- 浏览器中禁用某些js加载_禁用加载项以加快Internet Explorer 9中的浏览
- java 遥控_用树莓派和JAVA实现4路遥控控制
- Java研发工程师知识点总结