docker学习之使用 DockerFile 构建镜像并搭建 swarm+compose 集群

题目要求

(1)将springboot应用程序打成jar包:Hot.jar
(2)利用dockerfile将Hot.jar构建成镜像
(3)构建 Swarm 集群
(4)在 Swarm 集群中使用 compose 文件 (docker-compose.yml) 来配置、启动多个服务 包括: Mysql、Redis以及应用程序Hot

实现过程

springboot项目搭建及打包

项目实现功能:输入 http://localhost:8080/docker/test,网页上会打印:docker-hot。

由于功能非常简单,故这里不讲解项目搭建过程及打包过程。

安装docker

安装官方yum源

yum install -y yum-utils

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装Docker引擎

yum install -y docker-ce docker-ce-cli containerd.io

启动docker

启动命令

systemctl start docker

设置开机启动

systemctl enable docker

查看docker状态

docker info

修改镜像

vim /etc/docker/daemon.json

构建镜像

拉取java环境并上传jar包

docker pull java:8u111

mkdir /usr/dockerfile -p

将hot.jar上传到 /usr/dockerfile 目录下。

编写dockerfile:

cd /usr/dockerfile
vim dockerfile-demo
    FROM java:8u111
    COPY hot.jar /root
    CMD ["nohup","java","-jar","/root/hot.jar","&"]

构建镜像并启动

docker build -f dockerfile-demo -t hot:1.0 .

启动含 hot.jar 容器:

docker run --rm -it --network host hot:1.0

输入网址访问,可以看到访问成功:

搭建 swarm+compose 集群

首先,复制前面那台已安装好docker的虚拟机。

安装swarm(两台虚拟机都要安装)

docker pull swarm

安装compose(主机安装即可)

运行以下命令以下载Docker Compose的当前稳定版本:

curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

注:这里我因为在线下载总是无法成功,所以直接到:https://github.com/docker/compose/releases 网站上下载了最新的 docker-compose-Linux-x86_64,之后改名为 docker-compose 并上传至虚拟机的 /usr/local/bin/ 目录下。

将可执行权限应用于二进制文件:

chmod +x /usr/local/bin/docker-compose

添加到环境中:

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

查看compose版本:

docker-compose --version

看到这个结果,就证明compose安装成功了。

搭建集群

建立manager(对应的虚拟机ip地址:192.168.112.140

docker swarm init --advertise-addr 192.168.112.140

建立worker(对应的虚拟机ip地址:192.168.112.141)

docker swarm join --token SWMTKN-1-2e2d1l1p4qf7frlqxsca8q3qr3hu21glrffp6x687q6h5oh1s8-4u1h08jtq8ryauq4rc8941zve 192.168.112.140:2377

注:这里我第一次执行的时候报错了,错误信息如下:

Error response from daemon: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: Error while dialing dial tcp 192.168.112.140:2377: connect: no route to host"

原因是忘记将manager虚拟机的防火墙关闭。(执行 systemctl stop firewalld.service 命令即可)

编写docker-compose.yml文件

cd /usr/local/bin
vim docker-compose.yml

 docker-compose.yml文件的内容如下:

version: "3.0"
services: 
  mysql:
    image: mysql:5.7.30 
    ports: 
      - 3306:3306 
    command: 
      --default-authentication-plugin=mysql_native_password 
      --character-set-server=utf8mb4 
      --collation-server=utf8mb4_general_ci 
      --explicit_defaults_for_timestamp=true 
      --lower_case_table_names=1 
      --default-time-zone=+8:00 
    environment: 
      MYSQL_ROOT_PASSWORD: "root"
    deploy:
      mode: replicated 
      replicas: 2 
  redis: 
    image: redis:5.0.9 
    environment: 
      - TZ=Asia/beijing 
    ports: 
      - 6379:6379 
      #主备都存在 
    deploy: 
      mode: replicated 
      replicas: 2
  hot: 
    image: hot:1.0 
    ports: 
      - 8080:8080 
    deploy: 
      mode: replicated 
      replicas: 2

部署应用程序hot(注意:下文中 docker stack 相关的命令都需要在 /usr/local/bin 目录下执行)

docker stack deploy -c docker-compose.yml hot

运行应用程序hot

docker stack services hot

分别使用 192.168.112.140:8080/docker/test192.168.112.141:8080/docker/test 访问应用程序

停止应用程序hot

docker stack down hot

总结

到这里,我们就完成了题目要求中的所有内容,其实还是非常简单的,只不过在搭建过程中可能会遇到各种各样的小问题,基本上也可以通过上网搜索找到对应的解决方案。

这是我自己在学习docker过程中所记录的一些笔记,这里分享出来,希望其他人在学习过程中能从我的笔记中得到一些帮助!

posted @ 2021-02-20 22:36  blayn  阅读(609)  评论(0编辑  收藏  举报