溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么使用docker-compose來部署服務(wù)

發(fā)布時(shí)間:2021-10-12 09:42:38 來源:億速云 閱讀:204 作者:柒染 欄目:云計(jì)算

今天就跟大家聊聊有關(guān)怎么使用docker-compose來部署服務(wù),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

使用docker-compose 大殺器來部署服務(wù) 

先從 docker 說起

我知道可能有些看到這篇文章的朋友沒有了解或者使用過 docker,那我就在這里做一個(gè)小小的介紹,已經(jīng)有過了解的朋友請(qǐng)直接從docker-compose部分看起.

docker 簡介

想要理解 docker 是啥,就要先說說 docker 可以解決啥
一句話來說

docker 是一種容器技術(shù),作用是用來快速部署服務(wù)

為什么說 docker 是快速部署

我們做一個(gè)項(xiàng)目,最不想面對(duì)的不是開發(fā),也不是調(diào)試,而是部署?。。?!
比如你這個(gè)機(jī)器上的環(huán)境是 python3 你用另一個(gè)機(jī)器上卻是 python2 或者壓根就沒有 python 環(huán)境。

好了,這個(gè)時(shí)候你怎么解決呢。 對(duì),只要去新機(jī)器上你就要部署 python。

嗯~ 好吧, 部署 python 就 python,但是你的項(xiàng)目里面還要用到 MySQL,好的沒問題, 你又要去用 pip 去安裝 python 的 mysql 模塊。 哦對(duì)了, 我記我們的項(xiàng)目里面還有 redis, 兩種非對(duì)稱加密,還有三方隊(duì)列, 哦, 還有阿里云的接口,對(duì)對(duì)對(duì)對(duì)對(duì)對(duì)哦。 亂七八糟的東西真的好多,搞完了幾個(gè)小時(shí)沒有了,遇到網(wǎng)絡(luò)卡了,那就更沒有譜了。

好了, 我們進(jìn)化到,快速1.0 時(shí)代

我們把要安裝的東西全都放進(jìn)離線安裝包里面,再寫個(gè) bash 腳本
對(duì),這種事情真的有過。 部署全靠一個(gè) bash 腳本,畢竟不用手動(dòng)了么。 可是就是苦了寫腳本的人,我就寫過一個(gè)腳本寫了好久。

于是, 我們又進(jìn)化了, 快速2.0時(shí)代

我們把整個(gè)系統(tǒng)做成了鏡像,存在了光盤里面,每當(dāng)要架設(shè)的時(shí)候趕快用鏡像做出一個(gè)新的系統(tǒng)!
可能經(jīng)歷過的自然會(huì)懂,還特么要做鏡像啊,離機(jī)房遠(yuǎn)咋辦?。?!我們做游戲,開服快,更新更快!我們版本更新過快怎么辦?。?!我們還要刻刻刻么? 我們的 tornado 又更新了,我去,我們客戶端的 protobuf 也更新了,可是我們有100臺(tái)服務(wù)器啊,為了這一點(diǎn)小小的東西更新么?西八!

于是,我們?cè)俅渭尤牍鈽s的進(jìn)化, 快速3.0時(shí)代

我們把服務(wù)裝進(jìn)了 docker 中
我們把做好的鏡像,一個(gè)命令 pull 了下來,嗯,蠻快又一個(gè)命令 docker start XXXXXX 服務(wù)起來了。哦,你說多服務(wù)?好吧那就寫個(gè)docker-compose.file吧。 嗯哼? 你說集群部署 來來來, 有Kubernetes、Mesos,F(xiàn)leet和Swarm 任君挑選,不好用不要錢。

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

docker 安裝


很簡單 docker官網(wǎng)
怎么使用docker-compose來部署服務(wù)?
Get docker 之后, 有圖型系統(tǒng)(windows 之類)的有下一步,下一步。 有 term 接口的。 有 apt-get 之類的軟件管理。
安裝非常簡單,不值得一說。  

docker 的一些概念

鏡像

對(duì)!就和我上面說的使用光盤拷貝已經(jīng)有的鏡像一樣,我們的鏡像是指一個(gè)系統(tǒng)的鏡像
我們的鏡像都是基于 linux 的準(zhǔn)確來說是基于 ubuntu 的。
docker 鏡像可以理解為,你在 win 下用ghost 拷貝出來的磁盤鏡像。不過他是 linux 版的。

性能損耗

得益于現(xiàn)在的 linux 內(nèi)核的 namespace, 我們可以擁有各種直達(dá)內(nèi)耗的容器可以用,你在 docker 中的進(jìn)程其實(shí)進(jìn)程就是直接的宿主機(jī)進(jìn)程,這一切都在系統(tǒng)啟動(dòng) clone 函數(shù)的時(shí)候就決定了, 所以談不上性能損耗。

容器

容器本身就是我們最重要的概念,我們使用 docker 要做的就是容器這個(gè)東西。

簡單來說容器是一個(gè)鏡像的實(shí)例

更通俗來說容器就像你用 vm 或者 virtualbox 使用鏡像創(chuàng)建的一個(gè)虛擬機(jī)實(shí)例

hub

就是鏡像倉庫。

如果你寫代碼,你肯定就知道 github,我們把代碼托管到 github 之上。
如果我們部署,我肯定就要用 dockerhub, 我們把鏡像托管到 docker hub 上(當(dāng)然我們也可以假設(shè),或者是用別人假設(shè)的hub)
國內(nèi)有很多三方 dockerhub 服務(wù)器, 有阿里云,網(wǎng)易蜂巢,有容云,daocloud 等等等等
至于國外那就更多了,如果非要推薦一家,那就是 amazon 了,畢竟云服務(wù)他們家宇宙最強(qiáng),沒有之一,沒有對(duì)手。

docker 簡單使用

搜索鏡像

docker search xxx
比如我要架設(shè)一個(gè) 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:~#

第一列就是你可以選擇使用的鏡像,你當(dāng)然可以自己制作鏡像,而且很容易,但是如果我們?nèi)腴T的話就直接用別人做好的吧。

下載鏡像

我直接用第一個(gè)吧
git pull wordpress
這個(gè)是在下載鏡像的過程中

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

這句其實(shí)就相當(dāng)于你的鏡像

做到 helloworld 了你就算是入門了。哈哈哈。

推薦一個(gè)寫很有層次感的入門docker入門教程

我常用的 docker 命令

你可以使用幫助看一個(gè)命令的大概

docker   # docker 命令幫助

Commands:
    attach    Attach to a running container                 # 當(dāng)前 shell 下 attach 連接指定運(yùn)行鏡像
    build     Build an image from a Dockerfile              # 通過 Dockerfile 定制鏡像
    commit    Create a new image from a container's changes # 提交當(dāng)前容器為新的鏡像
    cp        Copy files/folders from the containers filesystem to the host path
              # 從容器中拷貝指定文件或者目錄到宿主機(jī)中
    create    Create a new container                        # 創(chuàng)建一個(gè)新的容器,同 run,但不啟動(dòng)容器
    diff      Inspect changes on a container's filesystem   # 查看 docker 容器變化
    events    Get real time events from the server          # 從 docker 服務(wù)獲取容器實(shí)時(shí)事件
    exec      Run a command in an existing container        # 在已存在的容器上運(yùn)行命令
    export    Stream the contents of a container as a tar archive   
              # 導(dǎo)出容器的內(nèi)容流作為一個(gè) tar 歸檔文件[對(duì)應(yīng) import ]
    history   Show the history of an image                  # 展示一個(gè)鏡像形成歷史
    images    List images                                   # 列出系統(tǒng)當(dāng)前鏡像
    import    Create a new filesystem image from the contents of a tarball  
              # 從tar包中的內(nèi)容創(chuàng)建一個(gè)新的文件系統(tǒng)映像[對(duì)應(yīng) export]
    info      Display system-wide information               # 顯示系統(tǒng)相關(guān)信息
    inspect   Return low-level information on a container   # 查看容器詳細(xì)信息
    kill      Kill a running container                      # kill 指定 docker 容器
    load      Load an image from a tar archive              # 從一個(gè) tar 包中加載一個(gè)鏡像[對(duì)應(yīng) save]
    login     Register or Login to the docker registry server   
              # 注冊(cè)或者登陸一個(gè) docker 源服務(wù)器
    logout    Log out from a Docker registry server         # 從當(dāng)前 Docker registry 退出
    logs      Fetch the logs of a container                 # 輸出當(dāng)前容器日志信息
    port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
              # 查看映射端口對(duì)應(yīng)的容器內(nèi)部源端口
    pause     Pause all processes within a container        # 暫停容器
    ps        List containers                               # 列出容器列表
    pull      Pull an image or a repository from the docker registry server
              # 從docker鏡像源服務(wù)器拉取指定鏡像或者庫鏡像
    push      Push an image or a repository to the docker registry server
              # 推送指定鏡像或者庫鏡像至docker源服務(wù)器
    restart   Restart a running container                   # 重啟運(yùn)行的容器
    rm        Remove one or more containers                 # 移除一個(gè)或者多個(gè)容器
    rmi       Remove one or more images                 
              # 移除一個(gè)或多個(gè)鏡像[無容器使用該鏡像才可刪除,否則需刪除相關(guān)容器才可繼續(xù)或 -f 強(qiáng)制刪除]
    run       Run a command in a new container
              # 創(chuàng)建一個(gè)新的容器并運(yùn)行一個(gè)命令
    save      Save an image to a tar archive                # 保存一個(gè)鏡像為一個(gè) tar 包[對(duì)應(yīng) load]
    search    Search for an image on the Docker Hub         # 在 docker hub 中搜索鏡像
    start     Start a stopped containers                    # 啟動(dòng)容器
    stop      Stop a running containers                     # 停止容器
    tag       Tag an image into a repository                # 給源中鏡像打標(biāo)簽
    top       Lookup the running processes of a container   # 查看容器中運(yùn)行的進(jìn)程信息
    unpause   Unpause a paused container                    # 取消暫停容器
    version   Show the docker version information           # 查看 docker 版本號(hào)
    wait      Block until a container stops, then print its exit code   
              # 截取容器停止時(shí)的退出狀態(tài)值
Run 'docker COMMAND --help' for more information on a command.
登錄

登錄你自己的 dockerhub 賬戶,要去注冊(cè)哦
來docker hub注冊(cè)啊
docker login

查看容器

查看你已經(jīng)下載好的鏡像
docker images

查找鏡像

docker search XX

下載鏡像

docker pull xx

刪除鏡像

docker rmi xx

開始

docker run 你的鏡像

看日志

docker logs 你的容器

停止一個(gè)容器示例

docker stop 你的容器

查看容器狀態(tài)

docker stats 你的容器

格式

基本上都是這個(gè)格式 ,根據(jù)上面寫好的注釋,很容易去使用

更快更好更強(qiáng)

  • 使用 dockerfile

  • 使用 crontab

  • 使用 supervisr

略, 這個(gè)要扯起來就太長了

docker-compose 簡介


一句話  
 docker-compose 是用來做docker 的多容器控制      

docker-compose 是什么

docker-compose 是一個(gè)用來把 docker 自動(dòng)化的東西。
有了 docker-compose 你可以把所有繁復(fù)的 docker 操作全都一條命令,自動(dòng)化的完成。

為什么要用 docker-compose,他解決了什么

用通俗的語言來說,我們平時(shí)操作 docker 還是很原始的一系列動(dòng)作,你手動(dòng)使用 docker 的動(dòng)作可以拆分成

  1. 找到一個(gè)系統(tǒng)鏡像 // docker search

  2. 安裝好 vm 或者 virtual box // apt-get install docker

  3. 在 vm 中安裝鏡像 // docker run -d -it 你的鏡像

  4. 略..

這是最小的動(dòng)作, 如果你要映射硬盤,設(shè)置nat網(wǎng)絡(luò)或者橋接網(wǎng)絡(luò),等等…你就要做更多的 docker 操作, 這顯然是非常沒有效率的。

但是我們寫在 docker-compose.file 里面就很好了。 你只需要寫好后 只運(yùn)行一句
docker-compose up -d
一切都是那么的簡單

那么哪里可以買到呢?

你要你能上網(wǎng),到處都可以得到他。
我自己的機(jī)器上有 python&pip 的環(huán)境,所以我的安裝非常簡單


先確定你是不是安裝了 docker  
沒有安裝請(qǐng)看   上面的文章

我的環(huán)境是
linux-ubuntu:python2:pip
所以我的安裝
pip install docker-compose
如此簡單

從一個(gè)小例開始

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

先安裝吧

如果你和我的環(huán)境相同,請(qǐng)直接看我的 docker-compose 安裝

如果是別的話,別擔(dān)心,這里有
安裝指南

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

服務(wù)更新

軟升級(jí)
$ docker-compose stop wordpress
停止容器運(yùn)行

$ docker-compose rm wordpress
刪除老舊的容器
更新你的 image

$ docker-compose start wordpress
啟動(dòng)新容器

還比如

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

docker-compose restart nginx

硬升級(jí)

docker-compose stop

升級(jí)你的程序

你要重新
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 構(gòu)建或重建服務(wù)
help 命令幫助
kill 殺掉容器
logs 顯示容器的輸出內(nèi)容
port 打印綁定的開放端口
ps 顯示容器
pull 拉取服務(wù)鏡像
restart 重啟服務(wù)
rm 刪除停止的容器
run 運(yùn)行一個(gè)一次性命令
scale 設(shè)置服務(wù)的容器數(shù)目
start 開啟服務(wù)
stop 停止服務(wù)
up 創(chuàng)建并啟動(dòng)容器

docker-compose 如何配置

先看看我自己寫的一個(gè) 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    #這個(gè)賬戶你是自己設(shè)定的
                - WORDPRESS_PASSWORD=123123         #這個(gè)密碼是你自己設(shè)定的
            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 是要啟動(dòng)的三個(gè)服務(wù)

順序不是重要的,我們看見wordpress中有個(gè) depends_on: 的屬性

depends_on: 依賴

代表wordpress 依賴于

- mariadb
- nginx

兩個(gè)服務(wù), 所以他們兩個(gè)會(huì)先啟動(dòng)

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 ,而是一個(gè) build, 那個(gè)說明這個(gè)不是用鏡像的,而是使用 dockerfile 去構(gòu)建容器。
如果要說 dockerfile 又要花很久了

想了解 dockerfile 可以看這里
編寫Dockerfile

environment 環(huán)境變量

這個(gè)是在好理解不過的了。
不過這和我們程序語言設(shè)計(jì)層面的還是不一樣的,這個(gè)是容器層面的環(huán)境變量。
如果我們寫程序做一些邏輯判斷的時(shí)候,肯定會(huì)使用
比如我們判斷現(xiàn)在的編譯器,我們會(huì)使用
#if __GNUC__ 或者 #if _MSC_VER
相應(yīng)的,我們的容器里面肯定也有這樣的邏輯,我們經(jīng)常使用環(huán)境變量來傳值,或者定義一個(gè)行為。寫過程序的人都懂。

ports 端口映射

映射本機(jī)還有鏡像的端口。這個(gè)沒有什么好說的。

volumes 文件映射

有兩種格式,
可以對(duì)應(yīng) docker 操作中的 -v my/path/:/docker/path
還可以使用單方面的 -v /path
這樣的話 就相當(dāng)于 一個(gè)匿名映射, 其實(shí)還是在本機(jī)有對(duì)應(yīng)目錄的。

使用docker inspect -f {{.Volumes}} /path 可以看到詳細(xì)信息

相對(duì)這個(gè)了解更多的 深入理解Docker Volume

docker-compose 需要注意的

我根據(jù)我自己的體驗(yàn),給出幾點(diǎn)需要注意的

  1. 不要把 docker 當(dāng)做數(shù)據(jù)容器來使用,數(shù)據(jù)一定要用 volumes 放在容器外面

  2. 不要把 docker-compose 文件暴露給別人, 因?yàn)樯厦嬗心愕姆?wù)器信息

  3. 多用 docker-compose 的命令去操作, 不要用 docker 手動(dòng)命令&docker-compose 去同時(shí)操作

  4. 寫一個(gè)腳本類的東西,自動(dòng)備份docker 映射出來的數(shù)據(jù)。

  5. 不要把所有服務(wù)都放在一個(gè) docker 容器里面

針對(duì)需求開始部署了

設(shè)定一個(gè)需求

我假定現(xiàn)在我們的需求是做一個(gè)博客系統(tǒng)

我們的第一印象肯定是 wordpress, 沒有比這個(gè)更專業(yè)的了, 當(dāng)然還有很多,我們使用 django 吧

用過 django 的肯定會(huì)知道, django 一開始是要構(gòu)造工程的。
還有數(shù)據(jù)之類的

我們擬訂一個(gè)過程

  1. python 環(huán)境搭建

  2. django 環(huán)境搭建

  3. docker-compose.yml 寫作

  4. django 構(gòu)建工程

  5. django 數(shù)據(jù)庫設(shè)定

  6. 開始運(yùn)行

  7. 數(shù)據(jù)庫同步

簡單的單機(jī)部署

python 環(huán)境搭建

Dockerfile

ENV PYTHONUNBUFFERED 1
RUN mkdir /root/testdjango/code    #都寫上絕對(duì)路徑, 注意不要跟我一樣。
WORKDIR /root/testdjango/code
ADD requirements.txt /root/testdjango/code/
RUN pip install -r requirements.txt
ADD . /root/testdjango/code/

python 的pip 有一個(gè)requirements.txt 文件來專門放依賴環(huán)境的

django 環(huán)境搭建

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 構(gòu)建工程

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

django 數(shù)據(jù)庫設(shè)定

我們做了 volumes, django 的東西在本地有映射。
做過 django 的人都知道 ,我們的設(shè)定都在 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#

我們只設(shè)置 數(shù)據(jù)庫

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
開始運(yùn)行

docker-compose up

數(shù)據(jù)庫同步

docker-compose run web python manage.py syncdb

看完上述內(nèi)容,你們對(duì)怎么使用docker-compose來部署服務(wù)有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI