一,不赘述安装Centos了
二,root 登录
1 自动联网
如果要设定固定IP,参考:http://www.linuxidc.com/Linux/2017-12/149910.htm
修改etc/sysconfig/ifcng-ens33
重启网关
systemctl restart network
2 下载docker
curl -fsSL https://get.docker.com/ | sh
3 开启远程访问
/usr/lib/systemd/system 下 找到 docker.service
修改ExecStart
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
运行
systemctl daemon-reload
systemctl restart docker
自动启动
systemctl enable docker.service
4 关闭防火墙
systemctl stop firewalld.service
查看防火墙(Active: inactive 代表关闭)
systemctl status firewalld.service
永久关闭
systemctl disable firewalld.service
5 安装docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
三, 发布docker
由于我的配置中心,有多个环境,
所以这边,我的复杂一点,但是可以解决2个问题
1 通过docker-compose up -d 启动时,wait.sh可以等待registry和config启动后,其他服务在启动。
2 比较重要,解决docker 部署时,使用localhost指向docker 内部ip而不是本机ip。
这会导致docker无法连接注册中心和获取配置中心的数据,因为ip不对。
因此 entrypoint: java -jar -Dhost=$HOST $SECURITY /tenyears-registry-1.0.jar
中就是替换了环境变量$HOST,让他使用本机IP
所以,我们需要注意两点
1 docker-compose.yml
配置 entrypoint: java -jar -Dhost=$HOST $SECURITY /tenyears-registry-1.0.jar
2 springcloud项目,所有localhost使用:${host:localhost}
例如:
url: jdbc:mysql://${host:localhost}:3306
defaultZone: http://${host:localhost}:9088/eureka/
先看看我的配置文件
1 docker-compose.yml
详细的看zuul 节点。
version: '2.2' services: registry: image: registry:1.0 ports: - '9088:9088' container_name: 'registry' entrypoint: java -jar -Dhost=$HOST $SECURITY /tenyears-registry-1.0.jar restart: on-failure cpu_shares: 10 cpuset: '0' mem_limit: 1g memswap_limit: 2g mem_reservation: 512m config: image: config:1.0 ports: - '9089:9089' container_name: 'config' volumes: - '/root/docker/logs:/logs' - '/root/docker/uploadFiles:/uploadFiles' - '/root/docker/wait.sh:/wait.sh' entrypoint: java -jar -Dhost=$HOST $SECURITY /tenyears-config-1.0.jar restart: on-failure cpu_shares: 10 cpuset: '0' mem_limit: 1g memswap_limit: 2g mem_reservation: 512m gateway: # 服务名 image: gateway:1.0 #镜象名 ports: #主机与容器端口映射 - '9090:9090' #前者为主机端口,后为容器端口 volumes: - '/root/docker/logs:/logs' #前者为主机目录,后为容器目录 - '/root/docker/uploadFiles:/uploadFiles' - '/root/docker/wait.sh:/wait.sh' container_name: 'zuul' #容器名 depends_on: # 启动依赖 - registry - config entrypoint: java -jar -Dhost=$HOST $SECURITY /tenyears-gateway-1.0.jar #entrypoint: /wait.sh -d registry:9088/health,config:9089/health -c 'java -jar -#Dhost=$HOST -Dactive=$ACTIVE $SECURITY /tenyears-gateway-1.0.jar ' restart: on-failure #非正常退出,立即重启 cpu_shares: 5 #cpu分配优先权重 cpuset: '1,2,3' #cpu核编号 mem_limit: 1g #限制容器使用内存 memswap_limit: 2g #交换区内存 mem_reservation: 512m #预留内存
2 file.env
在/root/docker/file.env (新建)
#该文件存放于:/root/docker/file.env #虚拟机快速启动参数 SECURITY='-Djava.security.egd=file:/dev/./urandom' #虚拟机内存初始化参数 JAVA_OPTS='-server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:CompressedClassSpaceSize=256m' #springboot激活配置与访问配置中心参数 ACTIVE='dev' #服务器内网ip或centos系统ip HOST='192.168.1.250'
注意ACTIVE='dev',这就是配置文件的测试环境,
同理如果设置为ACTIVE='prod',就是生产环境
PS:配置中心的文件命名是有规范的
规范如下:
3 file.sh
在/etc/profile.d/file.sh (新建)
#该文件存放于:/etc/profile.d/file.sh #虚拟机快速启动参数 export SECURITY='-Djava.security.egd=file:/dev/./urandom' #虚拟机内存初始化参数 export JAVA_OPTS='-server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:CompressedClassSpaceSize=256m' #springboot激活配置与访问配置中心参数 export ACTIVE='dev' #服务器内网ip或centos系统ip export HOST='192.168.1.250'
执行
source /etc/profile
4 设置docker-compose随机启动
进入/usr/lib/systemd/system目录
docker-compose.service (没有就新建)
[Unit] Description=docker-compose daemon After=docker.service [Service] Type=notify NotifyAccess=main EnvironmentFile=-/root/docker/file.env ExecStart=/usr/bin/docker-compose -f /root/docker/docker-compose.yml up -d [Install] WantedBy=multi-user.target ##[unit]配置了服务的描述,规定了在network启动之后执行, ##[service]配置服务的启动,停止,重启 ##[install]配置用户模式
5 运行
systemctl enable docker-compose.service
四,准备上传docker
1 总的pom文件
最外层parent的pom,不过你也可以在每个微服务配一遍。
<!-- 插件统一管理供子模块按需引用 --> <pluginManagement> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot-maven-plugin.version}</version> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <!-- 推送至远程服务器 --> <dockerHost>${dockerHost}</dockerHost> <!-- <dockerCertPath>${dockerCertPath}</dockerCertPath>--> <!-- 镜象生成规则文件 dockerfile --> <!-- <dockerDirectory>src/main/docker</dockerDirectory>--> <baseImage>openjdk</baseImage> <!-- 镜象创建者 --> <maintainer>tyler</maintainer> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </pluginManagement>
2 微服务的pom
这里是具体的微服务,只是定义了一个imageName,你可以直接写死。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <configuration> <imageName>${imageName}</imageName> </configuration> </plugin> </plugins> </build>
到这一步,就可以发布了。
假设你要使用dockerfile来发布,
把上面的dockerDirectory节点注释去掉。
3 看一下dockerfile的位置和内容
dockfile
FROM openjdk VOLUME /tmp ADD tenyears-registry-1.0.jar app.jar RUN bash -c 'touch /app.jar' ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] #设置时区 RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
3 微服务的pom
这里是具体的微服务,只是定义了一个imageName,你可以直接写死。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <configuration> <imageName>${imageName}</imageName> </configuration> </plugin> </plugins> </build>
4 maven上传
在微服务的终端执行
对具体的微服务右键,Open In->Terminal
执行
mvn clean package docker:build
五,启动
启动
docker-compose up -d
查看日志
docker-compose logs -f --tail 500 服务名
六,虚拟机中docker
我的情况是这样的:
1 本机是win10系统,
2 然后创建了一个 VM虚拟机,运行Centos系统。
3 接着往里面发布了docker
那如何让局域网的其他电脑也能访问我VM中的docker服务呢?
按照下图
1 虚拟网络编辑器
2 设置虚拟机ip映射
3 关闭win10的防火墙,或者增加入站规则
4 最后,通过win10的ip 来访问:
举例:10.10.10.13:9088