docker-compose使用

先从 docker 提及

我知道可能有些看到这篇文章的朋友没有了解或者使用过 docker,那我就在这里作一个小小的介绍,已经有过了解的朋友请直接从docker-compose部分看起.javascript

docker 简介

想要理解 docker 是啥,就要先说说 docker 能够解决啥
一句话来讲php

docker 是一种容器技术,做用是用来快速部署服务css

为何说 docker 是快速部署

咱们作一个项目,最不想面对的不是开发,也不是调试,而是部署!!!!
好比你这个机器上的环境是 python3 你用另外一个机器上倒是 python2 或者压根就没有 python 环境。html

好了,这个时候你怎么解决呢。 对,只要去新机器上你就要部署 python。java

嗯~ 好吧, 部署 python 就 python,可是你的项目里面还要用到 MySQL,好的没问题, 你又要去用 pip 去安装 python 的 mysql 模块。 哦对了, 我记咱们的项目里面还有 redis, 两种非对称加密,还有三方队列, 哦, 还有阿里云的接口,对对对对对对哦。 乱七八糟的东西真的好多,搞完了几个小时没有了,遇到网络卡了,那就更没有谱了。python

好了, 咱们进化到,快速1.0 时代

咱们把要安装的东西全都放进离线安装包里面,再写个 bash 脚本
对,这种事情真的有过。 部署全靠一个 bash 脚本,毕竟不用手动了么。 但是就是苦了写脚本的人,我就写过一个脚本写了很久。mysql

因而, 咱们又进化了, 快速2.0时代

咱们把整个系统作成了镜像,存在了光盘里面,每当要架设的时候赶快用镜像作出一个新的系统!
可能经历过的天然会懂,还特么要作镜像啊,离机房远咋办啊!!咱们作游戏,开服快,更新更快!咱们版本更新过快怎么办啊!!咱们还要刻刻刻么? 咱们的 tornado 又更新了,我去,咱们客户端的 protobuf 也更新了,但是咱们有100台服务器啊,为了这一点小小的东西更新么?西八!linux

因而,咱们再次加入光荣的进化, 快速3.0时代

咱们把服务装进了 docker 中
咱们把作好的镜像,一个命令 pull 了下来,嗯,蛮快又一个命令 docker start XXXXXX 服务起来了。哦,你说多服务?好吧那就写个docker-compose.file吧。 嗯哼? 你说集群部署 来来来, 有Kubernetes、Mesos,Fleet和Swarm 任君挑选,很差用不要钱。nginx

docker 是部署的最佳辅助,即便你烂成渣渣,docker 也能够扶你上王者。git

docker 安装

 


很简单  docker官网
屏幕快照 2017-03-05 下午7.43.29
Get docker 以后, 有图型系统(windows 之类)的有下一步,下一步。 有 term 接口的。 有  apt-get 之类的软件管理。
安装很是简单,不值得一说。

 

docker 的一些概念

镜像

对!就和我上面说的使用光盘拷贝已经有的镜像同样,咱们的镜像是指一个系统的镜像
咱们的镜像都是基于 linux 的准确来讲是基于 ubuntu 的。 
docker 镜像能够理解为,你在 win 下用ghost 拷贝出来的磁盘镜像。不过他是 linux 版的。

性能损耗

得益于如今的 linux 内核的 namespace, 咱们能够拥有各类直达内耗的容器能够用,你在 docker 中的进程其实进程就是直接的宿主机进程,这一切都在系统启动 clone 函数的时候就决定了, 因此谈不上性能损耗。

容器

容器自己就是咱们最重要的概念,咱们使用 docker 要作的就是容器这个东西。

简单来讲容器是一个镜像的实例

更通俗来讲容器就像你用 vm 或者 virtualbox 使用镜像建立的一个虚拟机实例

hub

就是镜像仓库。

若是你写代码,你确定就知道 github,咱们把代码托管到 github 之上。
若是咱们部署,我确定就要用 dockerhub, 咱们把镜像托管到 docker hub 上(固然咱们也能够假设,或者是用别人假设的hub)
国内有不少三方 dockerhub 服务器, 有阿里云,网易蜂巢,有容云,daocloud 等等等等
至于国外那就更多了,若是非要推荐一家,那就是 amazon 了,毕竟云服务他们家宇宙最强,没有之一,没有对手。

docker 简单使用

搜索镜像

docker search xxx
好比我要架设一个 wordpress,我直接就用
docker search wordpress

root@ubuntu:~# docker search wordpress NAME DESCRIPTION STARS OFFICIAL AUTOMATED wordpress The WordPress rich content management syst... 1574 [OK] appcontainers/wordpress Centos/Debian Based Customizable Wordpress... 34 [OK] bitnami/wordpress Bitnami Docker Image for WordPress 30 [OK] centurylink/wordpress Wordpress image with MySQL removed. 12 [OK] trafex/wordpress Wordpress container with Nginx 1.10 & PHP-... 5 [OK] maximiliend/wordpress A enhanced docker image of WordPress with ... 4 [OK] devgeniem/wordpress-server Minimal wordpress server with nginx and ph... 3 [OK] scjalliance/wordpress WordPress with GD and FreeType 2 [OK] dsifford/wordpress A WordPress docker environment that just w... 2 [OK] bakudankun/wordpress-ja WordPress Japanese Edition forked from off... 1 [OK] ddaishin/wordpress Wordpress日本語最新版 Xdebug OSX... 1 [OK] dsteinkopf/wordpress wordpress clone plus some php extensions 1 [OK] nitra/wordpress nitra/wordpress image 0 [OK] miqueladell/wordpress Just a tailor made Wordpress. 0 [OK] ikoptiev/wordpress Official Wordpress image with max file upl... 0 [OK] tagplus5/wordpress wordpress 0 [OK] rwindegger/wordpress A wordpress php-fpm backend. 0 [OK] appeine/wordpress Container holding WordPress sources 0 [OK] wppier/wordpress wordpress-php7.0-fpm-alpine 0 [OK] svendocker/wordpress wordpress + mcrypt and recode 0 [OK] indiehosters/wordpress WordPress image for IndieHosters service 0 [OK] derjudge/wordpress 1:1 clone of docker-library/wordpress with... 0 [OK] momonga/wordpress wordpress with mbstring, sendmail 0 [OK] deardooley/wordpress Production-ready minimal Wordpress images. 0 [OK] bearbeer/wordpress Wordpress with ssmtp. 0 [OK] root@ubuntu:~# 

第一列就是你能够选择使用的镜像,你固然能够本身制做镜像,并且很容易,可是若是咱们入门的话就直接用别人作好的吧。

下载镜像

我直接用第一个吧
git pull wordpress
这个是在下载镜像的过程当中

root@ubuntu:~# docker pull wordpress Using default tag: latest latest: Pulling from library/wordpress 693502eb7dfb: Pull complete 16328c296404: Pull complete 8b3c97761df6: Pull complete 5e1d4f4f29eb: Pull complete 530750fc5019: Extracting [==================================================>] 1.252 kB/1.252 kB 39e9c6c72db7: Download complete de476ce7ac87: Download complete 4ad13cbbc7d8: Download complete 74c28aa07dc7: Download complete a07a242e36fb: Download complete 3d491d166e88: Download complete cb6c232330f0: Download complete 25a48aec9dc7: Download complete 836344dc17d7: Download complete f5cafd105c82: Download complete fef842449a96: Download complete 9b13cded57f6: Download complete 0733368296e4: Download complete 

下载完成

root@ubuntu:~# docker pull wordpress Using default tag: latest latest: Pulling from library/wordpress 693502eb7dfb: Pull complete 16328c296404: Pull complete 8b3c97761df6: Pull complete 5e1d4f4f29eb: Pull complete 530750fc5019: Pull complete 39e9c6c72db7: Pull complete de476ce7ac87: Pull complete 4ad13cbbc7d8: Pull complete 74c28aa07dc7: Pull complete a07a242e36fb: Pull complete 3d491d166e88: Pull complete cb6c232330f0: Pull complete 25a48aec9dc7: Pull complete 836344dc17d7: Pull complete f5cafd105c82: Pull complete fef842449a96: Pull complete 9b13cded57f6: Pull complete 0733368296e4: Pull complete Digest: sha256:498509cc3778374f65037f8dae67bb660d4fe650e8ac2129135224d5d2d81726 Status: Downloaded newer image for wordpress:latest 

helloworld

程序员的老惯例了

root@ubuntu:~# docker run wordpress echo "hello world" hello world 

这句其实就至关于你的镜像

作到 helloworld 了你就算是入门了。哈哈哈。

推荐一个写颇有层次感的入门docker入门教程

我经常使用的 docker 命令

你可使用帮助看一个命令的大概

docker   # docker 命令帮助 Commands: attach Attach to a running container # 当前 shell 下 attach 链接指定运行镜像 build Build an image from a Dockerfile # 经过 Dockerfile 定制镜像 commit Create a new image from a container's changes # 提交当前容器为新的镜像 cp Copy files/folders from the containers filesystem to the host path # 从容器中拷贝指定文件或者目录到宿主机中 create Create a new container # 建立一个新的容器,同 run,但不启动容器 diff Inspect changes on a container's filesystem # 查看 docker 容器变化 events Get real time events from the server # 从 docker 服务获取容器实时事件 exec Run a command in an existing container # 在已存在的容器上运行命令 export Stream the contents of a container as a tar archive # 导出容器的内容流做为一个 tar 归档文件[对应 import ] history Show the history of an image # 展现一个镜像造成历史 images List images # 列出系统当前镜像 import Create a new filesystem image from the contents of a tarball # 从tar包中的内容建立一个新的文件系统映像[对应 export] info Display system-wide information # 显示系统相关信息 inspect Return low-level information on a container # 查看容器详细信息 kill Kill a running container # kill 指定 docker 容器 load Load an image from a tar archive # 从一个 tar 包中加载一个镜像[对应 save] login Register or Login to the docker registry server # 注册或者登录一个 docker 源服务器 logout Log out from a Docker registry server # 从当前 Docker registry 退出 logs Fetch the logs of a container # 输出当前容器日志信息 port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查看映射端口对应的容器内部源端口 pause Pause all processes within a container # 暂停容器 ps List containers # 列出容器列表 pull Pull an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或者库镜像 push Push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器 restart Restart a running container # 重启运行的容器 rm Remove one or more containers # 移除一个或者多个容器 rmi Remove one or more images # 移除一个或多个镜像[无容器使用该镜像才可删除,不然需删除相关容器才可继续或 -f 强制删除] run Run a command in a new container # 建立一个新的容器并运行一个命令 save Save an image to a tar archive # 保存一个镜像为一个 tar 包[对应 load] search Search for an image on the Docker Hub # 在 docker hub 中搜索镜像 start Start a stopped containers # 启动容器 stop Stop a running containers # 中止容器 tag Tag an image into a repository # 给源中镜像打标签 top Lookup the running processes of a container # 查看容器中运行的进程信息 unpause Unpause a paused container # 取消暂停容器 version Show the docker version information # 查看 docker 版本号 wait Block until a container stops, then print its exit code # 截取容器中止时的退出状态值 Run 'docker COMMAND --help' for more information on a command. 

登陆

登陆你本身的 dockerhub 帐户,要去注册哦
来docker hub注册啊
docker login

查看容器

查看你已经下载好的镜像
docker images

查找镜像

docker search XX

下载镜像

docker pull xx

删除镜像

docker rmi xx

开始

docker run 你的镜像

看日志

docker logs 你的容器

中止一个容器示例

docker stop 你的容器

查看容器状态

docker stats 你的容器

格式

基本上都是这个格式 ,根据上面写好的注释,很容易去使用

更快更好更强

  • 使用 dockerfile
  • 使用 crontab
  • 使用 supervisr

略, 这个要扯起来就太长了

docker-compose 简介

 


一句话
docker-compose 是用来作docker 的多容器控制

 

docker-compose 是什么

docker-compose 是一个用来把 docker 自动化的东西。
有了 docker-compose 你能够把全部繁复的 docker 操做全都一条命令,自动化的完成。

为何要用 docker-compose,他解决了什么

用通俗的语言来讲,咱们平时操做 docker 仍是很原始的一系列动做,你手动使用 docker 的动做能够拆分红

  1. 找到一个系统镜像 // docker search
  2. 安装好 vm 或者 virtual box // apt-get install docker
  3. 在 vm 中安装镜像 // docker run -d -it 你的镜像
  4. 略..

这是最小的动做, 若是你要映射硬盘,设置nat网络或者桥接网络,等等…你就要作更多的 docker 操做, 这显然是很是没有效率的。

可是咱们写在 docker-compose.file 里面就很好了。 你只须要写好后 只运行一句
docker-compose up -d
一切都是那么的简单

那么哪里能够买到呢?

你要你能上网,处处均可以获得他。
我本身的机器上有 python&pip 的环境,因此个人安装很是简单

 


先肯定你是否是安装了 docker
没有安装请看 上面的文章

 

个人环境是
linux-ubuntu:python2:pip
因此个人安装
pip install docker-compose
如此简单

从一个小例开始

root@ubuntu:~/test# cat docker-compose.yml version: '2' services: mariadb: image: 'bitnami/mariadb:latest' environment: - ALLOW_EMPTY_PASSWORD=yes volumes: - /path/to/mariadb-persistence:/bitnami/mariadb root@ubuntu:~/test# docker-compose up Creating network "test_default" with the default driver Creating test_mariadb_1 Attaching to test_mariadb_1 mariadb_1 | mariadb_1 | Welcome to the Bitnami mariadb container mariadb_1 | Subscribe to project updates by watching https://github.com/bitnami/bitnami-docker-mariadb mariadb_1 | Submit issues and feature requests at https://github.com/bitnami/bitnami-docker-mariadb/issues mariadb_1 | Send us your feedback at containers@bitnami.com mariadb_1 | mariadb_1 | nami INFO Initializing mariadb mariadb_1 | mariadb INFO ==> Creating 'root' user with unrestricted access... mariadb_1 | mariadb INFO ==> Flushing privileges... mariadb_1 | mariadb INFO ==> Enabling remote connections... mariadb_1 | mariadb INFO mariadb_1 | mariadb INFO ######################################################################## mariadb_1 | mariadb INFO Installation parameters for mariadb: mariadb_1 | mariadb INFO Root Password: Not set during installation mariadb_1 | mariadb INFO (Passwords are not shown for security reasons) mariadb_1 | mariadb INFO ######################################################################## mariadb_1 | mariadb INFO mariadb_1 | nami INFO mariadb successfully initialized mariadb_1 | INFO ==> Starting mariadb... mariadb_1 | 2017-03-05 15:01:27 139903487235968 [Note] InnoDB: Highest supported file format is Barracuda. mariadb_1 | 2017-03-05 15:01:27 139903487235968 [Note] InnoDB: 128 rollback segment(s) are active. mariadb_1 | 2017-03-05 15:01:27 139903487235968 [Note] InnoDB: Waiting for purge to start mariadb_1 | 2017-03-05 15:01:27 139903487235968 [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.34-79.1 started; log sequence number 1616829 mariadb_1 | 2017-03-05 15:01:27 139902956046080 [Note] InnoDB: Dumping buffer pool(s) not yet started 

先安装吧

若是你和个人环境相同,请直接看个人 docker-compose 安装

若是是别的话,别担忧,这里有
安装指南

helloworld

root@ubuntu:~/test# cat docker-compose.yml version: '2' services: mariadb: image: 'bitnami/mariadb:latest' environment: - ALLOW_EMPTY_PASSWORD=yes volumes: - /path/to/mariadb-persistence:/bitnami/mariadb command: echo "hello world" root@ubuntu:~/test# root@ubuntu:~/test# root@ubuntu:~/test# docker-compose up Starting test_mariadb_1 Attaching to test_mariadb_1 mariadb_1 | mariadb_1 | Welcome to the Bitnami mariadb container mariadb_1 | Subscribe to project updates by watching https://github.com/bitnami/bitnami-docker-mariadb mariadb_1 | Submit issues and feature requests at https://github.com/bitnami/bitnami-docker-mariadb/issues mariadb_1 | Send us your feedback at containers@bitnami.com mariadb_1 | mariadb_1 | hello world test_mariadb_1 exited with code 0 

服务更新

软升级

$ docker-compose stop wordpress 中止容器运行  $ docker-compose rm wordpress 删除老旧的容器 更新你的 image  $ docker-compose start wordpress 启动新容器 

还好比

你的 nginx 更新了配置文件以后

docker-compose restart nginx

硬升级

docker-compose stop

升级你的程序

你要从新
docker-compose up

从日志获得须要的信息

直接使用 logs

docker-compose logs nginx
欧 shit 直接给我屏幕刷爆了

使用相似linux tail 命令

咱们的 tial 命令通常是什么样的呢
tail -f xx.file

咱们的docker-compose log 倒是这样

root@ubuntu:~# docker-compose logs -f --tail 10 nginx
Attaching to root_nginx_1
nginx_1 | 64.79.100.22 - - [05/Mar/2017:16:57:18 +0000] "GET /wp-admin/ HTTP/1.1" 302 0 "http://www.yunlan.name/wp-admin/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
nginx_1 | 64.79.100.22 - - [05/Mar/2017:16:57:18 +0000] "GET /wp-login.php?action=lostpassword HTTP/1.1" 200 1201 "http://www.yunlan.name/wp-login.php?action=lostpassword" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
nginx_1 | 64.79.100.22 - - [05/Mar/2017:16:57:18 +0000] "GET /wp-login.php?action=lostpassword HTTP/1.1" 200 1201 "-" "Mozilla"
nginx_1 | 64.79.100.22 - - [05/Mar/2017:16:57:18 +0000] "GET /wp-login.php?redirect_to=http%3A%2F%2Fwww.yunlan.name%2Fwp-admin%2F&reauth=1 HTTP/1.1" 200 1265 "http://www.yunlan.name/wp-admin/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
nginx_1 | 64.79.100.22 - - [05/Mar/2017:16:57:19 +0000] "GET /wp-login.php?redirect_to=http%3A%2F%2Fwww.yunlan.name%2Fwp-admin%2F&reauth=1 HTTP/1.1" 200 1265 "-" "Mozilla"
nginx_1 | 117.150.55.119 - - [05/Mar/2017:16:57:52 +0000] "GET /robots.txt HTTP/1.1" 200 134 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
nginx_1 | 117.150.55.119 - - [05/Mar/2017:16:58:03 +0000] "GET / HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
nginx_1 | 117.150.55.119 - - [05/Mar/2017:16:58:03 +0000] "GET / HTTP/1.1" 200 3844 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
nginx_1 | 117.150.55.119 - - [05/Mar/2017:16:58:03 +0000] "GET /wp-content/plugins/code-prettify/prettify/run_prettify.js?ver=1.3.4 HTTP/1.1" 200 7600 "http://www.yunlan.name/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
nginx_1 | 117.150.55.119 - - [05/Mar/2017:16:58:04 +0000] "GET /wp-content/plugins/code-prettify/prettify/prettify.css HTTP/1.1" 200 722 "http://www.yunlan.name/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"

最近的10条开始

docker-compose 经常使用命令

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the compose file
  create Create services down Stop and remove containers, networks, images, and volumes events Receive real time events from containers exec Execute a command in a running container help Get help on a command kill Kill containers logs View output from containers pause Pause services port Print the public port for a port binding ps List containers pull Pull service images push Push service images restart Restart services rm Remove stopped containers run Run a one-off command scale Set number of containers for a service start Start services stop Stop services top Display the running processes unpause Unpause services up Create and start containers version Show the Docker-Compose version information 

解释一下

build 构建或重建服务
help 命令帮助 kill 杀掉容器 logs 显示容器的输出内容 port 打印绑定的开放端口 ps 显示容器 pull 拉取服务镜像 restart 重启服务 rm 删除中止的容器 run 运行一个一次性命令 scale 设置服务的容器数目 start 开启服务 stop 中止服务 up 建立并启动容器 

docker-compose 如何配置

先看看我本身写的一个 docker-compose.yml

version: '2' services: nginx: image: bitnami/nginx:latest ports: - '80:80' - '1443:443' volumes: - /root/wp_yunlan/nginx/:/bitnami/nginx/ mariadb: image: bitnami/mariadb:latest volumes: - /root/wp_yunlan/mariadb:/bitnami/mariadb wordpress: image: bitnami/wordpress:latest depends_on: - mariadb - nginx environment: - WORDPRESS_USERNAME=neptunemoon #这个帐户你是本身设定的 - WORDPRESS_PASSWORD=123123 #这个密码是你本身设定的 ports: - '8080:80' - '8081:443' volumes: - /root/wp_yunlan/wordpress:/bitnami/wordpress - /root/wp_yunlan/apache:/bitnami/apache - /root/wp_yunlan/php:/bitnami/php 

nginx 和 mariadb,wordpress 是要启动的三个服务

顺序不是重要的,咱们看见wordpress中有个 depends_on: 的属性

depends_on: 依赖

表明wordpress 依赖于

- mariadb - nginx 

两个服务, 因此他们两个会先启动

image: 镜像

就是你的 docker 镜像
咱们用
docker search mariadb
找到咱们须要的镜像

root@ubuntu:~/test# docker search mariadb NAME DESCRIPTION STARS OFFICIAL AUTOMATED mariadb MariaDB is a community-developed fork of M... 1192  [OK] paintedfox/mariadb A docker image for running MariaDB 5.5, a ... 29 [OK] bitnami/mariadb Bitnami MariaDB Docker Image 29  [OK] million12/mariadb MariaDB 10 on CentOS-7 with UTF8 defaults 12  [OK] toughiq/mariadb-cluster Dockerized Automated MariaDB Galera Cluste... 9  [OK] webhippie/mariadb Docker images for mariadb 6  [OK] panubo/mariadb-galera MariaDB Galera Cluster 6  [OK] kakilangit/mariadb Docker for MariaDB with OQGraph & TokuDB E... 5  [OK] maxexcloo/mariadb Service container with MariaDB installed a... 4  [OK] tcaxias/mariadb MariaDB containers 1  [OK] desertbit/mariadb This is an extended docker image of the of... 1  [OK] russmckendrick/mariadb A MariaDB image 1  [OK] drupaldocker/mariadb MariaDB for Drupal 1  [OK] jpco/mariadb Mariadb, so I can have it on my raspberry 1  [OK] clearlinux/mariadb MariaDB Server 1  [OK] danielsreichenbach/mariadb Minimal MariaDB container to be used as co... 0  [OK] lucidfrontier45/mariadb Mariadb with some customizable properties 0  [OK] codete/mariadb MariaDB docker image used at Codete. 0  [OK] dogstudio/mariadb MariaDB Container for Dogs 0  [OK] babim/mariadb Mariadb Server on Alpine or Debian. Check ... 0  [OK] objectstyle/mariadb ObjectStyle MariaDB Docker Image 0  [OK] oriaks/mariadb MariaDB 0  [OK] yannickvh/mariadb Custom build of MariaDB based on the offic... 0  [OK] gymnae/mariadb Alpine based simple mariadb 0  [OK] nimmis/mariadb MariaDB multiple versions based on nimmis/... 0  [OK] root@ubuntu:~/test# 

好了,就是bitnami/mariadb

若是你看见有的么有 images ,而是一个 build, 那个说明这个不是用镜像的,而是使用 dockerfile 去构建容器。
若是要说 dockerfile 又要花好久了

想了解 dockerfile 能够看这里
编写Dockerfile

environment 环境变量

这个是在好理解不过的了。
不过这和咱们程序语言设计层面的仍是不同的,这个是容器层面的环境变量。
若是咱们写程序作一些逻辑判断的时候,确定会使用
好比咱们判断如今的编译器,咱们会使用
#if __GNUC__ 或者 #if _MSC_VER
相应的,咱们的容器里面确定也有这样的逻辑,咱们常用环境变量来传值,或者定义一个行为。写过程序的人都懂。

ports 端口映射

映射本机还有镜像的端口。这个没有什么好说的。

volumes 文件映射

有两种格式,
能够对应 docker 操做中的 -v my/path/:/docker/path
还可使用单方面的 -v /path 
这样的话 就至关于 一个匿名映射, 其实仍是在本机有对应目录的。

使用docker inspect -f {{.Volumes}} /path 能够看到详细信息

相对这个了解更多的 深刻理解Docker Volume

docker-compose 须要注意的

我根据我本身的体验,给出几点须要注意的

  1. 不要把 docker 当作数据容器来使用,数据必定要用 volumes 放在容器外面
  2. 不要把 docker-compose 文件暴露给别人, 由于上面有你的服务器信息
  3. 多用 docker-compose 的命令去操做, 不要用 docker 手动命令&docker-compose 去同时操做
  4. 写一个脚本类的东西,自动备份docker 映射出来的数据。
  5. 不要把全部服务都放在一个 docker 容器里面

针对需求开始部署了

设定一个需求

我假定如今咱们的需求是作一个博客系统

咱们的第一印象确定是 wordpress, 没有比这个更专业的了, 固然还有不少,咱们使用 django 吧

用过 django 的确定会知道, django 一开始是要构造工程的。
还有数据之类的

咱们拟订一个过程

  1. python 环境搭建
  2. django 环境搭建
  3. docker-compose.yml 写做
  4. django 构建工程
  5. django 数据库设定
  6. 开始运行
  7. 数据库同步

简单的单机部署

python 环境搭建

Dockerfile

ENV PYTHONUNBUFFERED 1
RUN mkdir /root/testdjango/code    #都写上绝对路径, 注意不要跟我同样。
WORKDIR /root/testdjango/code
ADD requirements.txt /root/testdjango/code/
RUN pip install -r requirements.txt
ADD . /root/testdjango/code/

python 的pip 有一个requirements.txt 文件来专门放依赖环境的

django 环境搭建

requirements.txt

Django psycopg2 

docker-compose.yml 写做

db: image: postgres web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" links: - db 

django 构建工程

docker-compose run web django-admin.py startproject docker_composeexample .

django 数据库设定

咱们作了 volumes, django 的东西在本地有映射。
作过 django 的人都知道 ,咱们的设定都在 settings.py 中

root@ubuntu:~/testdjango/docker_composeexample# cat settings.py """ Django settings for docker_composeexample project. Generated by 'django-admin startproject' using Django 1.10.6. For more information on this file, see https://docs.djangoproject.com/en/1.10/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.10/ref/settings/ """ import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = '3*@nbl2pu$hdmpe-hy&iko_cr_-$%9g=nu2=3x_^g(vy2463d6' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'docker_composeexample.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'docker_composeexample.wsgi.application' # Database # https://docs.djangoproject.com/en/1.10/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } # Password validation # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/1.10/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.10/howto/static-files/ STATIC_URL = '/static/' root@ubuntu:~/testdjango/docker_composeexample# 

咱们只设置 数据库

DATABASES = {
    'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'postgres', 'USER': 'postgres', 'HOST': 'db', 'PORT': 5432, } } 

开始运行

docker-compose up

数据库同步

docker-compose run web python manage.py syncdb

集群部署

敬请期待本文的下一篇

使用docker-compose 大杀器来部署服务 下

参考

Docker Compose—简化复杂应用的利器
docker-compose 安装指南
使用Docker Compose管理多个容器
docker 入门到实践
阿里云上部署和使用Docker Swarm集群
使用Docker Compose部署基于Sentinel的高可用Redis集群

 
 
转自https://www.cnblogs.com/neptunemoon/p/6512121.html#toc_30
相关文章
相关标签/搜索