【二-docker】3. docker compose

前言

近期在学习千峰达摩院的微服务2.0教程。我会把学习过程中提炼出来的知识记录并分享出来~

  • 参考: 【千锋达摩院】微服务架构 2.0

基础

  • 使用场景

    • docker-compose只能用于集成测试环境或开发环境
    • 生产环境如果需要使用容器
      • docker swarm (已过时)
      • Kubernetes
  • 指令

    • 在docker-compose.yml所在目录下查看该容器日志
      • docker-compose logs -f
  • 杂项

    • volumes数据卷不会随着容器的删除而被删除

案例

  1. 准备工作

    # 建立用户app及用户组appg
    groupadd appg
    useradd -g appg app    
    passwd app
    
    # 查看用户
    id app
    
    # 为hadoop添加sudo权限
    visudo 
      app ALL=(ALL) ALL
      # ALL=(ALL) NOPASSWD: ALL # 免密码sudo,暂时不使用
    
    # 将用户添加进docker用户组
    sudo gpasswd -a app  docker
    
    # 切换到app用户
    su app
    
    # 建立相关目录 sotf-存放安装包 install-软件安装目录
    cd /
    sudo mkdir server
    chown app:appg server
    cd server
    mkdir soft 
    mkdir install
    
  2. 部署mysql

    • 建立目录
      cd /server/install
      mkdir mysql
      mkdir mysql/data
      cd mysql
      
    • docker-compose.yml
      version: '3.1'
      services:
        img_mysql5.7:
          image: mysql:5.7
          container_name: con_mysql5.7
          restart: always
          environment:
            MYSQL_ROOT_PASSWORD: 123456
          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
          ports:
            - 3306:3306
          volumes:
            - ./data:/var/lib/mysql
      
  3. 部署tomcat

    • 建立目录
      cd /server/install
      mkdir tomcat85
      mkdir tomcat85/webapps
      mkdir tomcat85/webapps/ROOT
      touch tomcat85/webapps/ROOT/index.html
      cd tomcat85
    • docker-compose.yml
      version: '3.1'
      services:
        img_tomcat8.5:
          restart: always
          image: tomcat:8.5
          container_name: con_tomcat8.5
          ports:
            - 8080:8080
          volumes:
            - ./webapps:/usr/local/tomcat/webapps
          environment:
            TZ: Asia/Shanghai
      
  4. 部署nexus
    Nexus是一个Maven仓库管理器,一般用于maven私服。Nexus3.0与2.0相比有很大的改进

    • 建立目录
      cd /server/install
      mkdir nexus
      mkdir nexus/data
      cd nexus
    • docker-compose.yml
      version: '3.1'
      services:
        img_nexus:
          restart: always
          image: sonatype/nexus3:3.21.1
          container_name: con_nexus
          ports:
            - 8081:8081
          volumes:
            - ./data:/nexus-data
          # 某些情况下,容器内无法解析域名,则可加此配置设置dns
          dns:
            - 114.114.114.114
      
    • 关于权限问题
      如果容器启动失败,使用docker-compose logs查看日志发现是Permission denied问题,
      则原因为挂载出来的./data目录所有者id与容器内nexus用户id不一致。
      • 我的处理方法:
        • 编辑docekr-compose.yml文件,去掉挂载目录的配置,然后重启容器
        • 进入容器查询nexus用户id,可查到nexus id为200
          docker exec -it con_nexus bash 
          id nexus
          
        • 设置宿主机的nexus/data挂载目录所有者为200:200,即与容器内用户id一致
          sudo chown 200:200 data
        • 编辑docker-compose.yml文件,配置挂载目录,然后重启容器
    • 部署成功后尝试使用
      • 访问http://ip:8081
        • 输入admin账号和默认密码登录(密码在nexus-data/admin.password里)
        • 修改admin密码
      • 配置开发机Maven环境的settings.xml文件
        
         
           nexus-releases
           admin
           123456
         
         
           nexus-snapshots
           admin
           123456
         
        
        
      • 配置maven项目里的pom文件 - 配置自动化部署
        • 配置后执行mav deploy即可将项目打包到maven私服仓库
         
           
             
             nexus-releases  
             Nexus Release Repository  
             
             http://ip:8081/repository/maven-releases/  
             
             
             nexus-snapshots  
             Nexus Snapshot Repository  
             http://ip:8081/repository/maven-snapshots/  
             
          
        
      • 配置代理仓库
        
           
               nexus
               Nexus Repository
               
               http://ip:8081/repository/maven-public/
               
                   true
               
               
                   true
               
           
        



      nexus
      Nexus Plugin Repository
      http://ip:8081/repository/maven-public/

      true


      true


      
      
  5. 部署gitlab

    version: '3'
    services:
      img_gitlab:
        image: 'twang2218/gitlab-ce-zh:11.1'
        container_name: con_gitlab
        restart: always
        hostname: '192.168.0.201'
        environment:
          TZ: 'Asia/Shanghai'
          GITLAB_OMNIBUS_CONFIG: |
            # GitLab的资源如图片、git仓库地址都是基于这个url,默认为hostname
            external_url 'http://192.168.50.100'
            # 外部SSH登陆端口,宿主机需要22端口,所以需要换一个 
            gitlab_rails['gitlab_shell_ssh_port'] = 2222 
            # 服务内部IP,可不管
            unicorn['port'] = 8888
            # 默认为80,宿主机80被占用则这里需要改
            nginx['listen_port'] = 8082
        ports:
          - '8082:8082' # 与nginx端口一致
          - '443:443'
          - '2222:22'
        volumes:
          - ./config:/etc/gitlab
          - ./data:/var/opt/gitlab
          - ./logs:/var/log/gitlab
    

docker compose网络设置(转载)

  • 概述
    默认情况下,Compose 会为我们的应用创建一个网络,服务的每个容器都会加入该网络中。这样,容器就可被该网络中的其他容器访问,不仅如此,该容器还能以服务名称作为 Hostname 被其他容器访问。默认情况下,应用程序的网络名称基于 Compose 的工程名称,而项目名称基于 docker-compose.yml 所在目录的名称。如需修改工程名称,可使用 --project-name 标识或 COMPOSE_PORJECT_NAME 环境变量。

  • 示例
    假如一个应用程序在名为 myapp 的目录中,并且 docker-compose.yml 如下所示:

    version: '2'
    services:
      web:
        build: .
        ports:
          - "8000:8000"
      db:
        image: postgres
    

    当我们运行 docker-compose up 时,将会执行以下几步:

    • 创建一个名为 myapp_default 的网络
    • 使用 web 服务的配置创建容器,它以 web 这个名称加入网络 myapp_default
    • 使用 db 服务的配置创建容器,它以 db 这个名称加入网络 myapp_default
    • 容器间可使用服务名称(web 或 db)作为 Hostname 相互访问。例如,web 这个服务可使用 postgres://db:5432 访问 db 容器。
      当服务的配置发生更改时,可使用 docker-compose up 命令更新配置。此时,Compose 会删除旧容器并创建新容器。新容器会以不同的 IP 地址加入网络,名称保持不变。任何指向旧容器的连接都会被关闭,容器会重新找到新容器并连接上去。
  • 使用 links
    默认情况下,服务之间可使用服务名称相互访问。links 允许我们定义一个别名,从而使用该别名访问其他服务。

    version: '2'
    services:
      web:
        build: .
        links:
          - "db:database"
      db:
        image: postgres
    
  • 自定义网络
    一些场景下,默认的网络配置满足不了我们的需求,此时我们可使用 networks 命令自定义网络。networks 命令允许我们创建更加复杂的网络拓扑并指定自定义网络驱动和选项。不仅如此,我们还可使用 networks 将服务连接到不是由 Compose 管理的、外部创建的网络。

    version: '2'
    services:
      proxy:
        build: ./proxy
        networks:
          - front
      app:
        build: ./app
        networks:
          - front
          - back
      db:
        image: postgres
        networks:
          - back
    networks:
      front:
        # Use a custom driver
        driver: custom-driver-1
      back:
        # Use a custom driver which takes special options
        driver: custom-driver-2
        driver_opts:
          foo: "1"
          bar: "2"
    

    其中,proxy 服务与 db 服务隔离,两者分别使用自己的网络;app 服务可与两者通信。使用 networks 命令,即可方便实现服务间的网络隔离与连接。

  • 配置默认网络,这样可为该应用指定自定义的网络驱动

    version: '2'
    services:
      web:
        build: .
        ports:
          - "8000:8000"
      db:
        image: postgres
    networks:
      default:
        # Use a custom driver
        driver: custom-driver-1
    
  • 已存在的网络
    我们可以预先创建一个名为 myapp 的网络,让 Compose 加入这个新创建的网络,使所有 Compose 可以通信,此时使用 external 选项。

    # 创建网络
    docker network create 
    # 查看已存在的网络
    docker network list
    
    networks:
      default:
        external:
          name: myapp
    

资料来源&参考

  • 千锋微服务2.0docker-compose-部署
  • 千锋微服务2.0docker-compose网络配置

个人公众号,定期分享各种技术干货,欢迎扫码关注!

【二-docker】3. docker compose_第1张图片
扫描上方二维码获取更多技术分享

你可能感兴趣的:(【二-docker】3. docker compose)