docker镜像制作并部署上云

项目背景

写了个自动给女朋友和我发邮件的脚本,因为需要一直运行,所以打算搬到刚买的阿里云服务器上运行,为了避免环境问题影响,准备制作docker镜像运行。

准备事项

  • 写好的一套脚本代码(文中是基于js+node),并上传到github
  • 一台云服务器(文中采用阿里云服务器)
  • 基本的docker知识,推荐阮一峰老师的docker入门教程

步骤

1. 代码项目中添加Dockerfile文件和.dockerignore文件

在项目的根目录下,新建一个文本文件.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

CMD node demos/01.js

上面代码一共五行,含义如下

FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是 8.4,即 8.4 版本的 node。

COPY . /app:将当前目录下的所有文件(除了.dockerignore 排除的路径),都拷贝进入 image 文件的 /app 目录。

WORKDIR /app:指定接下来的工作路径为 /app。

RUN npm install:在 /app 目录下,运行 npm install 命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。

EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。

CMD node demos/01.js:容器启动后自动执行 node demos/01.js。

2. 将代码拉取到云服务器上

git clone你的项目到云服务器中,cd到当前目录,并npm install安装相关依赖,咱们这次在云服务器环境进行镜像build

还有一种就是本地电脑build 然后push到docker hub上。 在服务器上拉下来这种。这种我也试过,但是如果镜像太大的话,比如900多MB,拉不下来。应该是镜像中包含了node这种模块。

3. 创建image镜像文件

创建镜像文件, -t参数用来指定创建的image镜像文件的名字,后面可以使用冒号指定标签,默认是lastest。最后记得还有一个点,表示dockerfile文件所在的路径。

注意最后有一个”.”,不要漏了

$ docker image build -t [yourProjectName] .
# 或者
$ docker image build -t [yourProjectName]:0.0.1 .

查看镜像文件

$ docker image ls

4. 生成容器

从image生成容器

$ docker container run -p 8000:3000 -it [yourProjectName]
# 或者
$ docker container run -p 8000:3000 -it [yourProjectName]:0.0.1
-p 参数:容器的 3000 端口映射到本机的 8000 端口。

-it 参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。

koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。

/bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。

终止容器运行

# 在本机的另一个终端窗口,查出容器的 ID,只能查到正在运行的容器
$ docker container ls

# 停止指定的容器运行
$ docker container kill [containerID]

删除容器

# 查出容器的 ID,包括已停止运行的容器
$ docker container ls --all

# 删除指定的容器文件
$ docker container rm [containerID]

终止容器后自动删除

$ docker container run --rm -p 8000:3000 -it [yourProjectName] /bin/bash

后台自动运行,容器创建后除非删除否则不会消失,云服务器运行的服务其实是容器,不是镜像

开启、终止容器服务

# 查出所有容器的 ID
$ docker container ls --all

# 停止指定的容器运行
$ docker container stop/kill [containerID]

# 开启指定容器
$ docker container start [containerID]

查看容器打印的日志,tail参数表示最近100条日志,不加的话默认从头开始显示

$ docker logs -f --tail 100 [containerID]

进入容器操作

$ docker exec -it id sh

提交到docker hub

首先你要注册一个dockerhub的账号,之后登陆账号

docker login

输入你的ID和密码,之后执行:

docker push [imageName]:[imageVersion]

第一次提交可能会被拒绝:denied: requested access to the resource is denied,根据文档:

You need to include the namespace for Docker Hub to associate it with your account.
The namespace is the same as your Docker Hub account name.
You need to rename the image to YOUR_DOCKERHUB_NAME/docker-whale.

所以在push之前需要添加tag

docker tag [imageName] [dockerhubName]/[imageName]

然后再进行push操作

docker push [dockerhubName]/[imageName]

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。