• Centos 发布docker(二)


    一,不赘述安装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

  • 相关阅读:
    Performance and Design
    返回数组中不重复的元素
    IE的button元素bug
    (转)Google Closure: 糟糕的JavaScript
    Why do we have an IMG element?
    About this and that
    C#中的Attribute
    C#检查字体是否存储,以及安装
    ZipFile压缩文件后,解压文件后有多层目录的处理方法
    Office系列在线预览
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/14991163.html
Copyright © 2020-2023  润新知