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
这样就算完成了
原文地址:https://www.cnblogs.com/zhangshitong/p/11097828.html