一,不赘述安装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}:3306defaultZone: 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


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





