Docker(九)Docker Compose
Compose是Docker的服務編排工具,主要用來構建基於Docker的複雜應用,Compose 通過一個配置檔案來管理多個Docker容器,非常適合組合使用多個容器進行開發的場景。
安裝Docker compose
pip安裝: pip install docker-compose 從github安裝: curl -L --fail https://github.com/docker/compose/releases/download/1.17.0/run.sh -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
解除安裝:
rm /usr/local/bin/docker-compose # 使用curl安裝的
pip uninstall docker-compose # 使用pip解除安裝
基本使用
#檢視幫助 docker-compose -h # -f 指定使用的 Compose 模板檔案,預設為 docker-compose.yml,可以多次指定。 docker-compose -f docker-compose.yml up -d #啟動所有容器,-d 將會在後臺啟動並執行所有的容器 docker-compose up -d #停用移除所有容器以及網路相關 docker-compose down #檢視服務容器的輸出 docker-compose logs #列出專案中目前的所有容器 docker-compose ps #構建(重新構建)專案中的服務容器。服務容器一旦構建後,將會帶上一個標記名,例如對於 web 專案中的一個 db 容器,可能是 web_db。可以隨時在專案目錄下執行 docker-compose build 來重新構建服務 docker-compose build #拉取服務依賴的映象 docker-compose pull #重啟專案中的服務 docker-compose restart #刪除所有(停止狀態的)服務容器。推薦先執行 docker-compose stop 命令來停止容器。 docker-compose rm #在指定服務上執行一個命令。 docker-compose run ubuntu ping docker.com #設定指定服務執行的容器個數。通過 service=num 的引數來設定數量 docker-compose scale web=3 db=2 #啟動已經存在的服務容器。 docker-compose start #停止已經處於執行狀態的容器,但不刪除它。通過 docker-compose start 可以再次啟動這些容器。 docker-compose stop
快速入門
通過搭建一個WordPress來熟悉compose的使用
https://hub.docker.com//wordpress/
https://hub.docker.com//mysql/
編寫docker-compose.yml檔案
docker-compose.yml 檔案是 Compose 使用的主模板檔案,包含三大概念:Services、networks、Volumes
。
一個service代表一個container,這個container可以從dockerhub的image來建立,或者從本地的Dockerfile build出來的image來建立,Service的啟動類似docker run,我們可以給其指定network和volume,所以可以給service指定network和volume的引用。
version: '3'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge
mysql:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridge
上述檔案中的定義等價於在命令列中手動啟動WordPress和mysql容器:
docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql:5.7
docker run -d --name wordpress -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress
啟動應用:
# docker-compose up -d
Creating network "tmp_my-bridge" with driver "bridge"
Creating tmp_wordpress_1 ... done
Creating tmp_mysql_1 ... done
這樣就成功了,然後瀏覽器訪問http://host-ip:8080即可
服務後臺啟動後檢視狀態:
# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------
tmp_mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
tmp_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8080->80/tcp
# docker-compose logs
Attaching to tmp_wordpress_1, tmp_mysql_1
wordpress_1 | WordPress not found in /var/www/html - copying now...
wordpress_1 | Complete! WordPress has been successfully copied to /var/www/html
wordpress_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
wordpress_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
wordpress_1 | [Wed Dec 12 02:11:39.611507 2018] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.25 (Debian) PHP/7.2.13 configured -- resuming normal operations
....
注意:這裡最好不要使用mysql最新的映象,因為在MySQL 8.0以上版本中,caching_sha2_password取代了mysql_native_password成為預設的身份驗證外掛,執行中會報
MySQL Connection Error: (2002) Connection refused
的錯誤
docker-compose.yml參考
每個docker-compose.yml必須定義image或者build中的一個,其它的是可選的。
image
指定映象tag或者ID:
image: wordpress
image: mysql:5.7
build
用來指定一個包含Dockerfile檔案的路徑。一般是當前目錄.
。
build: ./dir
---------------
build:
context: ./dir
dockerfile: Dockerfile
args:
buildno: 1
context
為路徑,dockerfile
為需要替換預設docker-compose的檔名,args
為構建(build)過程中的環境變數,用於替換Dockerfile裡定義的ARG引數,容器中不可用
command
覆蓋容器啟動後預設執行的命令
command: bundle exec thin -p 3000
----------------------------------
command: [bundle,exec,thin,-p,3000]
links
用於連結另一容器服務,如需要使用到另一容器的mysql服務。可以給出服務名和別名;也可以僅給出服務名,這樣別名將和服務名相同。同docker run --link
。
links:
- db
- db:mysql
- redis
使用了別名將自動會在容器的/etc/hosts檔案裡建立相應記錄:
172.17.2.186 db
172.17.2.186 mysql
172.17.2.187 redis
ports
用於暴露埠。同docker run -p
。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
expose
expose提供container之間的埠訪問,不會暴露給主機使用。同docker run --expose
。
expose:
- "3000"
- "8000"
volumes
掛載資料卷。同docker run -v
。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
volumes_from
掛載資料卷容器,掛載是容器。同docker run --volumes-from
。
volumes_from:
- service_name
- service_name:ro
- container:container_name
environment
新增環境變數。同docker run -e
。可以是陣列或者字典格式:
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
logs
日誌輸出資訊
--no-color 單色輸出,不顯示其他顏.
-f, --follow 跟蹤日誌輸出,就是可以實時檢視日誌
-t, --timestamps 顯示時間戳
--tail 從日誌的結尾顯示,--tail=200
extra_hosts
新增主機名對映。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
將會在/etc/hosts建立記錄:
162.242.195.82 somehost
50.31.209.229 otherhost
參考連結
https://www.cnblogs.com/52fhy/p/5991344.html
https://hub.docker.com//wordpress/
https://hub.docker.com//mysql/