关于Nacos安装,可以直接参考官网安装 https://nacos.io/zh-cn/docs/quick-start.html,我们接下来学习基于Docker实现Nacos单机安装和基于Docker实现Nacos集群安装。
采用Docker-Compose安装Nacos要更方便,所以大家可以先学习一下Docker-Compose。
dockerfile介绍
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取 Dockerfile 中的指令自动生成镜像。
Docker远程API开放
Docker 服务端开放 Remote API,Docker服务器默认只支持本地访问,所以需要开发远程调用权限。
#编辑daemon.json
vi /etc/docker/daemon.json
#往daemon.json中添加远程端口和地址
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
#添加完后的内容
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"],
"registry-mirrors":["https://almtd3fa.mirror.aliyuncs.com"]
}
上面配置了Docker API远程访问端口,我们接下来配置自动启动:
#创建(或修改)文件/etc/systemd/system/docker.service.d/override.conf,添加内容如下
##Add this to the file for the docker daemon to use different ExecStart
parameters (more things can be added here)
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
#执行systemctl命令使得配置生效
systemctl daemon-reload
#重启Docker服务
systemctl restart docker
执行命令 netstat -ntlp 查看相应 2375 端口是否开启监听状态。
#安装net-tools
yum install net-toolsDockerfifile文件说明
#端口查看
netstat -ntlp
#结果
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program
name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 9470/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 9702/master
tcp6 0 0 :::11111 :::* LISTEN
35562/docker-proxy
tcp6 0 0 :::2375 :::* LISTEN
34869/dockerd
tcp6 0 0 :::5672 :::* LISTEN
35894/docker-proxy
Dockerfile文件说明
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为Dockerfile 中的注释。
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以 # 字符开头则被视为注释。可以在Docker文件中使用 RUN , CMD , FROM , EXPOSE , ENV 等指
令。
FROM:指定基础镜像,必须为第一个命令
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
示例:
FROM mysql:5.6
注:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
MAINTAINER: 维护者信息
格式:
MAINTAINER <name>
示例:
MAINTAINER Jasper Xu
MAINTAINER [email protected]
MAINTAINER Jasper Xu <[email protected]>
RUN:构建镜像时执行的命令
RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行
格式:
RUN <command>
exec执行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"]
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]
注:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建
时指定--no-cache参数,如:docker build --no-cache
ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
格式:
ADD <src>... <dest>
ADD ["" ,... "" ] 用于支持包含空格的路径
示例:
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
CMD:构建容器后调用,也就是在容器启动时才进行调用。
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
注:
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的
命令
ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
示例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
注:
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而
docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有
一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
LABEL:用于为镜像添加元数据
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"properties
注:
使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之
间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
ENV:设置环境变量
格式:
ENV <key> <value> #之后的所有内容均会被视为其的组成部分,因此,一次只能
设置一个变量
ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"="的键值对,
如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat=fluffy
EXPOSE:指定于外界交互的端口
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注:
EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发
布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
VOLUME:用于指定持久化目录
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它
WORKDIR:工作目录,类似于cd命令
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
注:
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等 命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录
USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
注:
使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构
建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
ARG:用于指定传递给构建运行时的变量
格式:
ARG <name>[=<default value>]
示例:
ARG site
ARG build_user=www
ONBUILD:用于设置镜像触发器
格式:
ONBUILD [INSTRUCTION]
示例:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
以下是一个小例子
# This my first nginx Dockerfile
# Version 1.0
# Base images 基础镜像
FROM centos
#MAINTAINER 维护者信息
MAINTAINER tianfeiyu
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
#RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre &&
yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-
http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["nginx"]
下面是一个很形象的总结:
项目集成Dockerfile
项目中可以直接使用Dockerfile,基于 docker-maven-plugin 插件使用非常方便,我们在项目中首先引入依赖:
#配置奖项REPOSITORY,例如 hailtaxi/driver 可以按照如下配置添加到pom.xml中
<properties>
#镜像前部分
<docker.image.prefix>hailtaxidocker.image.prefix>
#镜像后部分
<docker.image.name>driverdocker.image.name>
properties>
#引入插件依赖
<plugin>
<groupId>com.spotifygroupId>
<artifactId>docker-maven-pluginartifactId>
<version>1.0.0version>
<configuration>
<dockerHost>http://192.168.211.145:2375dockerHost>
<imageName>${docker.image.prefix}/${docker.image.name}imageName>
<dockerDirectory>src/main/dockerdockerDirectory>
<resources>
<resource>
<targetPath>/targetPath>
<directory>${project.build.directory}directory>
<include>${project.build.finalName}.jarinclude>
resource>
resources>
configuration>
plugin>
关于插件更多参数,大家可以参考下面列表:
引入插件之后,我们需要在项目中创建 Dockerfile 配置文件,创建
src/main/docker/Dockerfile ,配置如下:
#基础镜像
FROM java:8
#挂载目录
VOLUME /tmp
#将hailtaxi-driver-1.0-SNAPSHOT.jar添加到容器中
ADD hailtaxi-driver-1.0-SNAPSHOT.jar /driver.jar
#指定容器启动程序及参数
ENTRYPOINT ["java","-jar","/driver.jar"]
我们需要把自己的项目创建成镜像并发布,需要先安把当前工程打包(或者安装到Maven本地仓库):
我们接下来在maven面板中找到 Plugins>docker>docker:build ,双击它,此时会创建容器。
控制台会输出镜像信息:
此时我们可以看到IDEA的 Services 中有Docker信息,可以看到服务器上的Docker镜像和容器,如下图
我们可以选择 hailaxi/driver:lastest 右键创建容器
此时我们需要填写容器名字以及创建容器所需的额外参数,如下图
容器创建后,在Containers中会显示当前已经创建好的容器,点击容器,可以选择 Show Log 查看日志,如下图:
Idea插件集成Dockerfile
上面集成Dockerfile用到了插件包,我们可以直接使用Idea插件集成Dockerfile要更简单,操作如下
配置完成后,点击执行,如下图:
执行完成后,在Idea的Services中会显示容器和镜像,如下图:
我们上面使用Dockerfile的时候,发现比较麻烦,需要在每个项目中单独配置Dockerfile、单独执行构建,效率比较低,我们可以使用Docker-Compose快速实现容器编排。
docker-compose简介
Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层:
1:工程(project)
Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件 等,工程配置文件默认为docker-compose.yml)组成一个工程,若无特殊指定工程名即为当前目录名。
2:服务(service)
一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。
3:容器(container)
一个服务当中可包括多个容器实例。
docker-compose安装
下载最新版的docker-compose文件
二进制文件安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
测试安装结果
docker-compose --version
Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理,安装docker-compose需要借助python-pip,安装命令如下:
#Python-pip安装
yum -y install python-pip
#docker-compose安装
pip install docker-compose
安装完成后查看版本信息:
#版本查看
docker-compose -v
#显示信息
docker-compose version 1.25.0, build 0a186604
docker-compose常用命令
docker-compose命令:
#命令格式
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
#参数说明
-f --file FILE指定Compose模板文件,默认为docker-compose.yml
-p --project-name NAME 指定项目名称,默认使用当前所在目录为项目名
--verbose 输出更多调试信息
-v,-version 打印版本并退出
--log-level LEVEL 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)
docker-compose up命令:
#命令格式
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
#参数说明
-d 在后台运行服务容器
-no-color 不用颜色来区分不同的服务的控制输出
-no-deps 不启动服务所链接的容器
--force-recreate 强制重新创建容器,不能与-no-recreate同时使用
–no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
–no-build 不自动构建缺失的服务镜像
–build 在启动容器前构建服务镜像
–abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
–remove-orphans 删除服务中没有在compose文件中定义的容器
docker-compose ps命令:
#命令格式
docker-compose ps [options] [SERVICE...]
#命令说明:列出项目中所有的容器
docker-compose stop命令:
#命令格式
docker-compose stop [options] [SERVICE...]
#参数说明
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
docker-compose stop停止正在运行的容器,可以通过docker-compose start 再次启动
docker-compose -h命令:
#命令格式
docker-compose -h
#命令说明:查看帮助
docker-compose down命令:
#命令格式
docker-compose down [options]
#命令说明:停止和删除容器、网络、卷、镜像。
#参数说明:
–rmi type,删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为
空的镜像
-v, –volumes,删除已经在compose文件中定义的和匿名的附在容器上的数据卷
–remove-orphans,删除服务中没有在compose中定义的容器
docker-compose logs命令:
#命令格式
docker-compose logs [options] [SERVICE...]
#命令说明
查看服务容器的输出。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通
过–no-color来关闭颜色。
#参数说明
-f 跟踪日志输出
docker-compose build命令
#命令格式
docker-compose build [options] [--build-arg key=val...] [SERVICE...]
#命令说明
构建(重新构建)项目中的服务容器。
#参数说明–compress 通过gzip压缩构建上下环境
–force-rm 删除构建过程中的临时容器
–no-cache 构建镜像过程中不使用缓存
–pull 始终尝试通过拉取操作来获取更新版本的镜像
-m, –memory MEM为构建的容器设置内存大小
–build-arg key=val为服务设置build-time变量
服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新
构建服务
docker-compose pull命令:
#命令格式
docker-compose pull [options] [SERVICE...]
#命令说明
拉取服务依赖的镜像。
#参数说明
–ignore-pull-failures,忽略拉取镜像过程中的错误
–parallel,多个镜像同时拉取
–quiet,拉取镜像过程中不打印进度信息
docker-compose restart命令:
docker-compose restart [options] [SERVICE...]
#命令说明
重启项目中的服务。
#命令参数
-t, –timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒)
docker-compose rm命令:
#命令格式
docker-compose rm [options] [SERVICE...]
#命令说明
删除所有(停止状态的)服务容器。
#命令参数
–f, –force,强制直接删除,包括非停止状态的容器
-v,删除容器所挂载的数据卷
docker-compose start命令
#命令格式
docker-compose start [SERVICE...]
#命令说明
启动已经存在的服务容器。
docker-compose run命令:
#命令格式
docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE
[COMMAND] [ARGS...]
#命令说明
在指定服务上执行一个命令。
#命令案例
docker-compose run itheima ping www.itheima.com
在指定容器(itheima)上执行一个ping命令
docker-compose scale命令:
#命令格式
docker-compose scale web=3 db=2
#命令说明
设置指定服务运行的容器个数。通过service=num的参数来设置数量
docker-compose pause 命令:
#命令格式
docker-compose pause [SERVICE...]
#命令说明
暂停一个服务容器
docker-compose kill命令:
#命令格式
docker-compose kill [options] [SERVICE...]
#命令说明
通过发送SIGKILL信号来强制停止服务容器,支持通过-s参数来指定发送的信号。
#命令案例
例如通过如下指令发送SIGINT信号:
docker-compose kill -s SIGINT
docker-compose config命令:
#命令格式
docker-compose config [options]
#命令说明
验证并查看compose文件配置。
#命令参数
–resolve-image-digests 将镜像标签标记为摘要
-q, –quiet 只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
–services 打印服务名,一行一个
–volumes 打印数据卷名,一行一个
docker-compose create命令:
#命令格式
docker-compose create [options] [SERVICE...]
#命令说明
为服务创建容器。
#参数说明
–force-recreate:重新创建容器,即使配置和镜像没有改变,不兼容–no-recreate参数
–no-recreate:如果容器已经存在,不需要重新创建,不兼容–force-recreate参数
–no-build:不创建镜像,即使缺失
–build:创建容器前 ,生成镜像
docker-compose exec命令:
#命令格式
docker-compose exec [options] SERVICE COMMAND [ARGS...]
#命令参数
-d 分离模式,后台运行命令。
–privileged 获取特权。
–user USER 指定运行的用户。
-T 禁用分配TTY,默认docker-compose exec分配TTY。
–index=index,当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务,例如:docker-
compose exec –index=1 web /bin/bash ,web服务中包含多个容器
docker-compose port命令
#命令格式
docker-compose port [options] SERVICE PRIVATE_PORT
#命令说明
显示某个容器端口所映射的公共端口。
#命令参数
–protocol=proto,指定端口协议,TCP(默认值)或者UDP
–index=index,如果同意服务存在多个容器,指定命令对象容器的序号(默认为1)
docker-compose push命令:
#命令格式
docker-compose push [options] [SERVICE...]
#命令说明
推送服务依的镜像。
#命令参数
–ignore-push-failures 忽略推送镜像过程中的错误
docker-compose stop命令:
#命令格式
docker-compose stop [options] [SERVICE...]
#命令说明
停止运行的容器
docker-compose unpause 命令:
#命令格式
docker-compose unpause [SERVICE...]
#命令说明
恢复处于暂停状态中的服务。
docker-compose模板文件
docker-compose 允许用户通过一个 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联 的应用容器为一个项目(project)。 docker-compose 模板文件是一个定义服务、网络和卷的YAML文
件。 Compose 模板文件默认路径是当前目录下的 docker-compose.yml ,可以使用.yml或.yaml作为文件扩展名。 docker-compose 标准模板文件应该包含 version 、 services 、 networks 三大部分。
docker-compose 目前有三个版本分别为 Version 1 , Version 2 , Version 3 , docker-compose 区分 Version 1 和 Version 2 ( Compose 1.6.0 +, Docker Engine 1.10.0 +)。 Version 2 支持更多的指令。 Version 1 将来会被弃用。
示例:
version: '2'
services:
web:
image: dockercloud/alibaba
ports:
- 8080
networks:
- front-tier
- back-tier
redis:
image: redis
links:
- web
networks:
- back-tier
lb:
image: dockercloud/haproxy
ports:
- 80:80
links:
- web
networks:
- front-tier
- back-tier
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
docker-compose属性
#image
image是指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。
#build
服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up启动时执行构建任务,构建标签是 build,可以指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器。
例如: build: /path/to/build/dir
也可以是相对路径,只要上下文确定就可以读取到Dockerfile。
例如: build: ./dir
#context
context选项可以是Dockerfile的文件路径,也可以是到链接到git仓库的url,当提供的值是相对路径
时,被解析为相对于撰写文件的路径,此目录也是发送到Docker守护进程的context
例如:build:
context: ./dir
#dockerfile
使用dockerfile文件来构建,必须指定构建路径
例如:build:
context: .
dockerfile: Dockerfile-alternate
#commond
使用command可以覆盖容器启动后默认执行的命令。
例如:command: bundle exec thin -p 3000
#container_name
Compose的容器名称格式是:<项目名称><服务名称><序号>
可以自定义项目名称、服务名称,但如果想完全控制容器的命名,可以使用标签指定:container_name: app
#depends_on
在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题
例如:定义容器先启动redis和db两个服务,最后才启动web 服务:
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
#PID
pid: "host"
将PID模式设置为主机PID模式,跟主机系统共享进程命名空间。容器使用pid标签将能够访问和操纵其他 容器和宿主机的名称空间。
#ports
ports用于映射端口的标签,使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端
口。
当使用HOST:CONTAINER格式来映射端口时,如果使用的容器端口小于60可能会得到错误得结果,因为 YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。
例如:
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
#extra_hosts
添加主机名的标签,会在/etc/hosts文件中添加一些记录。
例如:
extra_hosts:
- "somehost:192.168.211.145"
- "otherhost:192.168.211.146"
启动后查看容器内部hosts:
192.168.211.145 somehost
192.168.211.146 otherhost
#volumes
挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用 [HOST:CONTAINER:ro]格式,后者对于容器来说,数据卷是只读的,可以有效保护宿主机的文件系统。
Compose的数据卷指定路径可以是相对路径,使用 . 或者 .. 来指定相对目录。
数据卷的格式可以是下面多种形式
例如:
volumes:
// 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
- /var/lib/mysql
// 使用绝对路径挂载数据卷
- /opt/data:/var/lib/mysql
// 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
- ./cache:/tmp/cache
// 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
- ~/configs:/etc/configs/:ro
// 已经存在的命名的数据卷。
- datavolume:/var/lib/mysql
如果不使用宿主机的路径,可以指定一个volume_driver,volume_driver: mydriver。
#volumes_from
从另一个服务或容器挂载其数据卷:
例如:
volumes_from:
- service_name
- container_name
#dns
自定义DNS服务器。可以是一个值,也可以是一个列表。
例如:
dns:8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
#expose
暴露端口,但不映射到宿主机,只允许能被连接的服务访问。仅可以指定内部端口为参数。
例如:
expose:
- "3000"
- "8000"
#links
链接到其它服务中的容器。使用服务名称(同时作为别名),或者“服务名称:服务别名”(如 SERVICE:ALIAS)
例如:
links:
- db
- db:database
- redis
- #net
设置网络模式。
例如:
net: "bridge"
net: "none"
net: "host"
项目集成Docker-compose
我们首先需要为IDEA配置Docker tool工具,Docker tool工具在资料中 DockerToolbox.exe ,双击安1装即可,安装后在Idea中引入指定对象即可,如下图:
在IDEA中使用Docker-Compose,需要创建一个DockerCompose文件,再到每个工程中创建Dockerfile文件,完成创建后效果如下
创建 docker-compose.yml 文件,配置内容如下:
version: '2'
services:
hailtaxi-driver:
build:
#设置Dockerfile的路径
context: ../hailtaxi-driver
#设置Dockerfile的文件名字
dockerfile: Dockerfile
#设置容器名字
container_name: hailtaxi-driver
#网络设置
networks:
- hailtaxi-net
#映射端口
ports:
- 18081:18081
hailtaxi-gateway:
build:
context: ../hailtaxi-gateway
dockerfile: Dockerfile
container_name: hailtaxi-gateway
networks:
- hailtaxi-net
ports:
- 8001:8001
hailtaxi-order:
build:
context: ../hailtaxi-order
dockerfile: Dockerfile
container_name: hailtaxi-order
networks:
- hailtaxi-net
ports:
- 18082:18082
#网络配置
networks:
hailtaxi-net:
driver: bridge
三个Dockerfile文件:
#hailtaxi-driver项目中的Dockerfile
FROM java:8
VOLUME /tmp
ADD target/hailtaxi-driver-1.0-SNAPSHOT.jar /driver.jar
EXPOSE 18081
ENTRYPOINT ["java","-jar","driver.jar"]
#hailtaxi-gateway项目中的Dockerfile
FROM java:8
VOLUME /tmp
ADD target/hailtaxi-gateway-1.0-SNAPSHOT.jar /gateway.jar
EXPOSE 8001
ENTRYPOINT ["java","-jar","gateway.jar"]
#hailtaxi-order项目中的Dockerfile
FROM java:8
VOLUME /tmp
ADD target/hailtaxi-order-1.0-SNAPSHOT.jar /order.jar
EXPOSE 9001
ENTRYPOINT ["java","-jar","order.jar"]
点击 Edit Configuration ,如下操作:
接下来创建 Docker-compose ,操作如下:
接下来选择上面创建的Docker-compose,点击运行,如下操作:
执行后,效果如下,可以看到dockercompose下有3个容器在运行,并且增加了3个镜像。
Nacos安装模式有多种:
单机模式 Derby:
这种模式是极简模式,数据没法持久化存储,适合开发环境。
单机模式 MySQL:(支持MySQL5.7和MySQL5.8,我们这里学习MySQL5.7安装模式,因为当前主流还是 MySQL5.7)
这种模式支持数据持久化,数据会存储到MySQL中,适合生产环境。
集群模式:
这种模式适合生产环境并且服务节点个数较多,不存在单点故障问题
克隆项目:
#克隆项目
git clone https://github.com/nacos-group/nacos-docker.git
#进入nacos-docker目录
cd nacos-docker
#查看文件列表
ce example
ll
安装Nacos生产环境会结合prometheus和grafana实现对Nacos的监控,我们这里不做它们的监控操作,需要将docker-compose的配置注释掉,修改 example/standalone-derby.yaml ,配置如下:
安装命令如下:
docker-compose -f example/standalone-derby.yaml up
安装完成后,我们可以直接访问它的控制台 http://192.168.211.145:8848/nacos ,账号密码都是nacos,效果如下:
关于控制台的使用,我们在后面详细讲解。
我们先停掉之前安装的服务,并删掉之前的容器
#停掉容器
docker stop nacos-standalone
#删掉容器
docker rm nacos-standalone
我们首先需要导入数据库,数据库脚本在nacos的nacos\config\src\main\resources\META-INF 工程中有对应脚本,也可以通过下面的网址获取SQL:
https://github.com/alibaba/nacos/blob/develop/config/src/main/resources/META- INF/nacos-db.sql
创建数据库 nacos_config ,并执行初始化操作,初始化脚本后,数据库数据如下:
我们需要让Nacos链接我们安装好的MySQL,需要修改example/standalone-mysql-5.7.yaml 文件,该文件主要配置MySQL信息以及Nacos监控信息,关于Nacos监控配置我们不在这里实现,因此配置中可以注释掉,完整配置如下
version: "2"
services:
nacos:
image: nacos/nacos-server:latest
container_name: nacos-standalone-mysql
#数据库配置,如果下面配置了数据库变量,此处可以删除
#env_file:
# - ../env/nacos-standlone-mysql.env
volumes:
- ./standalone-logs/:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
#开机容器自动启动
restart: always
#数据库配置
environment:
- MODE=standalone
- TZ=Asia/Shanghai
- NACOS_SERVER_PORT=8848
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=192.168.211.145
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_DB_NAME=nacos_config
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=123456
ports:
- "8848:8848"
- "9555:9555"
restart: on-failure
配置修改后执行创建命令:
docker-compose -f example/standalone-mysql-5.7.yaml up
此时访问后台 http://192.168.211.145:8848/nacos/ ,并创建一个配置信息,如下图:
此时我们可以随意填写些配置,如下图:
配置填写后,数据会添加到数据库中的 config_info 表中,如下表:
我们也可以直接采用Docker的方式安装Nacos,这样安装不要克隆项目也不需要修改配置文件,会更方便,安装命令如下:
docker run -d \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.211.145 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-p 8848:8848 \
--restart=always \
--name nacos nacos/nacos-server