Docker Compose 零基礎入門

Docker Compose 是 Docker 官方編排(Orchestration)項目之一,負責快速的部署分佈式應用,它是由 python 編寫。javascript

Compose 定位是定義和運行多個 Docker 容器的應用。java

Compose 有兩個重點node

  • docker-compose.yml compose 配置文件
  • docker-compose 命令行工具

在前面的教程中,咱們運行一個要一堆的參數,如 --network, --volume, -p 等等,若是有多個容器組合成一個項目,好比一個 webserver,數據庫,緩存等等容器,咱們就須要一個個的定義網絡等參數,而後一個個啓動,有了 compose 咱們只須要一個簡單的 docker-compose up ,它就會自動幫咱們構建鏡像,配置網絡等功能。python

安裝

windows 和 mac 中 docker-compose 在安裝 docker 的時候就已經捆綁安裝了。mysql

linux 中須要本身安裝,不過很是的簡單隻須要幾條命令就行linux

$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 下載 docker-compose 到 /usr/local/bin/docker-compose 中
$ sudo chmod +x /usr/local/bin/docker-compose
# 給 docker-compose 執行權限
$ curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
# bash 自動補全
複製代碼
$ sudo rm /usr/local/bin/docker-compose
# 卸載 docker-compose
複製代碼

使用

使用 docker-compose 咱們主要的任務是編寫 docker-compose.yml 文件。咱們能夠看一個 WordPress yaml文件模板。git

version: '3' # 定義版本,不指定默認爲版本 1,新版本功能更多

services: # 容器,就像 docker run
 db: # 名稱,它也是 network 中 DNS 名稱
 image: mysql:5.7 # 鏡像,若是像自定義鏡像能夠不指定這個參數,而用 build
 volumes: # 定義數據卷,相似 -v
 - db_data:/var/lib/mysql
 - .:/aaa # 掛載當前目錄到容器中的 /aaa 無需使用絕對路徑
 restart: always # 相似 --restart
     # 'no' 默認,不自動重啓,覺得 no 是 yaml 關鍵字因此加引號
     # always 老是自動重啓
     # on-failure 當失敗時自動重啓,也就是 exit code 不爲 0 時
     # unless-stopped 除非手動中止,否者一直重啓
 environment: # 定義環境變量,相似 -e
 MYSQL_ROOT_PASSWORD: somewordpress
 MYSQL_DATABASE: wordpress
 MYSQL_USER: wordpress
 MYSQL_PASSWORD: wordpress
 wordpress: # 第二個容器
 labels:
       com.example.description: "This label will appear on all containers for the web service"
     # 爲容器添加 Docker 元數據(metadata)信息。例如能夠爲容器添加輔助說明信息。
 depends_on: # 幫助 compose 理解容器之間的關係
     # db 將會在 wordpress 以前被啓動
     # 關閉時 wordpress 將會在 db 以前關閉
     # 咱們指定只啓動 wordpress,db 也會跟着啓動
 - db
 image: wordpress:latest
 ports: # 端口,相似 -p
 - "8000:80"
 restart: always
 environment:
 WORDPRESS_DB_HOST: db:3306
 WORDPRESS_DB_USER: wordpress
 WORDPRESS_DB_PASSWORD: wordpress

volumes: # 可選,須要建立的數據卷,相似 docker volume create
 db_data:

networks: # 可選,須要建立的網絡,相似 docker network create
複製代碼

若是不瞭解 yaml 文件,可使用在線 yaml 轉換成 jsongithub

簡單 web 應用

咱們如今使用 nodejsredis 寫一個簡單的,web 應用。web

咱們須要 nodejs 環境,而後新建一個文件夾執行redis

$ npm init -y # 新建 package.json 文件
$ npm i -S koa ioredis # 安裝 koa 和 ioredis 依賴
# koa 用來編寫 web 應用
# ioredis 用來鏈接 redis
複製代碼

而後咱們新建 index.js 文件,寫入以下代碼

const Koa = require('koa');
const Redis = require('ioredis');

const app = new Koa();
const redis = new Redis({
  host: 'redis',
});

app.use(async ctx => {
  ctx.body = '計數:' + (~~(await redis.get('count')) + 1);
  redis.incr('count');
});

app.listen(3000, () => {
  console.log('app 正在監聽 3000 端口');
});
複製代碼

而後新建一個 .dockerignore 文件

.vscode
.idea
node_modules
npm-debug.log*
yarn-debug.log*
yarn-error.log*
複製代碼

還有 Dockerfile 文件

FROM node:alpine

WORKDIR /app 
COPY package.json . RUN npm i --registry=https://registry.npm.taobao.org && npm cache --force clean COPY . . 
EXPOSE 3000

CMD ["node", "index.js"] 複製代碼

最後就是編寫 docker-compose.yml 文件啦

version: '3'

services:
 redis:
 image: 'redis'
 app:
 build: . # 至關於 docker build .
 ports:
 - '3000:3000'
 depends_on:
 - redis
複製代碼

咱們上面要構建自定義鏡像使用了 build 字段,若是要自定義 Dockerfile 咱們能夠寫做一個 map。

build:
    context: ./dir # 指定上下文
    dockerfile: Dockerfile.dev # 指定 Dockerfile
    args: # 相似 Dockerfile 中的 ARG 指令。
    # 定義變量,不一樣於環境不按量只能在構建時訪問
        gitcommithash: cdc3b19
    target: prod # docker build 中的 --target 參數
複製代碼

如今咱們就可使用 docker-compose 命令行工具啓動咱們這個應用了。

$ docker-compose up
# 啓動咱們這個項目
# `-d` 相似 docker run -d
# `--build` 在啓動容器以前構建鏡像
# 若是咱們修改了 Dockerfile 從新運行項目時,不會從新構建
# 這時候就須要 --build 命令,或者 `docker-compose build` 命令
複製代碼

而後咱們打開瀏覽器 127.0.0.1:3000 而後不斷刷新,就會看到計數器不斷增長。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                     PORTS                    NAMES
782b26312c72        redis               "docker-entrypoint.s…"      6379/tcp                 compose1_redis_1
af93df76b5a0        compose1_app        "docker-entrypoint.s…"      0.0.0.0:3000->3000/tcp   compose1_app_1
複製代碼

咱們發現 docker-compose 自動生成容器名稱,若是咱們像本身指定容器名,可使用

container_name: my-web-container
複製代碼

docker-compose 還幫咱們生成了本身構建鏡像的鏡像名,咱們若是想自定義,能夠在指定 build 的同時指定 image 字段。

$ docker network ls 
NETWORK ID          NAME                DRIVER              SCOPE
66cccb01394d        compose1_default    bridge              local
複製代碼

咱們發現 docker-compose 自動新建了 compose1_default 虛擬網絡

$ docker network inspect compose1_default
...
"Containers": {
    "1e10e7af6bf78ef1ecdd979c1f5d386e9d5a8221d3be49df05a13cea1f40f655": {
        "Name": "compose1_app_1",
        "EndpointID": "b20772ce05b34fb528b2986946c9535d467c9d09a6d66aeba9fdb9c8809f0909",
        "MacAddress": "02:42:ac:14:00:03",
        "IPv4Address": "172.20.0.3/16",
        "IPv6Address": ""
    },
    "95b1592f453dd57d091456b9e623fae1aadc180599c5b343c7133ef8c61f3605": {
        "Name": "compose1_redis_1",
        "EndpointID": "5a86cdb12a84fd49de4b586bed1281cdec61cd45dc08ad230f46db8562ced722",
        "MacAddress": "02:42:ac:14:00:02",
        "IPv4Address": "172.20.0.2/16",
        "IPv6Address": ""
    }
}
...
複製代碼

而且自動將咱們兩個容器加入到這個網絡中。

$ docker container inspect compose1_redis_1
...
"Networks": {
    "compose1_default": {
        "IPAMConfig": null,
        "Links": null,
        "Aliases": [
            "95b1592f453d",
            "redis"
        ],
        "NetworkID": "66cccb01394da77edbe008d18057b66b819389aaa2e98a967f8096a1bae46ae1",
        "EndpointID": "5a86cdb12a84fd49de4b586bed1281cdec61cd45dc08ad230f46db8562ced722",
        "Gateway": "172.20.0.1",
        "IPAddress": "172.20.0.2",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "MacAddress": "02:42:ac:14:00:02",
        "DriverOpts": null
    }
}
...
複製代碼

能夠看到 compose1_redis_1 容器的 network alias 中包含了 redis,這也是咱們在 docker-compose.yml 中定義的名稱。這也解釋了爲何 index.jsredishost 參數能夠寫作 redis

down

若是咱們啓動項目時加了 -d 參數,那麼咱們想中止項目時可使用 down 命令。

$ docker-compose down
# 它會刪除容器和網絡
# -v 刪除數據卷
# --rmi all 刪除全部 service 鏡像
# --rmi local 刪除沒有自定義標籤的鏡像 image 字段
複製代碼

最後

$ docker-compose --help
# 咱們能夠執行這個命令查看 docker-compose 支持命令
# 能夠發現有不少命令都相似於 docker 命令
複製代碼

更多 docker-compose 知識,能夠查看 docker-compose 文檔

編寫 docker-compose.yml 能夠查看 這裏

Docker 零基礎入門

Docker Swarm 零基礎入門

Kubernetes 零基礎入門

相關文章
相關標籤/搜索