摘要:上一篇容器化開發環境數據庫連接和遷移分享了關于如何給容器中的應用創建數據庫連接,接下來將分享一下如何將數據庫從應用容器中分離出來。
上一篇容器化開發環境 - 數據庫連接和遷移分享了關于如何給容器中的應用創建數據庫連接,接下來將分享一下如何將數據庫從應用容器中分離出來。
為什么要進行分離?當應用和數據庫在同一個容器中運行時,也就意味著,應用和數據庫的生命周期捆綁在了一起,應用和數據庫的運行就會出現相互干擾現象,應用的異常將有可能導致容器的停止,同時也將導致數據庫的關閉。更主要的原因是,很多時候需要多個容器中的應用連接一個數據庫,為了保證容器之間的運行相互獨立,相互不影響,就有必要將數據庫隔離在獨立的容器中運行,讓數據庫和容器獨處二人世界,同時保證數據庫的生命周期不在受其它應用影響。
Setup Codebase
clone hello-dockerie repo
$ git clone https://github.com/aikin/hello-dockerize.gitSeparate MySQL Dockerfile
在dockerize目錄下創建mysql/Dockerfle
修改mysql/Dockerfile,配置安裝MySQL腳本:
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" 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 skip-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的配置:
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目錄下
Startup
修改docker-compose.yml:
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
查看容器
$ 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 flywayMigrateCheck Migrate Result On Intellij IDEA
查看 User 表
原文鏈接
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26760.html
摘要:容器作為一類操作系統層面的虛擬化技術,其目標是在單一主機交付多套隔離性環境,容器共享同一套主機操作系統內核。與其它容器平臺不同,引入了一整套與容器管理相關的生態系統。每個容器都是相互隔離的保證安全的平臺。 導讀:本文章對Docker技術進行了介紹,闡述了Docker的技術發展歷程、容器與虛擬機的差異、Docker原理、特點、Docker三組件和Docker帶來的影響,為我們進一步理解D...
摘要:有贊容器化方案我們的容器化方案基于和,下面介紹一下我們在各個方面遇到的問題以及解決方案。不過對于上線來說,需要整個運維體系來適配容器化,比如監控發布日志等等。 前言 容器化已經成為一種趨勢,它可以解決很多運維中的痛點,比如效率、成本、穩定性等問題,而接入容器的過程中往往也會碰到很多問題和不便。在有贊最開始做容器化是為了快速交付開發測試環境,在容器化的過程中,我們碰到過容器技術、運維體系...
摘要:八年時間,阿里集團實現了內部容器化鏡像化,經歷了幾代演進。容器技術在阿里的演進過程伴隨著阿里技術架構本身的演進。 八年時間,阿里集團實現了 100%內部容器化鏡像化,經歷了幾代演進。本文將從最初的架構開始,向大家介紹下阿里內部的容器化演化過程。 PouchContainer 現在服務于阿里巴巴集團和螞蟻金服集團的絕大部分 BU, 包括交易&中間件,B2B/CBU/ICBU,搜索廣告數據...
前言 以Docker為代表的容器技術縮短了企業應用從開發、構建到發布、運行的整個生命周期。Gartner推測到2022年將會有75%的全球化企業將在生產中使用容器化的應用(當前約為30%)。由于Docker往往難以獨立支撐起大規模容器化部署,因此誕生了Kubernetes等容器編排工具,解決了大規模容器的組織和管理難題。 但事實上,Kubernetes的使用體系還是非常復雜的,對于企業的開...
摘要:幫助科盾實現了業務的快速回滾和橫向擴展。后續,科盾計劃引入集群,并將更多數據處理鏈等上的服務遷移至。前言 以Docker為代表的容器技術縮短了企業應用從開發、構建到發布、運行的整個生命周期。Gartner推測到2022年將會有75%的全球化企業將在生產中使用容器化的應用(當前約為30%)。由于Docker往往難以獨立支撐起大規模容器化部署,因此誕生了Kubernetes等容器編排工具,解決...
閱讀 1755·2021-11-18 13:20
閱讀 1140·2021-10-11 10:59
閱讀 2986·2021-08-24 10:01
閱讀 3499·2019-08-29 14:21
閱讀 3351·2019-08-29 14:15
閱讀 3512·2019-08-26 12:23
閱讀 3342·2019-08-26 11:46
閱讀 3344·2019-08-26 11:35