GVKun编程网logo

docker 使 (二)— 发布 node 应用镜像和容器(docker nodejs镜像)

20

本文的目的是介绍docker使(二)—发布node应用镜像和容器的详细情况,特别关注dockernodejs镜像的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解doc

本文的目的是介绍docker 使 (二)— 发布 node 应用镜像和容器的详细情况,特别关注docker nodejs镜像的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解docker 使 (二)— 发布 node 应用镜像和容器的机会,同时也不会遗漏关于centos 如何修改 docker 镜像和容器的默认存放路径、docker (三) 镜像和容器常用命令、docker - dockerfile构建一个简单的springboot应用镜像、Docker - 入门(二),docker&nodeJs制作镜像与本地部署的知识。

本文目录一览:

docker 使 (二)— 发布 node 应用镜像和容器(docker nodejs镜像)

docker 使 (二)— 发布 node 应用镜像和容器(docker nodejs镜像)

应用在本地是已经 ok 的了,现在将 node 应用放进 docker 容器里面

获取 node 镜像

docker pull node

编写 Dokerfile

# 根据node镜像开始创建新的镜像(可以加上:tag)
FROM node

# 用于在Image里创建一个文件夹并用来保存我们的代码
#-P:将容器内部使用的网络端口映射到我们使用的主机上
RUN mkdir -p /home/service

# 将我们创建的文件夹做为工作目录
WORKDIR /home/service

# 把本机当前目录下的所有文件拷贝到Image的/home/Service文件夹下
COPY . /home/service
# 使用npm 安装我们的app据需要的所有依赖
RUN npm install

EXPOSE 80

CMD [''npm'',''start'']

#注意这里容器暴露的是80端口,应用服务的监听端口也应该是80端口

#为了避免node_modules里面的文件也copy,我设置了.dockerignore

制作镜像


docker build -t aad_serve:0.0.1 .
(注意最后的.)
-t :指定要创建的目标镜像名

. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

自己设置端口

使用镜像创建容器并启动 node 应用

# 方法一:让docker自己映射端口
docker run -d -p  aad_serve:0.0.1  node app.js


# 方法二:自己配置映射端口
docker run -d -p 100:80 aad_serve:0.0.2  node app.js
(注意100:80的意思是,将主机的100端口和容器的80d端口做映射)

现在可以在主机访问 http://localhost:100

容器的停止和删除

如果 cmd 终端不行时,在 powershell 里面操作


 docker rm $(docker ps -a -q)   #删除全部通用容器
docker ps -a  查看全部容器,含停用

<a href="https://blog.csdn.net/u013451157/article/details/79003717"> 参考文章 </>

centos 如何修改 docker 镜像和容器的默认存放路径

centos 如何修改 docker 镜像和容器的默认存放路径

原因:通过 df -h 查看磁盘利用的时候,目前挂载的太小了,所以尝试挂载到其他地方

1 先看看默认存放的路径在哪儿

方法 1:docker info

方法 2:sudo docker info | grep "Docker Root Dir"

发现默认路径为 /var/lib/docker

2 修改方法

方法 1

(1) 停止 docker 服务

service docker stop

(2) 备份数据到新的存放路径

cp -r /var/lib/docker/* /home/docker_data

(3) 备份 /var/lib/docker 路径

    mv /var/lib/docker /var/lib/docker_bak

(4) 建立软连接

ln -s /mnt/docker /var/lib/docker

(5) 启动 dockersystemctl restart docker

方法 2:

(1) 打开配置文件

 vim /usr/lib/systemd/system/docker.service

(2)ExecStart=/usr/bin/dockerd --graph /new-path/docker

(3) reload 配置文件

systemctl daemon-reload

(4)systemctl restart docker.service

docker (三) 镜像和容器常用命令

docker (三) 镜像和容器常用命令

一、镜像操作

1. 搜索镜像

可以直接在 Docker Hub 直接搜索镜像,当然也可以使用命令来搜索。 

docker search 名称

docker search tomcat

 

2. 拉取镜像

docker pull 镜像名

#拉取redis3.0
docker pull redis:3.0

 

3. 查看镜像列表

Docker 镜像保存在 /var/lib/docker

docker images
docker images -a
docker images -q(显示id)

 

4. 删除镜像

docker rmi 镜像名

#删除hello-world镜像
docker rmi hello-world

#强制删除有容器依赖的镜像
docker rmi -f hello-world

二、容器操作

1. 创建容器

①docker create

可以先通过 docker create 创建容器,再通过 docker start 启动

②docker run

创建并启动容器 (运行时容器)

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

[OPTIONS]:

  • -d: 后台运行容器,并返回容器 ID;  
  • --name="xx": 为容器指定一个名称;
  • -i:以交互模式运行容器,通常与 -t 同时使用
  • -t:为容器分配虚拟终端,允许发信号给容器。tty
  • -P: 随机端口映射;
  • -p: 指定端口映射,有以下四种格式

例子:

# 基于最新版redis镜像创建容器,命名为myredis,将主机的16379端口映射到容器内的6379端口。
docker create --name myredis -p 16379:6379 redis:latest

 

2. 列出容器

docker ps [OPTIONS]

[OPTIONS]:

  • -a:显示所有容器,包括未运行的
  • -l:显示最近创建的容器
  • -n:显示最近创建的 n 各容器

3. 启动 / 停止 / 重启容器

docker start 容器ID/容器名
docker stop  容器ID/容器名
docker restart 容器ID/容器名

 

4. 删除容器

#删除容器
docker rm 容器ID/容器名

#强制删除运行中的容器
docker rm -f 容器ID/容器名
  • -f : 强制删除运行中的容器
  • -l : 移除容器间的网络连接,而非容器本身
  • -v : 删除与容器关联的卷

 

5. 在运行的容器中执行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

例子:

#进入到redis容器中,并开启一个交互模式的终端
docker exec -it redis /bin/bash

#在容器mynginx中以交互模式执行容器内/root/runoob.sh脚本
docker exec -it mynginx /bin/sh /root/runoob.sh

使用 ctrl + d 退出容器

 

6. 获取容器的日志

docker logs 容器

Options:

  • -f, 跟踪日志输出
  • -t, 显示时间戳
docker logs -f redis

 

三、上传镜像到阿里云镜像仓库

可以将本地镜像上传到 Docker Hub 上,也可以上传到其它服务器,例如阿里云镜像仓库。上传到 hub 上太慢了,这里选择上传到阿里云镜像仓库中。

可以参考阿里云官网的教程:上传本地镜像

1. 先要有阿里云账号,登录容器镜像服务控制台。

2. 设置阿里云 Docker registry 登录密码

如果是首次访问,系统会提示您进行初始化设置。设置您的登录密码,并单击确定。

3. 创建命名空间。

4. 创建镜像仓库。

      

 

接下来可以进入管理,查看具体的操作指南

 

5. 执行 Docker 登录命令,并输入密码。

sudo docker login --username=阿里云用户名 registry.cn-beijing.aliyuncs.com

6. 重命名镜像。

  • 如果您本地的镜像是通过构建生成的,构建过程中需要指定 tag 信息。
$ sudo docker tag [镜像id] registry.cn-beijing.aliyuncs.com/命名空间/仓库:[镜像版本号]
  • 如果您本地的镜像是从其它仓库下载的,已有了 registry 名、命令空间、仓库名和 tag 名称,上传到阿里云 registry 之前需要执行 Docker tag 命令进行修改。
[root@localhost application]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        2 months ago        1.84kB
[root@localhost application]# sudo docker tag 4ab4c602aa5e registry.cn-hangzhou.aliyuncs.com/lp_namespace/helloworld:helloworld-1.0

7. 上传镜像到阿里云 Docker registry。

sudo docker push registry.cn-hangzhou.aliyuncs.com/lp_namespace/helloworld:helloworld-1.0

 

8. 从 Registry 中拉取镜像

$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/lp_namespace/helloworld:hello-world-1.0

 

更多详情请参考阿里云官网的教程:上传本地镜像

docker - dockerfile构建一个简单的springboot应用镜像

docker - dockerfile构建一个简单的springboot应用镜像

      在前面的 《docker - 构建一个简单的docker镜像》中,介绍了两种构建镜像的方法,其中,通过dockerfile文件构建镜像是在实际生产中常用的;除此之外,还通过 docker - Dockerfile常用指令 和  docker - 常用命令 两篇文章介绍了dockerfile的指令和docker的常用命令,接下来,我们将会使用所学的知识构建一个简单的springboot应用。

    该springboot应用对外暴露了一个api,对外暴露8080端口,日志文件写在应用当前目录,部分代码以及配置文件如下:

@Slf4j
@SpringBootApplication
@RestController
public class SpringbootDockerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootDockerApplication.class, args);
    }

    @RequestMapping("/docker")
    public String docker() {
        log.info("access docker home at " + LocalTime.now());
        return "Hello Docker!";
    }
}

application.properties

spring.application.name=springboot-docker
server.port=8080
logging.file=app.log

把jar和dockerfile文件上传到一个springboot-docker目录中

[root@localhost springboot-docker]# ls
Dockerfile  springboot-docker-1.0.jar

Dockerfile:

FROM openjdk:8u181-jdk-alpine
ARG workdir=/app
VOLUME ${workdir}
WORKDIR ${workdir}
ADD springboot-docker-1.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
  • FROM openjdk:8u181-jdk-alpine : 从docker仓库中获取基础镜像
  • ARG workdir=/app : 添加变量,该变量只在当前的dockerfile中有效,如果换成ENV,则在容器中生效。这里需要注意的是,ARG和ENV对哪些指令是起效的,可以参考  docker - Dockerfile常用指令 
  • VOLUME ${workdir} : 把宿主机的目录(该目录可以通过docker inspect dockerName查看)挂载到容器中的/app这个目录,这样可以在宿主机中查看该目录的内容。还有一个很重要的原因,就是数据持久化,如果不挂载,当容器关闭删除后,数据将会跟着被删除。这里因为/app是应用所在的目录,该目录会产生日志等其它内容。
  • WORKDIR ${workdir} :指定工作目录,下面的指令操作将在这个指定目录中执行。还有一点是,当通过交互模式的exec命令进入到该容器时,默认当前路径是/app
  • ADD springboot-docker-1.0.jar app.jar : 添加文件到WORKDIR
  • EXPOSE 8080 : 暴露8080端口,需要通过容器IP和端口访问应用。如果想通过宿主机的IP和端口访问应用,需要在RUN容器的时候绑定。可以参考docker - Dockerfile常用指令 的run命令
  • ENTRYPOINT: 运行容器后执行的第一条命令,这里通过java -jar命令运行应用。

接下通过BUILD命令构建镜像

[root@localhost springboot-docker]# docker build -t springboot-docker:1.0 .

Sending build context to Docker daemon  17.85MB
Step 1/7 : FROM openjdk:8u181-jdk-alpine
 ---> 97bc1352afde
Step 2/7 : ARG workdir=/app
 ---> Using cache
 ---> a3818e8696c2
Step 3/7 : VOLUME ${workdir}
 ---> Using cache
 ---> e2faefe34aa6
Step 4/7 : WORKDIR ${workdir}
 ---> Using cache
 ---> 144b537c1b57
Step 5/7 : ADD springboot-docker-1.0.jar app.jar
 ---> Using cache
 ---> daca849e1012
Step 6/7 : EXPOSE 8080
 ---> Using cache
 ---> 123da0847dd3
Step 7/7 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
 ---> Using cache
 ---> de46a3f96d91
Successfully built de46a3f96d91
Successfully tagged springboot-docker:1.0

查看当前本地仓库的镜像,已经构建springboot-docker:1.0镜像

[root@localhost springboot-docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
springboot-docker   1.0                 de46a3f96d91        38 minutes ago      121MB
openjdk             8u181-jdk-alpine    97bc1352afde        5 weeks ago         103MB

运行镜像

docker run -p 8080:8080 -d --name springboot-docker springboot-docker:1.0

通过-p参数,把容器中的8080端口映射到宿主机中的8080端口。--name,给容器起一个名字

可以查看springboot应用的启动情况

docker logs -f springboot-docker 

查看容器的运行情况

docker inspect springboot-docker

只看一些关键的信息

"Mounts": [
            {
                "Type": "volume",
                "Name": "90df5c82f11290eddfc86faead12e4a79649672845b2a816e04f868da76851a3",
                "Source": "/var/lib/docker/volumes/90df5c82f11290eddfc86faead12e4a79649672845b2a816e04f868da76851a3/_data",
                "Destination": "/app",
                "Driver": "local",
            }
        ],
"Networks": {
	"bridge": {
		"Gateway": "172.17.0.1",
		"IPAddress": "172.17.0.2",
	}
}

    宿主机中的 /var/lib/docker/volumes/90df5c82f11290eddfc86faead12e4a79649672845b2a816e04f868da76851a3/_data 目录挂载到 容器的 /app目录

    容器的IP地址 172.17.0.2

    运行成功后,在宿主机中通过命令访问服务

curl 172.17.0.2:8080/docker

    也可以通过宿主机的IP或者localhost访问,因为已经绑定

curl 127.0.0.1:8080/docker

 

 

Docker - 入门(二),docker&nodeJs制作镜像与本地部署

Docker - 入门(二),docker&nodeJs制作镜像与本地部署

在熟悉docker基本命令与运作逻辑后,尝试实战。

目标:制作一个nodejs服务镜像,并使用nginx反向代理,在本地跑通。

本次项目配置与工具构成:

  1. node后端:使用阿里的 Egg.js 脚手架
  2. db:mongodb
  3. nginx
  4. NoSqlBooster for MongoDB,一个mongodb可视化工具
  5. postman 一个可以发起网络请求的工具,用于测试

注:本机操作系统为 macOS

本文主讲docker部分,其余知识面仅描述部分

准备工作:

  1. docker镜像:nginx:latest、node:10.15.3、mongo:latest
  2. docker-compose可用
  3. Egg.js脚手架初始化后端项目,命名为 egg-center

项目配置

Egg.js

安装egg-mongoose库,以便连接mongodb。

数据库配置,修改./config/config.default.js

  config.mongoose = {
    clients: {
      center: {
        url: ''mongodb://你本地的内网ip:27017/example'',
        options: {
          dbName: ''center'', // 数据库名,自己取
          user: '''', // 连接数据库的账号,默认为空
          pass: '''', // 连接数据库的账号,默认为空
        }
      }
    }
  }
接下来写一个后台用户管理系统

在 ./app/controller 下新增对应的控制器、在./app/model下新增对应的表结构。

然后写几个简单的接口,修改:./app/router.js,定义路由:

''use strict''

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const { router, controller } = app
  router.get(''/'', controller.home.index)

  /* 新增用户 */
  router.post(''/api/admin/user'', controller.admin.user.create)
  
  /* 用户列表 */
  router.get(''/api/admin/user'', controller.admin.user.index)
  
  ...略
}

本地启动服务测试: npm run dev
本地使用 postman 调通接口,造些测试数据。

修改package.json

"start": "egg-scripts start --deamon --title=egg-server-egg-center",

修改为:

"start": "egg-scripts start --title=egg-server-egg-center",

删除出--deamon,我们是在docker里跑项目,所以需要node服务跑在docker前台。

配置Dockerfile

Egg.js根目录(./)下新增文件:

  1. Dockerfile // Egg.js镜像制作的配置文件
  2. docker-compose.yml // Egg.js和nginx容器的配置
  3. mongodb-compose.yml // mongodb容器的配置
  4. nginx.conf // nginx配置文件

我们本次部署不使用jenkins,采用较为简单的部署方式。

解释下为什么要把mongodb的配置单独写:
1.绝大部分情况,数据库都是不关闭的,而业务服务器和nginx是会随着版本迭代等影响重启,所以将mongodb的配置单独拎出来
2.业务服务会依赖mongodb启动,若写在同一个docker-compose文件里会出现异步问题,即mongodb还未完全启动至ready状态,node服务已经启动连接数据库报错了。

接下来看文件内容。

Dockerfile:

FROM node:10.15.3 # 使用node:10.15.3镜像
RUN mkdir -p /egg-center # 在容器中新建目录文件夹 egg-center
WORKDIR /egg-center # 将 /egg-center 设置为默认工作目录
COPY package.json /egg-center/package.json
RUN yarn --production # 先copy package.json文件至容器,并安装依赖
COPY . /egg-center # 再copy代码至容器。也可以部分先后直接copy整个代码
EXPOSE 7006 # 暴露7006端口

docker-compose.yml:

version: ''3''
services:
  nginx:
    image: nginx:latest # 使用nginx:latest镜像
    ports:
      - 8080:8080 # 宿主机端口:容器端口
    volumes:
      - "/Users/liaoxinyu/JsProject/eggJsProject/server/egg-center/nginx.conf:/etc/nginx/conf.d/nginx.conf" # 挂载nginx配置文件
  egg-center:
    build:
      context: . # 以Dockerfile文件配置 build
    ports:
      - 7006:7006 # 宿主机端口:容器端口,用于nginx转发
    command: ["npm", "start"] # 启动服务

配置mongodb容器,修改mongodb-compose.yml:

version: ''3''
services:
  mongodb:
    image: mongo:latest # 使用mongo:latest镜像
    ports:
      - 27017:27017 # 宿主机端口:容器端口
    volumes:
      - "/Users/liaoxinyu/db/mongodb/data:/data/db/" # 挂载数据库目录至本地,若不挂载,容器关闭后数据丢失。

修改nginx.conf:

upstream api {
    server 10.10.1.31:7006;
} # 后端服务容器 端口:ip

server {
    listen         8080; # 监听8080端口,docker-compose里做的映射
    server_name    localhost; # 本地配置就直接用localhost了,线上的话改成域名或公网ip

    location /api {
        # /api前缀的请求,全部转发至Egg.js服务
        proxy_pass http://api;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location / {
        # 可写多个location,转发至不同的服务或静态资源路由
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri /index.html;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

启动项目:
1.先启动数据库:docker-compose -f mongodb-compose.yml up
2.数据库完全启动后,启动Egg.js服务与nginx:docker-compose up

验证:
1.使用 NoSqlBooster for MongoDB 连接数据库,配置很简单,配置ip:port,查看数据库内容
2.使用 postman 请求 http://localhost:8080/api/admin/user,这里发的请求是直接发到nginx代理的8080上。 由nginx转发至业务服务端口7006。

线上服务器就直接请求域名了,且不对外公开业务服务器的公网ip:端口。

结束

附:使用nginx - docker镜像部署服务器,配置https,附带java后端部署例子

我们今天的关于docker 使 (二)— 发布 node 应用镜像和容器docker nodejs镜像的分享就到这里,谢谢您的阅读,如果想了解更多关于centos 如何修改 docker 镜像和容器的默认存放路径、docker (三) 镜像和容器常用命令、docker - dockerfile构建一个简单的springboot应用镜像、Docker - 入门(二),docker&nodeJs制作镜像与本地部署的相关信息,可以在本站进行搜索。

本文标签: