docker-compose docker啟動工具,容器互聯


簡介:

docker可以一條命令就運行一個配置好的服務器,很是方便。

但是也有一個問題就是,當參數比較多,映射目錄比較多,映射端口比較多…………

我以前就是寫個腳本,用腳本來啟動,很low啊。

也見到一些docker鏡像的介紹頁有介紹docker-compose,但是因為一直都是小型的應用,也就沒認真看這個東西,今天就深入學習一下吧。

Docker Compose是一個用來定義和運行復雜應用的Docker工具

里面的數據結構比我幾行腳本清晰的多。而且可以同時啟動多個容器,並且是根據依賴關系來先后啟動。

比如先啟動數據庫,再啟動博客。

官方說明https://docs.docker.com/compose/

我學習的版本可能沒有官方版本新,看不明白,或有更高級需求的,可以去看官方說明。

一:安裝

和安裝docker差不多。

安裝docker是  dnf install docker

安裝docker-compose是 dnf install docker-compose

dnf 是我使用的fedora的包管理工具,根據你的linux版本不同,可能不一樣。

在使用CentOS時發現包管理里面沒有這個包。

可以用docker官方推薦的方法來安裝。

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

二:無腦試用

 創建docker-compose.yml文件

version: '2'
services:
    ssh:
            image: jackadam/alpine_with_ssh
            ports:
            - "2222:22"

然后在同目錄下執行  docker-compose up -d

這樣就啟動了一個開放2222端口的apache。

關閉的時候在這里執行  docker-compose down

三:docker-compose命令

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name (default: directory name)
  --verbose                   Show more output
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the name specified
                              in the client certificate (for example if your docker host
                              is an IP address)
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)

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
  images             List images
  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.yml

簡介:

這個就是配置容器啟動的參數的。

先看一下官方給的示例:

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

這還是非常方便的,先啟動db,然后啟動wordpress。

下面逐步解釋如何編寫docker-compose.yml

1.基本結構

一個docker-compose.yml包含三大部分:

version  services  容器

上面示例中,db 和 wordpress 就是兩個容器。

相關內容的第一行,就是容器的名字了。

2.image

在 services 標簽下的第二級標簽是 web,這個名字是用戶自己自定義,它就是服務名稱。
image 則是指定服務的鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。
例如下面這些格式都是可以的:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: a4bc65fd

3.bulid

大家也經常使用Dockerfile來自己生成鏡像。docker-compose自然也是支持的。

不寫image,改為寫buile,則是根據dockerfile來生成鏡像。

示例代碼如下:

    build:
      context: ../ 
      dockerfile: path/of/Dockerfile

我暫時只用到了

build: .  

類似於 docker build .

4.context(配合build)

context 選項可以是 Dockerfile 的文件路徑,也可以是到鏈接到 git 倉庫的url,當提供的值是相對路徑時,它被解析為相對於撰寫文件的路徑,此目錄也是發送到 Docker 守護進程的 context

5.dockerfile(配合build)

使用此 dockerfile 文件來構建,必須指定構建路徑

    build:
      context: .
      dockerfile: Dockerfile-alternate

6.args(配合build)

添加構建參數,這些參數是僅在構建過程中可訪問的環境變量
首先, 在Dockerfile中指定參數:

ARG fendo
ARG password
 
RUN echo "Build number: $fendo"
RUN script-requiring-password.sh "$password"

然后指定 build 下的參數,可以傳遞映射或列表

    build:
      context: .
      args:
        fendo: 1
        password: fendo

        - fendo=1
       - password=fendo

 指定構建參數時可以省略該值,在這種情況下,構建時的值默認構成運行環境中的值(還沒理解)

    args:
      - fendo
      - password

YAML布爾值(truefalseyesnoonoff)必須用引號括起來,這樣分析器會將它們解釋為字符串。

7.container_name

Compose 的容器名稱格式是:<項目名稱><服務名稱><序號>

雖然可以自定義項目名稱、服務名稱,但是如果你想完全控制容器的命名,可以使用這個標簽指定:

container_name: app

 

8.depends_on

在沒啟動數據庫容器的時候啟動了應用容器,這時候應用容器會因為找不到數據庫而退出,為了避免這種情況我們需要加入一個標簽,就是 depends_on,這個標簽解決了容器的依賴、啟動先后的問題。

例如下面容器會先啟動 redis 和 db 兩個服務,最后才啟動 web 服務:

    version: '3'
    services:
      web:
        build: .
        depends_on:
          - db
          - redis
      redis:
        image: redis
      db:
        image: postgres

 

9.ports

端口映射映射主機端口到容器端口

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"
 - "6060:6060/udp"
 - "12400-12500:1240"

 

 

10.expose

開放這個服務(容器)的端口

expose:
 - "3000"
 - "8000"

11.links

較為傳統的link,連接本compose文件中的其他容器

web:
  links:
   - "db"
   - "db:database"
   - "redis"

12.external_links

擴展連接link,連接非本compose文件的其他容器,就像docker的--link,用來連接公共服務容器,比如說數據庫。

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

 13.networks

由於--link一直說要被淘汰,建議使用network方式配置,類似於docker run --net模式

這個是網絡的主配置。

services:
  some-service:
    networks:
     - some-network
     - other-network
networks:
some-network:
other-network:

注意:

在networks中聲明的網絡名稱,會自從生成為  Folder_some-network      Folder_other-network,即在你設定的網絡名稱前面加上當前文件夾名,如果想有互相連通的compose,就把yaml放一個文件夾吧,然后使用docker-compose - ***.yaml [command]

如:

 

14.ALIASES

別名,網絡中的別名,可以理解為計算機名。可以同時又多個別名。

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

下面示例展示了3個容器,使用兩個網絡進行互聯的配置。

version: '2'

services:
  web:
    build: ./web
    networks:
      - new

  worker:
    build: ./worker
    networks:
      - legacy

  db:
    image: mysql
    networks:
      new:
        aliases:
          - database
      legacy:
        aliases:
          - mysql

networks:
  new:
  legacy:

15.environment

環境變量也就是docker run -e

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:963852741

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET:963852741

16.volumes

卷映射,目錄映射,可以:ro 設置為只讀

 

volumes:
  # 僅創建目錄到宿主機
  - /var/lib/mysql

  # 創建真實路徑到映射
  - /opt/data:/var/lib/mysql

  # 從compose文件創建相對目錄的映射
  - ./cache:/tmp/cache

  # 在linux用戶目錄創建映射
  - ~/configs:/etc/configs/:ro

  # 在目錄空間中創建
  - datavolume:/var/lib/mysql

 

 17.restart

restart 選項,有下面幾種

restart: "no"  #從不
restart: always  #總是
restart: on-failure  #失敗時
restart: unless-stopped #除非停止

 

18.privileged

privileged選項

privileged: true

 

 

19.deploy

v3版本新加的參數,部署參數。有什么CPU限制,內存限制………………

因為deploy在使用的時候,有一些限制,但你的compose文件中出現如下配置項時,deploy就無法使用:

    build
    cgroup_parent
    container_name
    devices
    tmpfs
    external_links
    links
    network_mode
    restart
    security_opt
    stop_signal
    sysctls
    userns_mode

20:logging

logging可以設置關於日志的東西。

logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123"

我用到的也就設置日志大小而已。

logging: options: max-size: "200k" 
  max-file: "10"

 

 

官方文檔才是最新最全的。

https://docs.docker.com/compose/compose-file/

 

五:實例

1.mariadb

 mariadb.yaml

version: "3" #版本3
services: #服務
  mysql:   #服務名mysql
    image: mariadb   #鏡像名稱
    privileged: true  #高級權限
    tty: true         #開一個終端
    container_name: mysql  #自定義容器名
    networks:       #網絡
    - mynet         #屬於網絡mynet
    ports:          #開放端口映射3306-->3306
    - 3306:3306     #冒號左邊是宿主機開放端口,冒號右邊是容器開放端口
    environment:    #啟動變量
      MYSQL_ROOT_PASSWORD:123456    #mysql的root密碼
    volumes:        #目錄映射
    - /storage/mariadb:/var/lib/mysql   #映射mariadb的數據庫文件存儲路徑,冒號左邊是宿主機路徑,冒號右邊是容器內路徑
networks:  #關於網絡的服務
  mynet:   #聲明網絡mynet

 

2.wordpress

wordpress.yaml

version: "3"   #版本3
services:      #服務
  wordpress:  #服務名wordpress
    image: wordpress #鏡像名稱
    privileged: true #高級權限
    tty: true    #開一個終端
    container_name: wordpress   #自定義容器名
    networks:  #網絡
    - mynet    #屬於網絡mynet
    ports:     #開放端口映射80-->80
    - 80:80    ##冒號左邊是宿主機開放端口,冒號右邊是容器開放端口
    environment:  #啟動變量mysql的root密碼
      WORDPRESS_DB_HOST: mysql   #數據庫服務器地址,直接用了另一個容器的容器名
      WORDPRESS_DB_NAME: wordpress   #數據庫的庫名
      WORDPRESS_DB_USER: wordpress   #數據庫的用戶名
      WORDPRESS_DB_PASSWORD: wordpress  #數據庫的密碼
    volumes:    #目錄映射
    - /storage/wordpress:/var/www/html/wp-content   #映射wordpress存儲路徑(插件,主題,語言包,上傳文件),冒號左邊是宿主機路徑,冒號右邊是容器內路徑
networks:  #關於網絡的服務
  mynet:   #聲明網絡mynet

 

3.使用方法

docker-compose -f mariadb.yaml up -d

#后台啟動mariadb容器

#使用任意管理工具,連接3306端口,創建給wordpress用的數據庫,庫名:wordpress,用戶名wordpress,密碼wordpress,%(任意)主機登錄

docker-compose - wordpress.yaml up -d

#后台啟動wordpress容器。

由網絡mynet來進行兩個容器的自動聯通。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM