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 /app


RUN 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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值