zoukankan      html  css  js  c++  java
  • docker compose项目

    本文参考:

    https://www.cnblogs.com/jmcui/p/9395375.html

    https://www.cnblogs.com/jmcui/p/9512795.html

    1.Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。

    2.Docker-Compose 是 Docker 的一种编排服务,是一个用于在 Docker 上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。

    3.通过 Docker-Compose 用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题

    4.docker compose中的两个重要概念

    服务 (service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例

    项目 (project) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

    Docker Compose 安装

    1.

    curl -L https://github.com/docker/compose/releases/download/1.5.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    注意版本为1.5.2,最新版本在CentOS6.8上运行回报如下错误
    docker-compose: /lib64/libc.so.6: version `GLIBC_2.14’ not found (required by /tmp/_MEIXH1zkM/libz.so.1)
    所以不要安装最新版本

    2.

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

    3. docker-compose version

    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    docker-compose 常用指令:且执行下述docker-compose 指令的时候,也要在有docker-compose.yml的地方执行

    docker-compose [命令] -help查看某个命令的帮助(神器,授人以鱼不如授人以渔)。

    docker-compose config:验证 Compose 文件(docker-compose.yml)格式是否正确,若正确则显示配置。若格式错误则显示原因。

    docker-compose up:尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。

    -d 在后台运行服务容器。
    --no-color 不使用颜色来区分不同的服务的控制台输出。
    --no-deps 不启动服务所链接的容器。
    --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
    --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
    --no-build 不自动构建缺失的服务镜像。
    -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

    docker-compose down:此命令会停止 up 命令所启动的容器,并移除网络。

    docker-compose images :列出 Compose 文件中包含的镜像。

    docker-compose ps:列出项目中目前的所有容器。

    docker-compose ps --service:列出项目中目前的所有服务(重要,很多命令都是基于服务来操作的)。

    docker-compose logs [options] [SERVICE...]:查看服务容器的日志输出。

    docker-compose exec [SERVICE] bash : 进入指定的容器。

    docker-compose stop [options] [SERVICE...] :停止已经处于运行中的容器,但不删除它。

    docker-compose kill -s SIGINT [SERVICE...] :通过发送 SIGINT 信号来强制停止服务容器(类似于stop)

    docker-compose start [SERVICE...] :启动已经存在的服务容器。

    docker-compose restart [options] [SERVICE...]:重启项目中的服务

    docker-compose rm [options] [SERVICE...]:删除所有(停止状态的)服务容器,-f 强制删除,包括非停止状态 -v 删除容器所挂载的数据卷。

    docker-compose pause [SERVICE...]:暂停一个服务容器。

    docker-compose unpause [SERVICE...]:恢复处于暂停状态中的服务。

    docker-compose scale [options] [SERVICE=NUM...]:设置指定服务运行的容器个数。(神器,照这样岂不是很简单就实现了分布式?)

    docker-compose top:查看各个容器内运行的进程


    docker-compose操作实践部分:(Docker部署web应用,docker-compose编排一个tomcat,一个mysql)
    1.首先要新建并编写docker-compose.yml
    version: "2.2"
    services:
      db:
        image: mysql:5.6
        command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --init-connect='SET NAMES utf8mb4;'
        ports:
         - "3306:3306"
        volumes:
         - /var/mysqldb:/var/lib/mysql
         - /docker/mysql/my.cnf:/etc/mysql/conf.d
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: 12345678
      web:
        build: .
        #dockerfile: Dockerfile
        ports:
         - "8080:8080"
        depends_on:
         - db
        restart: always
        environment:
          mysql.address: db:3306
    
    
    对于docker-compose.yml文件

    这里需要注意的是:

    1.冒号后面必须加空格
    2. version 后面用双引号 2.2

    2.上述设计的Dockfile文件的编写:
    
    
    FROM openjdk:8-jdk
    
    ENV CATALINA_HOME /usr/local/tomcat
    ENV PATH $CATALINA_HOME/bin:$PATH
    RUN mkdir -p "$CATALINA_HOME"
    WORKDIR $CATALINA_HOME
    
    # let "Tomcat Native" live somewhere isolated
    ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
    ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR
    
    # see https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/KEYS
    # see also "update.sh" (https://github.com/docker-library/tomcat/blob/master/update.sh)
    ENV GPG_KEYS 05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 713DA88BE50911535FE716F5208B0AB1D63011C7 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23
    
    ENV TOMCAT_MAJOR 7
    ENV TOMCAT_VERSION 7.0.94
    ENV TOMCAT_SHA512 b16f4b08591199e15f953c34965389a80d5597c28626a51c71ce42695ddd3359dc4df7f333ef0e1a1e8f9b2b6245041d57607c46764f33e560246c119cdc0f7a
    
    ENV TOMCAT_TGZ_URLS 
    # https://issues.apache.org/jira/browse/INFRA-8753?focusedCommentId=14735394#comment-14735394
        https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz 
    # if the version is outdated, we might have to pull from the dist/archive :/
        https://www-us.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz 
        https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz 
        https://archive.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz
    
    ENV TOMCAT_ASC_URLS 
        https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc 
    # not all the mirrors actually carry the .asc files :'(
        https://www-us.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc 
        https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc 
        https://archive.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc
    
    RUN set -eux; 
        
        savedAptMark="$(apt-mark showmanual)"; 
        apt-get update; 
        
        apt-get install -y --no-install-recommends gnupg dirmngr; 
        
        export GNUPGHOME="$(mktemp -d)"; 
        for key in $GPG_KEYS; do 
            gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; 
        done; 
        
        apt-get install -y --no-install-recommends wget ca-certificates; 
        
        success=; 
        for url in $TOMCAT_TGZ_URLS; do 
            if wget -O tomcat.tar.gz "$url"; then 
                success=1; 
                break; 
            fi; 
        done; 
        [ -n "$success" ]; 
        
        echo "$TOMCAT_SHA512 *tomcat.tar.gz" | sha512sum --strict --check -; 
        
        success=; 
        for url in $TOMCAT_ASC_URLS; do 
            if wget -O tomcat.tar.gz.asc "$url"; then 
                success=1; 
                break; 
            fi; 
        done; 
        [ -n "$success" ]; 
        
        gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz; 
        tar -xvf tomcat.tar.gz --strip-components=1; 
        rm bin/*.bat; 
        rm tomcat.tar.gz*; 
        command -v gpgconf && gpgconf --kill all || :; 
        rm -rf "$GNUPGHOME"; 
        
        nativeBuildDir="$(mktemp -d)"; 
        tar -xvf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1; 
        apt-get install -y --no-install-recommends 
            dpkg-dev 
            gcc 
            libapr1-dev 
            libssl-dev 
            make 
        ; 
        ( 
            export CATALINA_HOME="$PWD"; 
            cd "$nativeBuildDir/native"; 
            gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; 
            aprConfig="$(which apr-1-config)"; 
            ./configure 
                --build="$gnuArch" 
                --libdir="$TOMCAT_NATIVE_LIBDIR" 
                --prefix="$CATALINA_HOME" 
                --with-apr="$aprConfig" 
                --with-java-home="$JAVA_HOME" 
                --with-ssl=yes; 
            make -j "$(nproc)"; 
            make install; 
        ); 
        rm -rf "$nativeBuildDir"; 
        rm bin/tomcat-native.tar.gz; 
        
    # reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
        apt-mark auto '.*' > /dev/null; 
        [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; 
        find "$TOMCAT_NATIVE_LIBDIR" -type f -executable -exec ldd '{}' ';' 
            | awk '/=>/ { print $(NF-1) }' 
            | sort -u 
            | xargs -r dpkg-query --search 
            | cut -d: -f1 
            | sort -u 
            | xargs -r apt-mark manual 
        ; 
        apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; 
        rm -rf /var/lib/apt/lists/*; 
        
    # sh removes env vars it doesn't support (ones with periods)
    # https://github.com/docker-library/tomcat/issues/77
        find ./bin/ -name '*.sh' -exec sed -ri 's|^#!/bin/sh$|#!/usr/bin/env bash|' '{}' +; 
        
    # fix permissions (especially for running as non-root)
    # https://github.com/docker-library/tomcat/issues/35
        chmod -R +rX .; 
        chmod 777 logs work
    
    # verify Tomcat Native is working properly
    RUN set -e 
        && nativeLines="$(catalina.sh configtest 2>&1)" 
        && nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')" 
        && nativeLines="$(echo "$nativeLines" | sort -u)" 
        && if ! echo "$nativeLines" | grep 'INFO: Loaded APR based Apache Tomcat Native library' >&2; then 
            echo >&2 "$nativeLines"; 
            exit 1; 
        fi
    
    EXPOSE 8080
    COPY ies.war /usr/local/tomcat/webapps/
    CMD ["catalina.sh","run"]

    这里 ies.war包和Dockfile,以及docker-compose.yml,要在同一个文件夹里,而且执行上述docker-compose 指令的时候,也要在有docker-compose.yml的地方执行

    需要指出的是ies.war包中的数据库配置信息,使用的是docker-compose.yml配置文件中的环境变量

    3. 上述都弄好之后:执行  docker-compose up -d

    就可以了

    4.但是这样执行,一般数据库是没有新建ies 这个database的,也就是mysql容器先起来了,但是没database,没表,所以web(tomcat)起的时候会报错
    但是执行docker-compose ps --service的时候还能看到web(也就是tomcat)所以,先停掉web这个service,docker-compose stop web
    然后远程连接数据库,在数据库中新建ies 这个database,然后倒入sql文件

    然后再重启 docker-compose restart web
    这样就算完成了
  • 相关阅读:
    Python 学习笔记:需要仔细阅读一个函数
    asp.net 实现一个简单CAS Server
    用代码旋转屏幕
    Cassandra API60 Java 代码示例
    Ajax跨域访问代理类,支持GET和POST方法
    Android 给自己的类加个事件
    Python 学习笔记: 备份工具
    Android SQLiteHelper
    转:在 CLI 中練習 Data Model
    Java修饰符public,private,protected及默认的区别
  • 原文地址:https://www.cnblogs.com/zhangshitong/p/11097828.html
Copyright © 2011-2022 走看看