Docker compose的使用
前言
Docker Compose 是 Docker 容器進行編排的工具,定義和執行多容器的應用,可以一條命令啟動多個容器。
使用Compose 基本上分為三步:
- Dockerfile 定義應用的執行環境
- docker-compose.yml 定義組成應用的各服務
- 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. 定義了兩個服務分別叫做mysqldb和mywildfy
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 啟動應用
會執行編排指令碼,分別製作和抓取web,redis映象,啟動容器
# docker-compose up
3.1.5 訪問應用
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 訪問應用
初始化設定後,就可以看到Wordpress的頁面
專注伺服器運維十年,歡迎技術上的交流。微信:ee900222 QQ:176539
相關文章
- 如何使用RubyMine中的Docker / Docker Compose?Docker
- docker-compose 使用例項Docker
- 使用 makefile 管理 docker-composeDocker
- 使用Docker安裝Odoo 17(非Docker Compose)DockerOdoo
- 使用 Docker Compose 管理多個容器Docker
- 7、docker-compose安裝使用Docker
- 使用docker-compose管理freeswitch容器Docker
- 關於docker-Compose基本使用Docker
- 使用啄木鳥CI部署Docker/ComposeDocker
- docker composeDocker
- Docker 和 Docker ComposeDocker
- Linux 下的 Docker 安裝與使用 Docker-compose 安裝LinuxDocker
- 使用 docker-compose 部署 golang 的 Athens 私有代理DockerGolang
- 開始使用DOCKER COMPOSE V2Docker
- Docker:Docker Compose 詳解Docker
- Devops實戰(一)Docker的部署安裝以及Docker-Compose的使用devDocker
- docker compose 用法Docker
- Docker Compose fileDocker
- Docker Compose 案例Docker
- docker compose 指令Docker
- docker和docker compose安裝使用、入門進階案例Docker
- Docker-compose networks 的例子Docker
- 使用 docker-compose 搭建 Laravel 環境 (三)DockerLaravel
- 使用docker-compose構建elasticsearch叢集DockerElasticsearch
- 自用 docker-composeDocker
- Docker學習—ComposeDocker
- Docker Compose簡介Docker
- docker-compose教程Docker
- Docker Compose 安裝Docker
- Docker Compose部署GitLabDockerGitlab
- docker compose 語法Docker
- Deepin20普通使用者安裝docker、docker-composeDocker
- docker使用經驗總結(三、Docker compose基礎應用)Docker
- Docker極簡入門:使用Docker-Compose 搭建redis叢集DockerRedis
- Docker 容器編排利器 Docker ComposeDocker
- docker-compose vs docker-stackDocker
- 使用 Docker Compose 快速啟動 RabbitMQ 伺服器DockerMQ伺服器
- Ubuntu 中Docker Compose的異巧UbuntuDocker