首页 > 技术文章 > Centos 发布docker(二)

hanjun0612 2021-07-09 16:28 原文

一,不赘述安装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>-->
                        <forceTags>true</forceTags>
                        <baseImage>openjdk</baseImage>
                        <!--时区配置 begin-->
                        <env>
                            <TZ>Asia/Shanghai</TZ>
                        </env>
                        <runs>
                            <run>ln -snf /usr/share/zoneinfo/$TZ /etc/localtime</run>
                            <run>echo $TZ > /etc/timezone</run>
                        </runs>
                        <!--时区配置 end-->
                        <!-- 镜象创建者 -->
                        <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

推荐阅读