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 將其運行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.