zoukankan      html  css  js  c++  java
  • 使用docker-compose 大杀器来部署服务 上 (转)

    使用docker-compose 大杀器来部署服务 上
    https://www.cnblogs.com/neptunemoon/p/6512121.html
    我们都听过或者用过 docker,然而使用方式却是仅仅用手动的方式,这样去操作 docker 还是很原始。 好吧,可能在小白的眼中噼里啪啦的对着 term 一顿操作会很拉风,但是高手很不屑!在高手眼里…too young, too low. 因为高手都是自动化的,今天就稍微介绍下自动化工具,也就是大杀器 docker-compose

    使用docker-compose 大杀器来部署服务 上
    先从 docker 说起
    docker 简介
    为什么说 docker 是快速部署
    好了, 我们进化到,快速1.0 时代
    于是, 我们又进化了, 快速2.0时代
    于是,我们再次加入光荣的进化, 快速3.0时代
    docker 安装
    docker 的一些概念
    镜像
    性能损耗
    容器
    hub
    docker 简单使用
    搜索镜像
    下载镜像
    helloworld
    我常用的 docker 命令
    登录
    查看容器
    查找镜像
    下载镜像
    删除镜像
    开始
    看日志
    停止一个容器示例
    查看容器状态
    格式
    更快更好更强
    docker-compose 简介
    docker-compose 是什么
    为什么要用 docker-compose,他解决了什么
    那么哪里可以买到呢?
    从一个小例开始
    先安装吧
    helloworld
    服务更新
    软升级
    硬升级
    从日志得到需要的信息
    直接使用 logs
    使用类似linux tail 命令
    docker-compose 常用命令
    docker-compose 如何配置
    depends_on: 依赖
    image: 镜像
    environment 环境变量
    ports 端口映射
    volumes 文件映射
    docker-compose 需要注意的
    针对需求开始部署了
    设定一个需求
    简单的单机部署
    python 环境搭建
    django 环境搭建
    docker-compose.yml 写作
    django 构建工程
    django 数据库设定
    开始运行
    数据库同步
    集群部署
    使用docker-compose 大杀器来部署服务 下
    参考
    先从 docker 说起
    我知道可能有些看到这篇文章的朋友没有了解或者使用过 docker,那我就在这里做一个小小的介绍,已经有过了解的朋友请直接从docker-compose部分看起.

    docker 简介
    想要理解 docker 是啥,就要先说说 docker 可以解决啥
    一句话来说

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

    为什么说 docker 是快速部署
    我们做一个项目,最不想面对的不是开发,也不是调试,而是部署!!!!
    比如你这个机器上的环境是 python3 你用另一个机器上却是 python2 或者压根就没有 python 环境。

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

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

    好了, 我们进化到,快速1.0 时代
    我们把要安装的东西全都放进离线安装包里面,再写个 bash 脚本
    对,这种事情真的有过。 部署全靠一个 bash 脚本,毕竟不用手动了么。 可是就是苦了写脚本的人,我就写过一个脚本写了好久。

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

    于是,我们再次加入光荣的进化, 快速3.0时代
    我们把服务装进了 docker 中
    我们把做好的镜像,一个命令 pull 了下来,嗯,蛮快又一个命令 docker start XXXXXX 服务起来了。哦,你说多服务?好吧那就写个docker-compose.file吧。 嗯哼? 你说集群部署 来来来, 有Kubernetes、Mesos,Fleet和Swarm 任君挑选,不好用不要钱。

    docker 是部署的最佳辅助,即使你烂成渣渣,docker 也可以扶你上王者。

    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 的动作可以拆分成

    找到一个系统镜像 // docker search
    安装好 vm 或者 virtual box // apt-get install docker
    在 vm 中安装镜像 // docker run -d -it 你的镜像
    略..
    这是最小的动作, 如果你要映射硬盘,设置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 需要注意的
    我根据我自己的体验,给出几点需要注意的

    不要把 docker 当做数据容器来使用,数据一定要用 volumes 放在容器外面
    不要把 docker-compose 文件暴露给别人, 因为上面有你的服务器信息
    多用 docker-compose 的命令去操作, 不要用 docker 手动命令&docker-compose 去同时操作
    写一个脚本类的东西,自动备份docker 映射出来的数据。
    不要把所有服务都放在一个 docker 容器里面
    针对需求开始部署了
    设定一个需求
    我假定现在我们的需求是做一个博客系统

    我们的第一印象肯定是 wordpress, 没有比这个更专业的了, 当然还有很多,我们使用 django 吧

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

    我们拟订一个过程

    python 环境搭建
    django 环境搭建
    docker-compose.yml 写作
    django 构建工程
    django 数据库设定
    开始运行
    数据库同步
    简单的单机部署
    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集群

    转载随意,只要注明出处
    标签: docker, docker-compose, 集群, 部署
    好文要顶 关注我 收藏该文
    neptune破壁人
    关注 - 1
    粉丝 - 12
    +加关注
    12 0
    « 上一篇:gulp快速入门&初体验
    posted @ 2017-03-06 21:38 neptune破壁人 阅读(93482) 评论(7) 编辑 收藏

    评论列表
    回复引用 #1楼 2018-09-07 15:24 lookat23
    写得这么好的文章没有下集不是很可惜,其实我是来催更的 ( ̄▽ ̄)
    支持(0)反对(0)
    回复引用 #2楼 2018-12-29 09:55 HANFAN
    @ lookat23
    引用
    写得这么好的文章没有下集不是很可惜,其实我是来催更的 ( ̄▽ ̄)

    催更+1
    支持(0)反对(0)
    回复引用 #3楼 2019-01-15 11:04 J.M.Guo
    期待博主的下集
    支持(0)反对(0)
    回复引用 #4楼 2019-02-21 14:05 大树的博客
    @ lookat23
    引用
    写得这么好的文章没有下集不是很可惜,其实我是来催更的 ( ̄▽ ̄)

    催更+1024
    支持(0)反对(0)
    回复引用 #5楼 2019-03-08 16:22 brady.wang
    厉害
    支持(0)反对(0)
    回复引用 #6楼 2019-03-13 11:09 豆芽花花儿酱
    非常nice
    支持(0)反对(0)
    回复引用 #7楼 2019-05-09 10:40 kindnull
    绝对好文
    支持(0)反对(0)
    刷新评论刷新页面返回顶部

  • 相关阅读:
    javascript 事件冒泡
    Java 理论与实践: 正确使用 Volatile 变量
    Concurrency,Java 并发
    POJ2379 ACM Rank Table 模拟题
    HDU1711Number Sequence KMP
    POJ1061 青蛙的约会 扩展GCD
    HDU2523 SORT AGAIN HASH
    HDU2087剪花布条 KMP
    HDU3736 Cyclic Nacklace KMP
    HDU1709The Balance 母函数
  • 原文地址:https://www.cnblogs.com/yasepix/p/11166921.html
Copyright © 2011-2022 走看看