docker-compose build、gradlew build、docker-compose up的個人理解

利用docker搭建一個mysql + java service + nginx,總共4個docker容器,如果採用docker run的方式一個一個容器去創建十分麻煩。爲了能更高效的批量創建容器,docker推出了docker-compose工具,只需要定義一個docker-compose.yml文件即可快速搞定一組容器的創建.
docker-compose.yml文件格式如下:
mysql:
 image: daocloud.io/yjmyzz/mysql-osx:latest
 volumes:
   - ./mysql/db:/var/lib/mysql
 ports:
   - 3306:3306
 environment:
   - MYSQL_ROOT_PASSWORD=123456
  
service1:
 image: java:latest
 volumes:
   - ./java:/opt/app
 expose:
   - 8080
 #ports:
 #  - 9081:8080
 links:
   - mysql:default
 command: java -jar /opt/app/spring-boot-rest-framework-1.0.0.jar
  
service2:
 image: java:latest
 volumes:
   - ./java:/opt/app
 expose:
   - 8080
 #ports:
 #  - 9082:8080
 links:
   - mysql:default
 command: java -jar /opt/app/spring-boot-rest-framework-1.0.0.jar
  
nginx1:
  image: nginx:latest
  volumes:
   - ./nginx/html:/usr/share/nginx/html:ro
   - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
   - ./nginx/conf.d:/etc/nginx/conf.d:ro
  #expose:
  #  - 80
  ports:
   - "80:80"
  links:
   - service1:service1
   - service2:service2


每一個定義在docker-compose.yml中的服務必須明確指定一個image或者build選項,這與docker run命令行中輸入的是對應相同的,對於docker run,在Dockerfile文件中指定的選項(比如CMD、EXPOSE、VOLUME、ENV)是默認的,因此不必在docker-compose.yml中再指定一次
image 
標明image的ID,這個image ID可以是本地也可以是遠程的,如果本地不存在,Compose會嘗試去pull下來
image: ubuntu image: orchardup/postgresql image: a4bc65fd

build 
該參數指定Dockerfile文件的路徑,該目錄也是發送到守護進程的構建環境(這句有點),Compose將會以一個已存在的名稱進行構建並標記,並隨後使用這個image
build: /path/to/build/dir

command 
重寫默認的命令
command: bundle exec thin -p 3000

links 
連接到其他服務中的容器,可以指定服務名稱和這個鏈接的別名,或者只指定服務名稱
links: - db - db:database - redis

此時,在容器內部,會在/etc/hosts文件中用別名創建一個條目,就像這樣:
172.17.2.186 db 172.17.2.186 database 172.17.2.186 redis


環境變量也會被創建,關於環境變量的參數,會在後面講到
external_links 
連接到在這個docker-compose.yml文件或者Compose外部啓動的容器,特別是對於提供共享和公共服務的容器。在指定容器名稱和別名時,external_links遵循着和links相同的語義用法
external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql

ports 
暴露端口,指定兩者的端口(主機:容器),或者只是容器的端口(主機會被隨機分配一個端口)
注:當以 主機:容器 的形式來映射端口時,如果使容器的端口小於60,那可能會出現錯誤,因爲YAML會將 xx:yy這樣格式的數據解析爲六十進制的數據,基於這個原因,時刻記得要將端口映射明確指定爲字符串
ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"

expose 
暴露端口而不必向主機發布它們,而只是會向鏈接的服務(linked service)提供,只有內部端口可以被指定
expose: - "3000" - "8000"

volumes 
掛載路徑最爲卷,可以選擇性的指定一個主機上的路徑(主機:容器),或是一種可使用的模式(主機:容器:ro)
volumes_from: - service_name - container_name

environment 
加入環境變量,可以使用數組或者字典,只有一個key的環境變量可以在運行Compose的機器上找到對應的值,這有助於加密的或者特殊主機的值
environment: RACK_ENV: development SESSION_SECRET: environments: - RACK_ENV=development - SESSION_SECRET

env_file 
從一個文件中加入環境變量,該文件可以是一個單獨的值或者一張列表,在environment中指定的環境變量將會重寫這些值
env_file: - .env RACK_ENV: development

net 
網絡模式,可以在docker客戶端的--net參數中指定這些值
net: "bridge" net: "none" net: "container:[name or id]" net: "host"

dns 
自定義DNS服務,可以是一個單獨的值或者一張列表
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9

cap_add,cap_drop 
加入或者去掉容器能力,查看man 7 capabilities 可以有一張完整的列表
cap_add: - ALL cap_drop: - NET_ADMIN - SYS_ADMIN

dns_search 
自定義DNS搜索範圍,可以是單獨的值或者一張列表
dns_search: example.com dns_search: - dc1.example.com - dc2.example.com

working_dir,entrypoint,user,hostname,domainname,mem_limit,privileged,restart,stdin_open,tty,cpu_shares 
上述的每一個都只是一個單獨的值,和docker run中對應的參數是一樣的
cpu_shares: 73working_dir: /codeentrypoint: /code/entrypoint.shuser: postgresqlhostname: foodomainname: foo.commem_limit: 1000000000privileged: truerestart: alwaysstdin_open: truetty: true
****************************************************************************************
好,終於把yml文件中的一些參數進行了說明,下面根據個人理解來說一下docker-compose build、docker-compose up、以及gradle構建的項目下 ./gradlew clean build 三者之間的關係。
./gradlew clean build是基於gradle構建項目時的打包指令,會將所有的文件打成一個項目名命名的jar包。
docker-compose build是基於docker compose的指令,在Dockerfile文件基礎上會將項目打成一個app.jar並將jar包製作成鏡像,並且結合yml文件可以批量build。
docker-compose up 是基於docker和yml文件的一種批量啓動方式,與其相對應的單個docker image啓動方式是 docker run 方式,這種方式要設定參數配置IP 端口號 image名稱,當項目包含多個docker時會十分繁瑣。
鏡像除了可以build出來也可以從遠端pull,使用docker pull image名的方式把鏡像pull下來之後可以直接使用docker run 將其運行。
發佈了18 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章