本文参考:
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
这样就算完成了