【二-docker】3. docker compose

作者: 后端技术学习分享 | 来源:发表于2020-03-17 17:51 被阅读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文件
          <servers>
           <server>
             <id>nexus-releases</id>
             <username>admin</username>
             <password>123456</password>
           </server>
           <server>
             <id>nexus-snapshots</id>
             <username>admin</username>
             <password>123456</password>
           </server>
          </servers>
          
        • 配置maven项目里的pom文件 - 配置自动化部署
          • 配置后执行mav deploy即可将项目打包到maven私服仓库
           <!-- id必须要与 settings.xml 中 Servers 配置的 ID 名称保持一致 -->
           <distributionManagement>  
             <repository>  
               <id>nexus-releases</id>  
               <name>Nexus Release Repository</name>  
               <!-- 注意填写自己容器宿主机的ip -->
               <url>http://ip:8081/repository/maven-releases/</url>  
             </repository>  
             <snapshotRepository>  
               <id>nexus-snapshots</id>  
               <name>Nexus Snapshot Repository</name>  
               <url>http://ip:8081/repository/maven-snapshots/</url>  
             </snapshotRepository>  
           </distributionManagement> 
          
        • 配置代理仓库
          <repositories>
             <repository>
                 <id>nexus</id>
                 <name>Nexus Repository</name>
                 <!-- 注意填写自己容器宿主机的ip -->
                 <url>http://ip:8081/repository/maven-public/</url>
                 <snapshots>
                     <enabled>true</enabled>
                 </snapshots>
                 <releases>
                     <enabled>true</enabled>
                 </releases>
             </repository>
          
        </repositories>
        <pluginRepositories>
        <pluginRepository>
        <id>nexus</id>
        <name>Nexus Plugin Repository</name>
        <url>http://ip:8081/repository/maven-public/</url>
        <snapshots>
        <enabled>true</enabled>
        </snapshots>
        <releases>
        <enabled>true</enabled>
        </releases>
        </pluginRepository>
        </pluginRepositories>
        
        
    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 <Network Name>
      # 查看已存在的网络
      docker network list
      
      networks:
        default:
          external:
            name: myapp
      

    资料来源&参考

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

    扫描上方二维码获取更多技术分享

    相关文章

      网友评论

        本文标题:【二-docker】3. docker compose

        本文链接:https://www.haomeiwen.com/subject/zkqxyhtx.html