赞
踩
目录
前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,感兴趣的同学可以进行学习人工智能学习
前面我们怎么拉取镜像,怎么去创建运行容器;但是都是基于DockerHub官方制作的镜像。接下来就学习一下怎么自己制作镜像!
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成!
镜像结构:镜像是分层结构,每一层称为一个Layer
基础镜像(BaseImage):一定是某个镜像依赖的系统函数库,这一层称为基础镜像。
入口(Entrypoint):等所有的安装步骤完成,就需要暴露一个端口出去,用来启动使用。
层(Layer):在基础层的基础上给应用配置环境变量,下载安装包,依赖等,每一个操作都是新的一层。
什么是Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
更详细语法说明,请参考官网文档:Dockerfile reference | Docker Docs
案例1:基于Ubuntu镜像构建一个新镜像,运行一个java项目
步骤1:新建一个空文件夹docker-demo
mkdir docker-demo
步骤2:拷贝资料中的docker-demo.jar(项目)、jdk8.tar.gz(Java运行环境)、Dockerfile(构建说明书)文件到docker-demo这个目录
DockerFile文件是构建说明书:
- # 指定基础镜像
- FROM ubuntu:16.04
- # 配置环境变量,JDK的安装目录
- ENV JAVA_DIR=/usr/local
-
- # 拷贝jdk和java项目的包到指定目录
- COPY ./jdk8.tar.gz $JAVA_DIR/
- COPY ./docker-demo.jar /tmp/app.jar
-
- #安装JDK
- # 进入目录,解压JDK,修改名字
- RUN cd $JAVA_DIR \
- && tar -xf ./jdk8.tar.gz \
- && mv ./jdk1.8.0_144 ./java8
-
- # 配置环境变量
- ENV JAVA_HOME=$JAVA_DIR/java8
- ENV PATH=$PATH:$JAVA_HOME/bin
-
- #-------------------以上配置基本上都是安装JDK
- # 暴露端口
- EXPOSE 8090
- # 入口,java项目的启动命令
- ENTRYPOINT java -jar /tmp/app.jar
步骤3:运行命令,构建镜像
-t表示tag版本号,点“.”表示当前目录,当前Dockerfile文件所在的目录!
docker build -t javaweb:1.0 . #当前就在Dockerfile所在的目录,所以使用点
构建完成后查看镜像docker images
运行容器
docker run --name web -p 8090:8090 -d javaweb:1.0
浏览器进行访问
http://192.168.2.129:8090/hello/count
成功构建并部署成功
案例2:基于java:8-alpine镜像,将一个Java项目构建为镜像
上面的过程看起来很繁琐,但是大部分的操作都是安装JDK而已;所以可以基于java:8-alpine镜像来构建Java项目项目,这个镜像默认已经安装了JDK。
Dockerfile文件
- # 指定基础镜像
- FROM java:8-alpine
- # 暴露端口
- EXPOSE 8090
- # 入口,java项目的启动命令
- ENTRYPOINT java -jar /tmp/app.jar
再次构建
docker build -t javaweb:2.0 .
什么是DockerCompose
Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
- version: "3.8" # 版本
- services: #---------------------第一种方式
- mysql: # 服务名称,相当于--name
- image: mysql:5.7.25 # 镜像名称
- environment: # 配置密码,相当于 -e ;对于端口不需要暴露,在集群内部使用,所以不需要配
- MYSQL_ROOT_PASSWORD: 123
- volumes: # 数据卷配置,-d默认就是
- - "/tmp/mysql/data:/var/lib/mysql"
- - "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
-
- #---------------------第二种方式
- web: # 名称web
- build: . # 点表示在当前目录构建
- ports: # 构建完以后直接启动容器
- - "8090:8090"
-
- # -------------原来的方式
- #---------------------第一种方式
- # 容器的启动
- docker run \
- --name mysql \
- -p 3306:3306 \
- -e MYSQL_ROOT_PASSWORD=123456 \ # 设置密码
- -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \ # 挂载配置文件
- -v /tmp/mysql/data:/var/lib/mysql \ #挂载数据目录
- -d mysql:5.7.25
- #---------------------第二种方式
- # 构建镜像
- docker build -t web:1.0
- # 容器的启动‘
- docker run --name web -p 8080:80 -d web:1.0
DockerCompose的详细语法参考官网:Overview | Docker Docs
安装DockerCompose
第一步:Linux下需要通过命令下载
- # 安装
- curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
当然如果有现成的docker-compose文件直接上传到/usr/local/bin/
目录也可以
第二步:修改文件的权限
- # 修改权限,增加可执行权限
- chmod +x /usr/local/bin/docker-compose
补充:Base自动补全命令,以后编写docker-compose命令会有提示
- # 补全命令
- curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
如果上述出现错误,需要修改自己的hosts文件:
- # 上述出现错误可能是域名识别不了raw.githubusercontent.com
- echo "185.199.108.133 raw.githubusercontent.com" >> /etc/hosts
将之前学习的cloud-demo微服务集群利用DockerCompose部署到服务器上
第一步:对于cloud-demo需要部署网关gateway、order-service、user-service、nacos、mysql
第二步:在gateway、order-service、user-service编写Dockerfile
- FROM java:8-alpine
- COPY ./app.jar /tmp/app.jar # 这个app.jar就是我们需要打的jar包
- ENTRYPOINT java -jar /tmp/app.jar
第三步:编写docker-compose(每个服务启动)
- version: "3.2" # 版本
-
- services: # 服务
- nacos: # ---------------第一个服务nacos
- image: nacos/nacos-server # nacos的镜像
- environment: # 环境,相当于-m单击运行的配置
- MODE: standalone
- ports: # 端口
- - "8848:8848"
- mysql: # ---------第二个服务mysql
- image: mysql:5.7.25 # 镜像名称
- environment:
- MYSQL_ROOT_PASSWORD: 123 # 密码
- volumes: # 数据卷挂载
- - "$PWD/mysql/data:/var/lib/mysql" # $PWD得到当前的目录
- - "$PWD/mysql/conf:/etc/mysql/conf.d/"
- user-service: # ---------第三个服务user-service
- build: ./user-service
- order-service: # ---------第四个服务order-service
- build: ./order-service
- gateway: # ---------第五个服务gateway,网关暴露了接口
- build: ./gateway
- ports:
- - "10010:10010"
第四步:修改自己的cloud-demo项目(gateway,order-service,user-service),将数据库、nacos地址都命名为docker-compose中的服务名------------》localhost改为对应的服务名,使用Docker-compose部署,所有服务之间都可以用服务名进行访问。
例如:以下这种情况,localhost改为服务名称nacos
第五步:使用maven打包工具,将项目中的每个微服务(gateway,order-service,user-service)都打包为app.jar
- <build>
- <finalName>app</finalName>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
对cloud-demo项目,利用生命周期,先clean,然后在打包package;将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中
整体目录
每一个服务的目录结构
第六步:将cloud-demo上传至虚拟机,进入cloud-demo目录
docker-compose up -d # up参数表示创建并执行容器,-d后台运行
docker ps查看创建的容器
注:如果你的网速够快一下子就把镜像构建出来,在启动时查看docker-compose logs -f查看日志会发现有的服务启动有问题,这是因为nacos还没有完全启动的原因
- # 建议重启一下除nacos的其它服务
- docker-compose restart order-service gateway user-service
打开浏览器去访问http://192.168.2.129:10010/user/2?authorization=admin能正常访问,表示部署成功!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。