Docker compose的使用

暗香殘留發表於2019-08-03

前言

Docker Compose Docker 容器進行編排的工具,定義和執行多容器的應用,可以一條命令啟動多個容器。

使用Compose 基本上分為三步:

  1. Dockerfile 定義應用的執行環境
  2. docker-compose.yml 定義組成應用的各服務
  3. docker-compose up 啟動整個應用

       

    2. 安裝Compose

    直接從github下載即可,前提要先安裝Docker,版本要1.9.1以上

    Note that Compose 1.8.0 requires Docker Engine 1.10.0 or later for version 2 of the Compose File format, and Docker Engine 1.9.1 or later for version 1.

    # curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    								

    # chmod +x /usr/local/bin/docker-compose
    

    也可以用pip或官網的run.sh指令碼安裝

       

    安裝後確認

    # docker-compose --version
    

       

    使用Docker Compose管理多個容器

    Docker Compose是一個用來定義和執行復雜應用的Docker工具。使用Compose,你可以在一個檔案中定義一個多容器應用,然後使用一條命令來啟動你的應用,完成一切準備工作。
    - github.com/docker/compose

    一個使用Docker容器的應用,通常由多個容器組成。使用Docker Compose,不再需要使用shell指令碼來啟動容器。在配置檔案中,所有的容器通過services來定義,然後使用docker-compose指令碼來啟動,停止和重啟應用,和應用中的服務以及所有依賴服務的容器。完整的命令列表如下:

    build 構建或重建服務
    help 命令幫助
    kill 殺掉容器
    logs 顯示容器的輸出內容
    port 列印繫結的開放埠
    ps 顯示容器
    pull 拉取服務映象
    restart 重啟服務
    rm 刪除停止的容器
    run 執行一個一次性命令
    scale 設定服務的容器數目
    start 開啟服務
    stop 停止服務
    up 建立並啟動容器

    參考 https://docs.docker.com/compose/install/ 。你能執行Compose在OSX和64位Linux。當前不支援Windows作業系統。

    8.2. 配置檔案

    1.Compose的配置檔案是docker-compose.yml。讓我們看看下面這個檔案:

    mysqldb:

    image: [classroom.example.com:5000/]mysql

    environment:

    MYSQL_DATABASE: sample

    MYSQL_USER: mysql

    MYSQL_PASSWORD: mysql

    MYSQL_ROOT_PASSWORD: supersecret

    mywildfly:

    image: [classroom.example.com:5000|arungupta]/wildfly-mysql-javaee7

    links:

    - mysqldb:db

    ports:

    - 8080


    這個檔案在 https://raw.githubusercontent. ... dees/ ,它表明:
    a. 定義了兩個服務分別叫做
    mysqldbmywildfy
    b. 使用
    image定義每個服務的映象名
    c. MySQL容器的環境變數定義在
    environment
    d. MySQL容器使用
    links和WildFly容器連結
    e. 使用
    ports實現埠轉發

    8.3. 啟動服務

    1.如果你從網際網路執行,將docker-compose-internet.yml儲存為docker-compose.yml

    2.如果你使用教師給的映象,將
    docker-compose-instructor.yml儲存為docker-compose.yml

    3.使用下面的命令,所有的服務將使用後臺模式被啟動

    docker-compose up -d


    顯示的輸出如下:
    Creating attendees_mysqldb_1... Creating attendees_mywildfly_1...
    使用
    -f指定代替的compose檔案。
    使用
    -p指定代替compose檔案所在的目錄。

    4.驗證啟動的服務

    docker-compose ps

        Name                       Command               State                Ports

    attendees_mysqldb_1     /entrypoint.sh mysqld            Up      3306/tcp

    attendees_mywildfly_1   /opt/jboss/wildfly/customi ...   Up      0.0.0.0:32773->8080/tcp


    這裡提供了一個整合的列表顯示所有啟動的服務和容器。

    同時,通常使用
    docker ps命令來驗證應用的容器,和在Docker主機上執行的其他容器。

    docker ps

    CONTAINER ID        IMAGE                                    COMMAND                CREATED             STATUS              PORTS                              NAMES

    3598e545bd2f        arungupta/wildfly-mysql-javaee7:latest   "/opt/jboss/wildfly/   59 seconds ago      Up 58 seconds       0.0.0.0:32773->8080/tcp         attendees_mywildfly_1

    b8cf6a3d518b        mysql:latest                             "/entrypoint.sh mysq   2 minutes ago       Up 2 minutes        3306/tcp                        attendees_mysqldb_1



    5.查詢服務日誌

    taching to attendees_mywildfly_1, attendees_mysqldb_1

    mywildfly_1 | => Starting WildFly server

    mywildfly_1 | => Waiting for the server to boot

    mywildfly_1 | ===========================================================

    mywildfly_1 |

    mywildfly_1 |   JBoss Bootstrap Environment

    mywildfly_1 |

    mywildfly_1 |   JBOSS_HOME: /opt/jboss/wildfly

    mywildfly_1 |

    mywildfly_1 |   JAVA: /usr/lib/jvm/java/bin/java

    mywildfly_1 |

    mywildfly_1 |   JAVA_OPTS:  -server -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true

    mywildfly_1 |

    . . .

    mywildfly_1 | 15:40:20,866 INFO  [org.jboss.resteasy.spi.ResteasyDeployment] (MSC service thread 1-2) Deploying javax.ws.rs.core.Application: class org.javaee7.samples.employees.MyApplication

    mywildfly_1 | 15:40:20,914 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-2) JBAS017534: Registered web context: /employees

    mywildfly_1 | 15:40:21,032 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 28) JBAS018559: Deployed "employees.war" (runtime-name : "employees.war")

    mywildfly_1 | 15:40:21,077 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://127.0.0.1:9990/management

    mywildfly_1 | 15:40:21,077 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://127.0.0.1:9990

    mywildfly_1 | 15:40:21,077 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.2.0.Final "Tweek" started in 9572ms - Started 280 of 334 services (92 services are lazy, passive or on-demand)

    mysqldb_1   | Running mysql_install_db

    mysqldb_1   | 2015-06-05 15:38:31 0 [Note] /usr/sbin/mysqld (mysqld 5.6.25) starting as process 27 ...

    mysqldb_1   | 2015-06-05 15:38:31 27 [Note] InnoDB: Using atomics to ref count buffer pool pages

    . . .

    mysqldb_1   | 2015-06-05 15:38:40 1 [Note] Event Scheduler: Loaded 0 events

    mysqldb_1   | 2015-06-05 15:38:40 1 [Note] mysqld: ready for connections.

    mysqldb_1   | Version: '5.6.25'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

    mysqldb_1   | 2015-06-05 15:40:18 1 [Warning] IP address '172.17.0.24' could not be resolved: Name or service not known

     

    8.4. 驗證應用

    1.通過 http://dockerhost:32773/employ ... yees/ 訪問應用。在瀏覽器裡顯示如下:

    使用docker-compose ps命令顯示埠

    8.5. 擴充套件服務

    你能像這樣擴充套件服務:

    docker-compose scale mywildfly=4

    Creating and starting 2... done

    Creating and starting 3... done

    Creating and starting 4... done


    檢查日誌:

    docker-compose logs


    檢查執行的例項:

    docker-compose ps

     

    Name Command State Ports

    rafael_mysqldb_1 /entrypoint.sh mysqld Up 3306/tcp
    rafael_mywildfly_1 /opt/jboss/wildfly/customi ... Up 0.0.0.0:32773->8080/tcp
    rafael_mywildfly_2 /opt/jboss/wildfly/customi ... Up 0.0.0.0:32777->8080/tcp
    rafael_mywildfly_3 /opt/jboss/wildfly/customi ... Up 0.0.0.0:32780->8080/tcp
    rafael_mywildfly_4 /opt/jboss/wildfly/customi ... Up 0.0.0.0:32781->8080/tcp

    你也能減少執行的例項數目:

    docker-compose scale mywildfly=2

    Stopping rafael_mywildfly_3... done

    Stopping rafael_mywildfly_4... done

    Removing rafael_mywildfly_3... done

    Removing rafael_mywildfly_4... done

     

    8.6. 停止服務

    停止服務:

    docker-compose stop

    Stopping attendees_mywildfly_1...

    Stopping attendees_mywildfly_2...

    Stopping attendees_mysqldb_1...

     

    警告:再次停止和啟動將會得到如下錯誤:

    wildfly_1 |

    wildfly_1 | 09:11:07,802 ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 4) JBAS014613: Operation ("add") failed - address: ([

    wildfly_1 |     ("subsystem" => "datasources"),

    wildfly_1 |     ("jdbc-driver" => "mysql")

    wildfly_1 | ]) - failure description: "JBAS014803: Duplicate resource [

    wildfly_1 |     (\"subsystem\" => \"datasources\"),

    wildfly_1 |     (\"jdbc-driver\" => \"mysql\")

    wildfly_1 | ]"

     


    這是因為JDBC資源在每個執行的容器中建立,在實際情況下,這是已經寫在配置中的。

    原文連結:Multiple Containers Using Docker Compose

    3. 使用Compose

    3.1 建立一個Python應用, 使用Flask,將數值記入Redis

    3.1.1 建立一個應用的目錄,建立Python檔案

    # mkdir python
    

    # cd python
    

     

    # vi app.py 
    

    from flask import Flask
    

    from redis import Redis
    

     

    app = Flask(__name__)
    

    redis = Redis(host='redis', port=6379)
    

     

    @app.route('/')
    

    def hello():
    

        redis.incr('hits')
    

    
    							return
    									'Hello World! I have been seen %s times.' % redis.get('hits')
    

     

    if __name__ == "__main__":
    

        app.run(host="0.0.0.0", debug=True)
    

     

    # vi requirements.txt 
    

    flask
    

    redis
    

       

    3.1.2 建立 Dockerfile

    在同一目錄下,建立Dockerfile

    # vi Dockerfile 
    

    FROM python:2.7
    								

    ADD . /code
    

    WORKDIR /code
    

    RUN pip install -r requirements.txt
    

    CMD python app.py
    

    對上面的Dockerfile做一下簡單說明:

  • 容器使用Python 2.7的映象
  • 將當前目錄下檔案拷貝到容器內/code
  • 指定工作目錄為/code
  • 安裝python需要的庫:flask, redis
  • 容器執行命令 python app.py

   

3.1.3 建立編排指令碼

在同一目錄下,建立 docker-compose.yml

# cat docker-compose.yml 

version: '2'
						

services:

  web:

    build: .

    ports:

     - "5000:5000"
						

    volumes:

     - .:/code

    depends_on:

     - redis

  redis:

    image: redis

對上面的編排指令碼做一下簡單說明:

  • 這個應用定義了兩個服務:web, redis
  • web容器通過當前路徑下的Dockerfile生成
  • web容器內的5000埠對映到主機的5000
  • 將當前目錄掛載到web容器內/code
  • web容器依賴於redis容器
  • redis容器從Docker Hub獲取映象

   

3.1.4 啟動應用

會執行編排指令碼,分別製作和抓取webredis映象,啟動容器

# docker-compose up

   

3.1.5 訪問應用

http://localhost:5000/

   

3.2 其他命令

3.2.1 daemon模式啟動/停止

# docker-compose up -d

# docker-compose stop

   

3.2.2 檢視資訊

# docker-compose ps

   

3.2.3 對容器執行命令(一次)

#docker-compose run services
							cmd
								

例如:檢視web容器環境變數

# docker-compose run web env

   

3.3 建立一個Wordpress應用

3.3.1 建立一個應用的目錄

# mkdir wordpress

# cd wordpress

   

3.3.2 建立 docker-compose.yml

# cat docker-compose.yml 

version: '2'
						

services:

  db:

    image: mysql:5.7
						

    volumes:

      - "./.data/db:/var/lib/mysql"
						

    restart: always

    environment:

      MYSQL_ROOT_PASSWORD: wordpress

      MYSQL_DATABASE: wordpress

      MYSQL_USER: wordpress

      MYSQL_PASSWORD: wordpress

 

  wordpress:

    depends_on:

      - db

    image: wordpress:latest

    links:

      - db

    ports:

      - "8000:80"
						

    restart: always

    environment:

      WORDPRESS_DB_HOST: db:3306
						

      WORDPRESS_DB_PASSWORD: wordpress

MySQL的資料目錄掛載到當前目錄下,./.data/db不存在時會自動建立。

   

3.3.3 啟動應用

# docker-compose up -d

   

3.3.4 確認

# docker-compose ps

   

3.3.5 訪問應用

http://localhost:8000/

   

初始化設定後,就可以看到Wordpress的頁面

   

專注伺服器運維十年,歡迎技術上的交流。微信:ee900222 QQ176539

相關文章