本文參考:html
http://www.javashuo.com/article/p-xiaankol-bc.htmljava
http://www.javashuo.com/article/p-ndugjgzr-ba.htmlmysql
1.Dockerfile 可讓用戶管理一個單獨的應用容器;而 Compose 則容許用戶在一個模板(YAML 格式)中定義一組相關聯的應用容器(被稱爲一個 project,即項目),例如一個 Web 服務容器再加上後端的數據庫服務容器等。git
2.Docker-Compose 是 Docker 的一種編排服務,是一個用於在 Docker 上定義並運行復雜應用的工具,可讓用戶在集羣中部署分佈式應用。github
3.經過 Docker-Compose 用戶能夠很容易地用一個配置文件定義一個多容器的應用,而後使用一條指令安裝這個應用的全部依賴,完成構建。Docker-Compose 解決了容器與容器之間如何管理編排的問題web
4.docker compose中的兩個重要概念sql
服務 (service) :一個應用的容器,實際上能夠包括若干運行相同鏡像的容器實例docker
項目 (project) :由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義。數據庫
1.apache
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
這樣就算完成了