Docker-compose是一個基於Docker的編排工具,所謂編排我的理解就是將不一樣的鏡像經過配置,組成一個新的運行環境,官方定義是:Compose is a tool for defining and running multi-container Docker applications.
java
很簡單的一句話,下面咱們看下怎麼部署一個JavaWeb項目.主要有幾大步驟:mysql
安裝docker 和 docker-compose 同樣都很是的簡單,這裏不在多贅述,官網都有很是詳細的教程. 至於docker_compose就是一個命令文件,將其所在的路徑配置PATH環境變量中便可,不配置也行,這樣的話就要打全路徑了,比較麻煩.linux
我是用的是Manjaro的Linux發行版本,啓動docker服務的命令systemctl start docker
,git
$ docker version Client: Version: 18.05.0-ce API version: 1.37 Go version: go1.10.2 Git commit: f150324782 Built: Wed May 16 22:27:45 2018 OS/Arch: linux/amd64 Experimental: false Orchestrator: swarm Server: Engine: Version: 18.05.0-ce API version: 1.37 (minimum version 1.12) Go version: go1.10.2 Git commit: f150324782 Built: Wed May 16 22:28:17 2018 OS/Arch: linux/amd64 Experimental: false
下載docker-compose完成以後,使用chmod +x docker-componse 來受權,不然會出現權限拒絕的報錯信息github
配置完成只有,在命令行中輸入docker-compose version
查看是否安裝成功,輸出相似如下信息,則表明成功sql
$ docker-compose version docker-compose version 1.22.0-rc2, build 6817b533 docker-py version: 3.4.1 CPython version: 3.6.6 OpenSSL version: OpenSSL 1.1.0f 25 May 2017
此文件名位Dockerfiledocker
FROM hub.c.163.com/library/java:8 VOLUME /tmp ADD dmc_user.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
下面咱們將使用Shell腳本的方式來利用這個Docker文件來進行建立鏡像shell
因爲這裏使用SpringBoot建立的項目,我的使用Gradle構建項目,使用Maven或者其餘方式構建的都可,這裏寫了一個Shell腳本,以下所示:數據庫
#!/usr/bin/env bash #配置相關的路徑地址 #配置項目名稱 project_name="DMC_USER" # 配置源碼地址 project_dir="/home/yan/code/work/zhuxun/dmc_user" #配置shell地址 shell_dir="/home/yan/code/shell/dmc/user" echo "正在準備編譯項目${project_name}....." #切換到項目目錄 cd ${project_dir} echo "已經成功切換到${project_name}的工做目錄......" #使用gradle編譯,跳過單元測試 ./gradlew build -x test if [ $? -eq 0 ]; then echo "正在拷貝JAR文件............" # 編譯成功,則將JAR文件拷貝當前Shell目錄 cp build/libs/dmc_user-0.0.1-SNAPSHOT.jar ${shell_dir}/dmc_user.jar cd ${shell_dir} echo "編譯成功,正在編譯爲Docker鏡像,請等待...." # 使用docker build命令構建鏡像文件,此時會讀取Dockerfile文件 docker build -t dmc_user:latest ${shell_dir} if [ $? -eq 0 ]; then echo "編譯鏡像成功,請使用docker images命令查看效果....." fi fi
添加運行權限,運行之......api
因爲我這裏使用的多個項目進行同事運行,所以須要在次編譯另一個項目,方法相似,這裏不在贅述. 編譯完成以後,咱們在Dockerfile中查看一下鏡像
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE dmc_user latest a7ea7b79390f 3 hours ago 692MB dmc_apim latest 56c7f37aee13 16 hours ago 704MB hub.c.163.com/library/java 8 a001fc27db5a 19 months ago 643MB
到這裏,咱們的鏡像已經準備好了,下面咱們使用docker-compose來編排鏡像,組成新的服務.在shell的目錄下建立 文件名稱docker-compose.yml的配置文件,內容以下(刪除註釋)...
# 配置文件的版本 version: '2' # 建立的服務,這裏我建立了3個服務,兩個jar項目做爲演示,一個mysql做爲服務器 services: dmc_api: # 容器的名稱 container_name: dmc_apim # 容器的端口信息,這裏的SpringBoot項目的端口是9092,能夠在宿主機經過8082訪問 ports: - "8082:9092" # 依賴的docker images鏡像名稱,固然也有版本這裏是簡寫 dmc_api:latest image: dmc_apim # 建立自服務的依賴項,此服務依賴屬於mysql,在咱們建立的三個服務中的最後一個 depends_on: - dmc_dev_mysql dmc_user: container_name: dmc_user ports: - "8081:9091" image: dmc_user depends_on: - dmc_dev_mysql dmc_dev_mysql: # 這個屬性很是重要,在SpringBoot的服務中,能夠經過這個名稱訪問,若是名稱衝突,docker_compose會自動的添加後綴致使SpringBoot項目找不到數據庫鏈接, # 從而啓動失敗,所以須要配置容器的名稱 container_name: dmc_dev_mysql # 掛載目錄,其中 /docker-entrypoint-initdb.d/ 是比較重要的,他能夠進行mysql的初始化,在咱們的mysql服務的時候啓動初始化腳本 # 所以須要在掛載的目錄下建立init.sql腳本文件,用於初始化 volumes: - ./data/:/var/lib/mysql/ - ./mysql/init/:/docker-entrypoint-initdb.d/ # 配置映射端口,這裏mysql的端口默認是3306,咱們將其映射到宿主機的9936端口 ports: - "9936:3306" # 依賴的鏡像 image: hub.c.163.com/library/mysql # 鏡像運行須要的參數,能夠根據本身的須要來配置,這個請參考鏡像的說明文件 environment: MYSQL_ALLOW_EMPTY_PASSWORD: yse
這裏和建立docker Image相似,都是使用配置文件,咱們來看下咱們的配置文件,配置文件名稱是固定的,所以要求名稱要寫對,不然會報一些錯誤:
$ docker-compose up ERROR: Can't find a suitable configuration file in this directory or any parent. Are you in the right directory? Supported filenames: docker-compose.yml, docker-compose.yaml
能夠看到,最後一句話中說明了配置的文件名稱 Supported filenames: docker-compose.yml, docker-compose.yaml
## 啓動Docker-compose 使用命令```docker-compose up```能夠啓動編排,要求運行此命令運行路徑下必須有docker-compose的配置文件,不然會報上面的找不到文件, 添加 *-d * 就能夠後臺運行,查看docker-compose的幫助文件咱們看下docker容器的情況: ```shell $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6c2b3823bd93 dmc_apim "java -Djava.securit…" 2 hours ago Up 2 hours 0.0.0.0:8082->9092/tcp dmc_apim f1473486bbec dmc_user "java -Djava.securit…" 2 hours ago Up 2 hours 0.0.0.0:8081->9091/tcp dmc_user 3c632926a642 hub.c.163.com/library/mysql "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:9936->3306/tcp dmc_dev_mysql
能夠看到兩個SpringBoot項目和一個MySql項目在docker中運行完成.....
命令名稱 | 說明 |
---|---|
docker-compose build | Build or rebuild services |
docker-compose bundle | Generate a Docker bundle from the Compose file |
docker-compose config | Validate and view the Compose file |
docker-compose create | Create services |
docker-compose down | Stop and remove containers, networks, images, and volumes |
docker-compose events | Receive real time events from containers |
docker-compose exec | Execute a command in a running container |
docker-compose help | Get help on a command |
docker-compose images | List images |
docker-compose kill | Kill containers |
docker-compose logs | View output from containers |
docker-compose pause | Pause services |
docker-compose port | Print the public port for a port binding |
docker-compose ps | List containers |
docker-compose pull | Pull service images |
docker-compose push | Push service images |
docker-compose restart | Restart services |
docker-compose rm | Remove stopped containers |
docker-compose run | Run a one-off command |
docker-compose scale | Set number of containers for a service |
docker-compose start | Start services |
docker-compose stop | Stop services |
docker-compose top | Display the running processes |
docker-compose unpause | Unpause services |
docker-compose up | Create and start containers |
docker-compose version | Show the Docker-Compose version information |
更多內容請查看 Docker-componse官網教程