本文的目的是介绍docker使(二)—发布node应用镜像和容器的详细情况,特别关注dockernodejs镜像的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解doc
本文的目的是介绍docker 使 (二)— 发布 node 应用镜像和容器的详细情况,特别关注docker nodejs镜像的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解docker 使 (二)— 发布 node 应用镜像和容器的机会,同时也不会遗漏关于centos 如何修改 docker 镜像和容器的默认存放路径、docker (三) 镜像和容器常用命令、docker - dockerfile构建一个简单的springboot应用镜像、Docker - 入门(二),docker&nodeJs制作镜像与本地部署的知识。
本文目录一览:- docker 使 (二)— 发布 node 应用镜像和容器(docker nodejs镜像)
- centos 如何修改 docker 镜像和容器的默认存放路径
- docker (三) 镜像和容器常用命令
- docker - dockerfile构建一个简单的springboot应用镜像
- Docker - 入门(二),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 镜像和容器的默认存放路径
原因:通过 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 (三) 镜像和容器常用命令
一、镜像操作
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 - 构建一个简单的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基本命令与运作逻辑后,尝试实战。
目标:制作一个nodejs服务镜像,并使用nginx反向代理,在本地跑通。
本次项目配置与工具构成:
- node后端:使用阿里的 Egg.js 脚手架
- db:mongodb
- nginx
-
NoSqlBooster for MongoDB
,一个mongodb可视化工具 -
postman
一个可以发起网络请求的工具,用于测试
注:本机操作系统为 macOS
本文主讲docker部分,其余知识面仅描述部分
准备工作:
- docker镜像:nginx:latest、node:10.15.3、mongo:latest
- docker-compose可用
- 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根目录(./)下新增文件:
-
Dockerfile
// Egg.js镜像制作的配置文件 -
docker-compose.yml
// Egg.js和nginx容器的配置 -
mongodb-compose.yml
// mongodb容器的配置 -
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制作镜像与本地部署的相关信息,可以在本站进行搜索。
本文标签: