Linux从入门到放弃

docker从安装到部署、编排微服务

2020-03-10  本文已影响0人  chuan_bai

Docker简介:

Docker是一个开源的容器引擎,它有助于更快地交付应用。Docker可将应用程序及基础设施层隔离,并且能将基础设施当做程序一样管理。使用Docker可以更快的打包、测试以及部署应用程序,可以缩短从编写到部署代码的周期


docker架构图

Docker uses a client-server architecture. The Docker client talks to the Docker daemon, which does the heavy lifting of building, running, and distributing your Docker containers. The Docker client and daemon can run on the same system, or you can connect a Docker client to a remote Docker daemon. The Docker client and daemon communicate using a REST API, over UNIX sockets or a network interface.

Docker使用客户端-服务器架构。Docker 客户端与Docker 守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以 在同一系统上运行,或者您可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信。

Docker守护程序

Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。

Docker客户端

Docker客户端(docker)是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时docker run,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用Docker API。Docker客户端可以与多个守护程序通信。

Docker注册表

Docker 注册表存储Docker映像。Docker Hub是任何人都可以使用的公共注册表,并且Docker配置为默认在Docker Hub上查找映像。您甚至可以运行自己的私人注册表。如果使用Docker数据中心(DDC),则其中包括Docker可信注册表(DTR)。

使用docker pulldocker run命令时,所需的图像将从配置的注册表中提取。使用该docker push命令时,会将映像推送到配置的注册表。

一、安装docker

  1. 查看系统版本
root@iZbp15jhfodzncs996bwpdZ:/opt# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"

2.卸载旧版本docker

sudo apt-get remove docker docker-engine docker.io containerd runc
  1. 安装以下包以使apt可以通过HTTPS使用存储库
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
  1. 通过apt-get命令安装docker
sudo apt-get install docker.io
  1. 验证docker是否安装成功
root@iZbp15jhfodzncs996bwpdZ:/opt# docker version
Client:
 Version:           18.09.7
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        2d0083d
 Built:             Fri Aug 16 14:19:38 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.09.7
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       2d0083d
  Built:            Thu Aug 15 15:12:41 2019
  OS/Arch:          linux/amd64
  Experimental:     false
  1. docker基本命令
#docker 登陆有些镜像需要登录后才能下载
docker login

#docker搜索java镜像
docker search java

#docker列出镜像
docker images

#docker下载镜像
docker pull java:8

#docker删除镜像
docker rmi java:8

#把镜像放到docker容器中运行 80端口映射到91端口,-d是后台运行
docker run -dp 91:80 nginx

#列出所有的docker容器
docker ps -a

#列出正在运行的docker容器
docker ps

#docker关闭容器
docker stop fa41d922acb7

#docker强制关闭容器
docker kill fa41d922acb7 


#docker删除容器
docker rm fa41d922acb7

#docker停止所有容器
docker stop $(docker ps -a -q)

#docker 删除所有容器
docker rm $(docker ps -a -q) 

#docker启动已停止的容器
docker start fa41d922acb7

#查看docker容器所有信息
docker inspect fa41d922acb7

#查看容器日志
docker container logs containerId  // containerId 是容器的ID

#查看容器里的进程
docker top fa41d922acb7

#进入docker容器
docker exec -it fa41d922acb7 /bin/bash

#构建自己docker镜像 -t 指定镜像名称
docker build -t nginx:bc .

二、使用docker构建微服务镜像

简介:

使用微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例。如果每个微服务都要手动启停,那么效率之低、 维护量之大可想而知。接下来将讨论如何使用 Docker Compose来轻松、高效地管理容器。为了简单起见将 Docker Compose简称为 Compose。 Compose 是一个用于定义和运行多容器的Docker应用的工具。使用Compose,你可以在一个配置文件(yaml格式)中配置你应用的服 务,然后使用一个命令,即可创建并启动配置中引用的所有服务

下面以我本地的service-eureka-0.0.1-SNAPSHOT.jar包为例

  1. 将jar包上传到linux服务器指定目录,在jar包所在目录创建名为Dockerfile的文件
  2. 在Dockerfile中添加以下内容
# 基于哪个镜像
From java:8
# 复制文件到容器
ADD service-eureka-0.0.1-SNAPSHOT.jar /eureka.jar
# 声明需要暴露的端口
EXPOSE 8761
# 配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","/eureka.jar"]

3、使用docker build命令构建镜像

# 格式: docker build -t 镜像名称:标签 Dockerfile的相对位置 在这里,使用-t选项指定了镜像的标签。执行该命令后,终端将会输出如下的内容

docker build -t eureka:bc-0.01 .

看到以下界面,代表构建成功

docker build -t eureka:bc-0.01 .                                 [c2d44d2]
Sending build context to Docker daemon  44.75MB
Step 1/4 : From java:8
8: Pulling from library/java
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8
 ---> d23bdf5b1b1b
Step 2/4 : ADD service-eureka-0.0.1-SNAPSHOT.jar /eureka.jar
 ---> d03edc243208
Step 3/4 : EXPOSE 8761
 ---> Running in 622e7dfed92e
Removing intermediate container 622e7dfed92e
 ---> f9ecdf5c4f68
Step 4/4 : ENTRYPOINT ["java","-jar","/eureka.jar"]
 ---> Running in 8392f247d010
Removing intermediate container 8392f247d010
 ---> f027f522d4b4
Successfully built f027f522d4b4
Successfully tagged eureka:bc-0.01
  1. 把eureka.bc-0.01镜像放到容器中启动
docker run -p 8761:8761 eureka:bc-0.01
#使用 -v 可以挂载一个主机上的目录到容器的目录
docker run -p 8761:8761 -v /tmp:/tmp eureka:bc-0.01

可以看到项目构建成功了

docker run -p 8761:8761 eureka:bc-0.01                           [c2d44d2]
2020-03-09 16:37:38.389  INFO 1 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6adca536: startup date [Mon Mar 09 16:37:38 UTC 2020]; root of context hierarchy
2020-03-09 16:37:39.426  INFO 1 --- [           main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2020-03-09 16:37:39.570  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'configurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$7c101141] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.3.RELEASE)

2020-03-09 16:37:40.418  INFO 1 --- [           main] c.b.s.ServiceEurekaApplication           : No active profile set, falling back to default profiles: default
2020-03-09 16:37:40.456  INFO 1 --- [           main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@dc24521: startup date [Mon Mar 09 16:37:40 UTC 2020]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@6adca536
2020-03-09 16:37:43.081  INFO 1 --- [           main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=9d421130-cb03-3503-986b-252386a46b4c
2020-03-09 16:37:43.165  INFO 1 --- [           main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2020-03-09 16:37:43.490  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$7c101141] is not eligible for

三、使用docker-compose编排微服务

如果微服务较多,则可以用docker compose来统一编排,我们打算用docker compose来统一编排三个微服务: order服务(service-order),product服务(service-product),config服务(config-server)

编排微服务
1、在根目录创建文件夹/app
2、在app目录下新建docker-compose.yml文件和三个文件夹config,order,prodcut
3、在config,order,prodcut,eureka三个文件夹下分别构建config服务镜像,order服务镜像,prodcut服务镜像,以构建eureka服务镜像为例,在 eureka文件夹下新建dockerfile文件并且将eureka服务的可运行jar包上传到该目录(注意:需要将配置 eureka.client.serviceUrl.defaultZone的值改为http://eureka:8761/eureka/,默认情况下Compose以服务名称作为hostname被其他容 器访问),dockerfile文件内容如下

  1. 创建docker-compose.yml 文件
 eureka:  #指定服务名
  build: ./eureka  #指定Dockerfile路径
  ports:
    - "8761:8761"
  expose: 
    - 8761  #对外暴露的端口
  1. 在docker-compose.yml 所在目录用以下命令启动
docker-compose up

可以看到

docker-compose up                                                [c2d44d2]
Building eureka
Step 1/4 : From java:8
 ---> d23bdf5b1b1b
Step 2/4 : ADD service-eureka-0.0.1-SNAPSHOT.jar /eureka.jar
 ---> 7221ad9bff2e
Step 3/4 : EXPOSE 8761
 ---> Running in 371df837256d
Removing intermediate container 371df837256d
 ---> f162e7c43ae1
Step 4/4 : ENTRYPOINT ["java","-jar","/eureka.jar"]
 ---> Running in 8262069b6974
Removing intermediate container 8262069b6974
 ---> 58c88d2bfb4c
Successfully built 58c88d2bfb4c
Successfully tagged docker_eureka:latest
WARNING: Image for service eureka was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating docker_eureka_1 ... done
Attaching to docker_eureka_1
eureka_1  | 2020-03-09 17:14:19.670  INFO 1 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@16c0663d: startup date [Mon Mar 09 17:14:19 UTC 2020]; root of context hierarchy
eureka_1  | 2020-03-09 17:14:20.440  INFO 1 --- [           main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring

若要使用docker-compose编排多个微服务则可以每个微服务创建一个Dockerfile,最后用docker-componse统一编排

四、docker-compose编排多个微服务的配置文件

version: '2'    #docker的文件格式版本
services:
  service-eureka:    #docker服务名
    image: eureka    #docker镜像
    ports:
      - "9000:9000"
  service-config: 
    image: config-server
    ports:  
      - "9001:9001" 
  service-order:    
    image: service-order
    ports: 
      - "9002:9002"
  service-product:    
    image: service-product
    ports: 
      - "9004:9004"

docker-compose扩容

docker-compose scale order=2 eureka=2
上一篇下一篇

猜你喜欢

热点阅读