Docker
Good Monday morning! Over the weekend, there was a comment to my previous post coveringusing Ansible to build Docker imagesfromMichael DeHaan, CTO and creator ofAnsible(thank you!) reminding me of his work discussed in his blog postInstalling and Building Docker with Ansiblethat is definitely worth sharing and the method I first used to build Docker images and wrotemy first rolethat will be shared in this post.
For the reader just joining, the previous posts in this series "Docker: Containers for the Masses" are:
- Introduction-- Introduction toDocker
- Installation-- Installation ofDocker
- Using Docker-- UsingDocker
- Ansible and Docker-- Using Ansible to manageDocker
- Building Docker Images using Ansible-- Using Ansible to buildDockerimages
Building Docker Images with Ansible using a Dockerfile
Michael's articledetails how to install Ansible, how to usePaul Durivage'sangstwad.dcoker_ubuntu Ansible role, also features an important-to-know way of building Docker images whereby an image is build using a Dockerfile that specifies the installation ofAnsible, checks out your playbook repository which it then runs with Ansible resulting in a built image with everything you would want on that image. This is different than in the previous post that details using Ansible to run theDockerimage-building process and is yet another example on how usingAnsibleandDockertogether is flexible and the approach to both interchangeable and each method equally valid depending on what the user requires.
Additionally, I used this methodology when I first started usingAnsibleandDockerand forked Michael's repository, adding aGalera role.
The Playbook
In addition to showing yet another way to buildDockerimages, this post will also give the reader more insight into usingAnsiblein general and show another example of what one can do with aDockerfile.
This post will detail a playbook I wrote when I forked thedocker_dna repo. In my role with the HP ATG Group, I was tasked with researching Ansible and Docker and wanted to accomplish several things: Learn Docker and Ansible as well as see if my experience -- and a [Salt][saltstack] template and methodology for setting up a Galera cluster could be easily ported toAnsible.
Directory layout
The repo, when cloned, there are thebase
,rabbitmq
,zookeeper
, andgalera
subdirectories. The last one was added by myself when I used this repo to get familiar with this methodology for buildingDockerimages. In that subdirectory
<code data-lang="text">$ ls -1dna.ymldocker-dna_galera.ymlDockerfilegroup_varshost_varsREADME.mdroles</code>
Top-level playbook
Thedna.yml
playbook sets some variables and includesdocker-dns_galera.yml
:
<code data-lang="text">---# file: dna.yml- include: docker-dna_galera.yml</code>
Tasks
The tasks that then are used for this role which are broken up into specific operations:
<code data-lang="text">$ ls -1 roles/docker-dna_galera/tasks/clustercheck.ymlconfigure_galera.ymlgrants.ymlinstall_galera.ymlmain.ymlmisc.ymlrepo.yml</code>
Specifying using thedocker-dna_galera
role
docker-dna_galera.yml
in turn uses the rolescommon
anddocker-dns_galera
<code data-lang="text">---# file: docker-dna_galera.yml- hosts: docker-dna_galeraroles:- common- docker-dna_galera</code>
Role variables
By using thedocker-dns_galera
role, the role's variables are set in the fileroles/docker-dna_galera/vars/main.yml
which contains variables used by the the templatesroles/docker-dna_galera/templates/etc/mysql/my.cnf.j2
androles/docker-dna_galera/templates/usr/bin/clustercheck.j2
, as well as some of the role's tasks.
<code data-lang="text">---# file: roles/docker-dna_galera/vars/main.yml# these values are default - change for security!galera: dbusers: xtrabackup: username: xtrabackup password: xtrabackup docker: username: docker password: docker host: 172.17.% clustercheck: username: clustercheck password: clustercheck</code>
Top-level playbook including tasks
main.yml
includes each task in the order it needs to be run:
<code data-lang="text">--# file: roles/docker-dna_percona/tasks/main.yml- include: misc.yml- include: repo.yml- include: install_galera.yml- include: grants.yml- include: configure_galera.yml- include: clustercheck.yml</code>
Misc playbook
The first taskmisc.yml
installs vim or any other package other than thePerconapackages:
<code data-lang="text">---# file: roles/docker-dna_percona/tasks/misc.yml- name: Install things I likeapt: pkg= state=presentwith_items:- vim</code>
Set the repo
Therepo.yml
task simply sets up apt to use thePerconaapt repo:
<code data-lang="text">---# file: roles/docker-dna_galera/tasks/repo.yml- name: Obtain Percona public key# apt_key: url=http://keys.gnupg.net/pks/lookup?op=get&search=0x1C4CBDCDCD2EFD2Aapt_key: url=http://www.percona.com/downloads/RPM-GPG-KEY-percona state=present- name: Add Percona repositoryapt_repository: repo='deb http://repo.percona.com/apt precise main'state=present- name: Add Percona source repositoryapt_repository: repo='deb-src http://repo.percona.com/apt precise main'state=present- name: Update apt cacheapt: update_cache=yes</code>
Install the database software
Theinstall_galera.yml
task installsPercona XtraDB Clusteras well as copying a startup script into /usr/local/bin. This is somewhat historic as upstart didn't work with older versions ofDocker
<code data-lang="text">---- name: Install Percona XtraDB Cluster serverapt: pkg= state=presentwith_items:- percona-xtradb-cluster-server-5.6- python-mysqldb- xinetd- telnet- name: Copy the helper scriptcopy: src=usr/local/bin/mysql_run.shdest=/usr/local/bin/mysql_run.shmode=0755</code>
Set the database grants
Thegrants.yml
task sets the grants for the database that are needed to run a successful Galera cluster
<code data-lang="text">---# file: roles/docker-dna_percona/tasks/grants.yml- name: Add Docker database usermysql_user: user= host=password= priv=*.*:"all privileges"- name: Add xtrabackup database user (for Galera SST)mysql_user: user= host="localhost" password= priv=*.*:"grant, reload, replication client"- name: Add clustercheck database user (for clustercheck/xinetd -> haproxy)mysql_user: user= host="localhost" password= priv=*.*:"grant, reload, replication client"</code>
Configure the database
configure_galera.yml
generates/etc/mysql/my.cnf
and shuts down themysqld
process. Why shut it down? Because the container this is running on is only for building the image and just as when creating a snapshot, it makes more sense to not have a running database with open file-handles that an image is created from.
<code data-lang="text">---# file: roles/docker-dna_percona/tasks/configure_galera.yml- name: Configure Percona XtraDB Cluster servertemplate: src=etc/mysql/my.cnf.j2dest=/etc/mysql/my.cnf- name: Stop MySQLaction: service name=mysql state=stopped</code>
Set up the clustercheck script forHAProxy
The last task,clustercheck.yml
, sets up the python script used byHAProxyto determine which master to use. Why not the original xinetd-based clustercheck script? The author was never able to get the xinetd-based clustercheck script working with Docker.
<code data-lang="text"># file: roles/docker-dna_percona/tasks/clustercheck.yml- name: Copy clustercheck scriptcopy: src=usr/local/bin/pyclustercheck dest=/usr/local/bin/pyclustercheck owner=root group=root mode=0700</code>
Template generation
The templates for thedocker-dna_percona
role are themy.cnf.j2
jinja template which is generated as/etc/mysql/my.cnf
and transliterates the variables set in the previously-mentioned variables file. This snippet shows the Galera-specific mysql options. The cluster address is set to bootstrap. Remember that this is an image that is being built. One would need to useAnsibleto configure this value to reflect node membership state of the cluster when the containers are run that use this image as well as set different passwords.
<code data-lang="text">wsrep_provider= /usr/lib/libgalera_smm.sowsrep_slave_threads = 4wsrep_sst_method= xtrabackupwsrep_sst_auth= :wsrep_cluster_name= percona-clusterwsrep_cluster_address = gcomm://wsrep_provider_options= gcache.size=2G;</code>
Dockerfile goodness
Finally, theDockerfile! This is where all the work happens.
<code data-lang="text"># docker-dna/galera/Dockerfile## VERSION0.1.0#FROM capttofu/docker-dna_baseMAINTAINER Patrick aka CaptTofu Galbraith , patg@patg.net# Update distributionRUN apt-get update / && apt-get upgrade -y / && apt-get clean# Add filesADD . ./DockerDNA# Install Percona XtraDB Cluster RUN ( echo '[docker-dna_galera]' && / echo 'localhost' /) > /etc/ansible/hosts / && ansible-playbook ./DockerDNA/dna.yml --connection=local / && apt-get clean# Expose MySQL/GaleraEXPOSE 3306 4444 4567 4568 9200ENTRYPOINT ["/usr/local/bin/mysql_run.sh"]</code>
The aboveDockerfilespecifies using thecapttofu/docker-dna_base
image as a base. This image already has ansible and it's prerequisite libraries pre-installed and ready to use. The first event that is run in the Dockerfile is to update the apt system. Next, everything in the current repository is copied to aDockerDNA
directory in the root directory of the temporary container.
Building the image
Next, by runningdocker build .
in the same directory, the image will be built, using the pre-installed ansible, run with a l;ocal connection, in this case.
<code data-lang="text">docker-dna-galera/galera$ docker build .Uploading context 49.15 kBUploading contextStep 0 : FROM capttofu/docker-dna_basePulling repository capttofu/docker-dna_base1e47da3640f1: Download complete80cd3d2446e3: Download complete5607ff993e85: Download complete27e469823903: Download complete ---> 167dc428d943Step 1 : MAINTAINER Patrick aka CaptTofu Galbraith , patg@patg.net ---> Running in ceb1ec12aab7 ---> c7916cff77cdRemoving intermediate container ceb1ec12aab7Step 2 : RUN apt-get update&& apt-get upgrade -y&& apt-get clean ---> Running in d5b1189506ecGet:1 http://security.ubuntu.com precise-security Release.gpg [198 B]Get:2 http://ppa.launchpad.net precise Release.gpg [316 B] Hit http://archive.ubuntu.com precise/main Translation-enHit http://archive.ubuntu.com precise/universe Translation-enGet:20 http://archive.ubuntu.com precise-updates/main Translation-en [431 kB]Get:21 http://archive.ubuntu.com precise-updates/universe Translation-en [180 kB]Fetched 4734 kB in 20s (228 kB/s)Reading package lists...Reading package lists...Building dependency tree...Reading state information...The following packages have been kept back:ansible initscripts upstartThe following packages will be upgraded:apt apt-utils base-files ca-certificates curl dpkg file gnupg gpgv ifupdowninitramfs-tools initramfs-tools-bin iproute libapt-inst1.4 libapt-pkg4.12libc-bin libc6 libcurl3 libcurl3-gnutls libdrm-intel1 libdrm-nouveau1alibdrm-radeon1 libdrm2 libgnutls26 libmagic1 libssl1.0.0 libudev0libyaml-0-2 multiarch-support openssh-client openssl perl-base procpspython-apt python-apt-common python-software-properties python2.7python2.7-minimal tzdata udev40 upgraded, 0 newly installed, 0 to remove and 3 not upgraded.Need to get 23.0 MB of archives.After this operation, 14.3 kB of additional disk space will be used.Get:1 http://archive.ubuntu.com/ubuntu/ precise-updates/main base-files amd64 6.5ubuntu6.7 [61.0 kB]Get:2 http://archive.ubuntu.com/ubuntu/ precise-updates/main dpkg amd64 1.16.1.2ubuntu7.5 [1829 kB]Get:40 http://archive.ubuntu.com/ubuntu/ precise-updates/main python-software-properties all 0.82.7.7 [23.5 kB]debconf: unable to initialize frontend: Dialogdebconf: (TERM is not set, so the dialog frontend is not usable.)debconf: falling back to frontend: ReadlineInstalling new version of config file /etc/issue.net ...ldconfig deferred processing now taking placeProcessing triggers for initramfs-tools ... ---> 0a8159128717Removing intermediate container d5b1189506ecStep 3 : ADD . ./DockerDNA ---> 93766d0fc5b2Removing intermediate container f4b216a8ddbfStep 4 : RUN ( echo '[docker-dna_galera]' &&echo 'localhost') > /etc/ansible/hosts&& ansible-playbook ./DockerDNA/dna.yml --connection=local&& apt-get clean ---> Running in e41cd0dba011PLAY [docker-dna_galera] ******************************************************GATHERING FACTS ***************************************************************ok: [localhost]TASK: [Install things I like] *************************************************changed: [localhost] => (item=vim)TASK: [Obtain Percona public key] *********************************************changed: [localhost]TASK: [Add Percona repository] ************************************************changed: [localhost]TASK: [Add Percona source repository] *****************************************changed: [localhost]TASK: [Update apt cache] ******************************************************ok: [localhost]TASK: [Install Percona XtraDB Cluster server] *********************************changed: [localhost] => (item=percona-xtradb-cluster-server-5.6,python-mysqldb,xinetd,telnet)TASK: [Copy the helper script] ************************************************changed: [localhost]TASK: [Add Docker database user] **********************************************changed: [localhost]TASK: [Add xtrabackup database user (for Galera SST)] *************************changed: [localhost]TASK: [Add clustercheck database user (for clustercheck/xinetd -> haproxy)] ***changed: [localhost]TASK: [Configure Percona XtraDB Cluster server] *******************************changed: [localhost]TASK: [Stop MySQL] ************************************************************ok: [localhost]TASK: [Copy clustercheck script] **********************************************changed: [localhost]TASK: [Copy clustercheck script] **********************************************changed: [localhost]</code>
Verifying image
When this has completed, the image,capttofu/docker-dna_base
, will be ready to use, in this case a container runningPercona XtraDB Clusterthat will need to be managed by Ansible in order to set up the galera cluster.
<code data-lang="text">$ docker imagesREPOSITORY TAGIMAGE IDCREATED VIRTUAL SIZE<none> <none> cba0a737d93414 hours ago850.7 MBubuntu 12.10e314931015bd13 days ago 172.2 MBubuntu quantale314931015bd13 days ago 172.2 MBubuntu 13.10145762641db913 days ago 180.2 MBubuntu saucy145762641db913 days ago 180.2 MBubuntu 14.04ad892dd21d6013 days ago 275.5 MBubuntu latest ad892dd21d6013 days ago 275.5 MBcapttofu/docker-dna_base latest 167dc428d9434 months ago350.6 MBcapttofu/docker-dna_base 0.1.01e47da3640f14 months ago798.7 MBcapttofu/docker-dna_base 12.04.w1 5150446a5dd34 months ago350.6 MB</none></none></code>
Summary
This blog post showed the reader yet another way to useDockerandAnsibletogether to build Docker images by using aDockerfileto run Ansible to install packages and configure the temporary container that is being used to build the image. This provides yet another example of the flexibility of these two great applications and gives the user yet another method in their toolbox of solutions. Another side-benefit of this article was also learning how to installPercona XtraDB ClusterwithAnsible.

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

MySQLは、中小企業に適しています。 1)中小企業は、顧客情報の保存など、基本的なデータ管理にMySQLを使用できます。 2)大企業はMySQLを使用して、大規模なデータと複雑なビジネスロジックを処理して、クエリのパフォーマンスとトランザクション処理を最適化できます。

INNODBは、次のキーロックメカニズムを通じてファントムの読み取りを効果的に防止します。 1)Next-KeyLockingは、Row LockとGap Lockを組み合わせてレコードとギャップをロックして、新しいレコードが挿入されないようにします。 2)実際のアプリケーションでは、クエリを最適化して分離レベルを調整することにより、ロック競争を削減し、並行性パフォーマンスを改善できます。

MySQLはプログラミング言語ではありませんが、そのクエリ言語SQLにはプログラミング言語の特性があります。1。SQLは条件付き判断、ループ、可変操作をサポートします。 2。ストアドプロシージャ、トリガー、機能を通じて、ユーザーはデータベースで複雑な論理操作を実行できます。

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

MySQLは、データストレージ、管理、クエリ、セキュリティに適したオープンソースのリレーショナルデータベース管理システムです。 1.さまざまなオペレーティングシステムをサポートし、Webアプリケーションやその他のフィールドで広く使用されています。 2。クライアントサーバーアーキテクチャとさまざまなストレージエンジンを通じて、MySQLはデータを効率的に処理します。 3.基本的な使用には、データベースとテーブルの作成、挿入、クエリ、データの更新が含まれます。 4.高度な使用には、複雑なクエリとストアドプロシージャが含まれます。 5.一般的なエラーは、説明ステートメントを介してデバッグできます。 6.パフォーマンスの最適化には、インデックスの合理的な使用と最適化されたクエリステートメントが含まれます。

MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

INNODBのロックメカニズムには、共有ロック、排他的ロック、意図ロック、レコードロック、ギャップロック、次のキーロックが含まれます。 1.共有ロックにより、トランザクションは他のトランザクションが読み取らないようにデータを読み取ることができます。 2.排他的ロックは、他のトランザクションがデータの読み取りと変更を防ぎます。 3.意図ロックは、ロック効率を最適化します。 4。ロックロックインデックスのレコードを記録します。 5。ギャップロックロックインデックス記録ギャップ。 6.次のキーロックは、データの一貫性を確保するためのレコードロックとギャップロックの組み合わせです。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

WebStorm Mac版
便利なJavaScript開発ツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。
