在 docker - 部署一個複雜的springboot服務 該文中,咱們部署了一個「複雜」的springboot服務,實現了一個計數服務。經過此次部署操做,咱們瞭解到部署多容器的APP至少須要通過如下幾個步驟:redis
(1)寫Dockerfile構建鏡像或者從docker registry中拉取鏡像spring
(2)構建多個容器docker
(3)管理這些容器(啓動、中止等)springboot
可見,若是APP涉及到的容器不少,要管理這些容器是比較複雜的,至少命令行敲到想哭。那麼,有沒有一個工具,幫咱們批處理這些容器呢?bash
docker-compose是docker公司推出的一個服務編排工具,換句話說就是一個批處理容器的工具。該工具能夠經過yml文件定義多容器的應用,並建立和管理這些容器。網絡
在文章 安裝 docker-compose 中,已經詳細介紹了compose的幾種安裝方法,能夠參考安裝。app
docker-compose.yml是compose的默認的腳本名字,在執行compose命令構建的時候,若是不指定文件名,將會默認使用docker-compose.yml文件,和Dockerfile文件相似。socket
docker-compose.yml是有版本的,如今最新版本是v3版本,v1版本不推薦使用,v2和v3是可兼容的,並且區別不是很大。這裏須要提到一點區別,v2只能用於多個容器部署在一個宿主主機,而v3能夠集羣方式部署在多個宿主主機(swarm)。另外,不一樣的compose文件版本對docker的版本是有要求的。若是有興趣,能夠在docker的官網中詳細瞭解,版本間的區別連接的地址。咱們採用官方推薦的v3版本學習docker-compose。tcp
在compose中,主要有四個基本節點: version、services、networks、volumes。是否是很熟悉,其實compose就是使用腳本方式代替咱們以前經過命令行啓動每一個服務。下面是一個基本的compose腳本。工具
version: '3' services: springboot-docker: image: myimage:1.0 build: context: . dockerfile: Dockerfile ports: - 8080:8080 networks: - mybridge volumes: - mydata:/app networks: mybridge: driver: bridge volumes: mydata:
本文將經過一個簡單的 docker-compose 文件,熟悉經常使用的docker-compose命令。docker-compose.yml文件存放在dockercompose文件夾中。
version: '3' services: busybox: image: busybox restart: always command: /bin/echo redis: image: redis:4.0.11 ports: - 6379:6379 volumes: - /data/redis:/data restart: always command: redis-server
咱們查看 docker-compose 有多少種命令,有個大概的瞭解。docker-compose命令便可查看。
[root@localhost dockercompose]# docker-compose
Define and run multi-container applications with Docker. 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 --log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL) --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 --project-directory PATH Specify an alternate working directory (default: the path of the Compose file) --compatibility If set, Compose will attempt to convert deploy keys in v3 files to their non-Swarm equivalent 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
這裏的選項中有兩個是經常使用的:-f 和 -p
-f :指定文件。在運行up命令啓動容器時,若是沒有指定docker-compose.yml文件,將會讀取當前目錄下的docker-compose.yml文件
-p:啓動後的服務的名字默認狀況下采用compose.yml文件所在的目錄+服務名+副本數命名,例如上面的例子的名字爲: dockercompose_redis_1 。若是指定-p,則會用項目名代替該文件目錄名。
下面開始介紹一些經常使用的docker-compose命令。
docker-compose create | 建立全部的服務 |
docker-compose start | 啓動被中止或未啓動的服務 |
docker-compose up | 建立全部服務而且啓動服務,即同時執行了create和start命令 |
docker-compose stop | 中止全部服務 |
docker-compose kill | 強行中止全部服務 |
docker-compose rm | 刪除中止的服務 |
docker-compose restart | 重啓全部服務) |
docker-compose down | 中止、刪除全部的服務以及網絡、鏡像 |
其中,up命令啓動全部的服務時,若是沒有使用-d命令,會在前臺啓動全部的服務,前臺窗口將打印服務的啓動日誌。建議經過 -d 啓動。例如經過up啓動上面的redis服務。
[root@localhost dockercompose]# docker-compose up -d Creating network "dockercompose_default" with the default driver
而後能夠經過 docker-compose logs -f 獲取輸出的日誌
該命令能夠查看容器列表,能夠獲取到容器的簡單信息。
[root@localhost dockercompose]# docker-compose ps Name Command State Ports ----------------------------------------------------------------------------------------- dockercompose_busybox_1 /bin/echo Up dockercompose_redis_1 docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp
上面的信息能夠獲得容器名、啓動命令、容器狀態以及端口的映射狀況。
該命令用於擴展容器,爲service設置多個容器(副本)。咱們爲上面的busybox服務擴展爲2個副本。
[root@localhost dockercompose]# docker-compose scale busybox=2 WARNING: The scale command is deprecated. Use the up command with the --scale flag instead. Starting dockercompose_busybox_1 ... done Creating dockercompose_busybox_2 ... done
稍等一下,經過ps命令能夠看到已經啓動了兩個busybox服務。
前面的輸出中,提示該命令已通過期,使用--scale選項指定副本。
咱們down了服務後,從新使用up命令並指定副本數
[root@localhost dockercompose]# docker-compose up -d --scale busybox=2
[root@localhost dockercompose]# docker-compose ps Name Command State Ports ---------------------------------------------------------------------------------------------- dockercompose_busybox_1 /bin/echo Restarting dockercompose_busybox_2 /bin/echo Restarting dockercompose_redis_1 docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp
不明白爲何一直都是restarting。。。。。忽略它吧。。。。通常不會在一個宿主部署兩個一樣的服務