上一篇容器化開發環境 - 數據庫鏈接和遷移分享了關於如何給容器中的應用建立數據庫鏈接,接下來將分享一下如何將數據庫從應用容器中分離出來。java
爲何要進行分離?當應用和數據庫在同一個容器中運行時,也就意味着,應用和數據庫的生命週期捆綁在了一塊兒,應用和數據庫的運行就會出現相互干擾現象,應用的異常將有可能致使容器的中止,同時也將致使數據庫的關閉。更主要的緣由是,不少時候須要多個容器中的應用鏈接一個數據庫,爲了保證容器之間的運行相互獨立,相互不影響,就有必要將數據庫隔離在獨立的容器中運行,讓數據庫和容器獨處二人世界,同時保證數據庫的生命週期不在受其它應用影響。mysql
clone hello-dockerie
repolinux
$ git clone https://github.com/aikin/hello-dockerize.git
在dockerize
目錄下建立mysql/Dockerfle
git
修改mysql/Dockerfile
,配置安裝MySQL
腳本:github
FROM ubuntu:14.04 RUN apt-get update # === Install Mysql === RUN groupadd -r mysql && useradd -r -g mysql mysql RUN mkdir /docker-entrypoint-initdb.d ENV MYSQL_MAJOR 5.7 ENV MYSQL_VERSION 5.7.11-1ubuntu14.04 # gpg: key 5072E1F5: public key "MySQL Release Engineering <mysql-build@oss.oracle.com>" imported RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys A4A9406876FCBD3C456770C88C718D3B5072E1F5 RUN echo "deb http://repo.mysql.com/apt/ubuntu/ trusty mysql-${MYSQL_MAJOR}" > /etc/apt/sources.list.d/mysql.list # the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql) # also, we set debconf keys to make APT a little quieter RUN { \ echo mysql-community-server mysql-community-server/data-dir select ''; \ echo mysql-community-server mysql-community-server/root-pass password ''; \ echo mysql-community-server mysql-community-server/re-root-pass password ''; \ echo mysql-community-server mysql-community-server/remove-test-db select false; \ } | debconf-set-selections RUN apt-get update && apt-get install -y mysql-server="${MYSQL_VERSION}" RUN rm -rf /var/lib/apt/lists/* RUN rm -rf /var/lib/mysql && mkdir -p /var/lib/mysql # comment out a few problematic configuration values # don't reverse lookup hostnames, they are usually another container RUN sed -Ei 's/^(bind-address|log)/#&/' /etc/mysql/my.cnf \ && echo 'skip-host-cache\nskip-name-resolve' | awk '{ print } $1 == "[mysqld]" && c == 0 { c = 1; system("cat") }' /etc/mysql/my.cnf > /tmp/my.cnf \ && mv /tmp/my.cnf /etc/mysql/my.cnf VOLUME /var/lib/mysql COPY docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 3306 CMD ["mysqld"]
修改dockerize/Dockerfile,移除安裝MySQL
的配置:web
FROM ubuntu:14.04 RUN apt-get update ENV VERSION 8 ENV UPDATE 66 ENV BUILD 17 ENV JAVA_HOME /usr/lib/jvm/java-${VERSION}-oracle ENV JRE_HOME ${JAVA_HOME}/jre RUN apt-get install ca-certificates curl \ gcc libc6-dev libssl-dev make \ -y --no-install-recommends RUN curl --silent --location --retry 3 --cacert /etc/ssl/certs/GeoTrust_Global_CA.pem \ --header "Cookie: oraclelicense=accept-securebackup-cookie;" \ http://download.oracle.com/otn-pub/java/jdk/"${VERSION}"u"${UPDATE}"-b"${BUILD}"/server-jre-"${VERSION}"u"${UPDATE}"-linux-x64.tar.gz \ | tar xz -C /tmp RUN mkdir -p /usr/lib/jvm && mv /tmp/jdk1.${VERSION}.0_${UPDATE} "${JAVA_HOME}" RUN apt-get install -y openssl RUN apt-get remove --purge --auto-remove -y \ gcc \ libc6-dev \ libssl-dev \ make RUN apt-get autoclean && apt-get --purge -y autoremove RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN update-alternatives --install "/usr/bin/java" "java" "${JRE_HOME}/bin/java" 1 && \ update-alternatives --install "/usr/bin/javac" "javac" "${JAVA_HOME}/bin/javac" 1 && \ update-alternatives --set java "${JRE_HOME}/bin/java" && \ update-alternatives --set javac "${JAVA_HOME}/bin/javac" WORKDIR /hello-dockerize EXPOSE 8080 EXPOSE 5005 CMD ["bash"]
將dockerize/docker-entrypoint.sh
移動到dockerize/mysql
目錄下sql
修改docker-compose.yml
:docker
web: build: ./dockerize environment: - LANG=C.UTF-8 - TERM=xterm - DEBUG=true links: - mysql:mysql ports: - "8080:8080" - "5005:5005" volumes: - .:/hello-dockerize mysql: build: ./dockerize/mysql env_file: ./dockerize/dev.env ports: - "3306:3306" volumes: - /var/lib/mysql:/var/lib/mysql
啓動容器:數據庫
$ docker-compose up
查看容器ubuntu
$ docker-compse ps ###### Name Command State Ports --------------------------------------------------------------------------------------------------------------- hellodockerize_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp hellodockerize_web_run_1 bash Up 0.0.0.0:5005->5005/tcp, 0.0.0.0:8080->8080/tcp ######
執行 migrate 命令:
root@6485a7a48988:/hello-dockerize# ./gradlew flywayClean flywayInit flywayMigrate
查看 User 表