Centos 发布docker(二)

本文详细介绍了在Centos上安装Docker,包括自动联网、远程访问设置、防火墙管理、docker-compose配置,以及如何发布docker并解决跨环境访问问题。涉及的关键步骤包括配置文件管理、docker-compose.yml文件和环境变量设置。

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

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

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值