容器化開發環境 - 應用和數據庫隔離

上一篇容器化開發環境 - 數據庫鏈接和遷移分享了關於如何給容器中的應用建立數據庫鏈接,接下來將分享一下如何將數據庫從應用容器中分離出來。java

爲何要進行分離?當應用和數據庫在同一個容器中運行時,也就意味着,應用和數據庫的生命週期捆綁在了一塊兒,應用和數據庫的運行就會出現相互干擾現象,應用的異常將有可能致使容器的中止,同時也將致使數據庫的關閉。更主要的緣由是,不少時候須要多個容器中的應用鏈接一個數據庫,爲了保證容器之間的運行相互獨立,相互不影響,就有必要將數據庫隔離在獨立的容器中運行,讓數據庫和容器獨處二人世界,同時保證數據庫的生命週期不在受其它應用影響。mysql

Setup Codebase

  • clone hello-dockerie repolinux

    $ git clone https://github.com/aikin/hello-dockerize.git

Separate MySQL Dockerfile

  • dockerize目錄下建立mysql/Dockerflegit

  • 修改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

Startup

  • 修改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

Check Migrate Result On Intellij IDEA

  • 查看 User 表

user

原文連接

相關文章
相關標籤/搜索