一個使用Docker容器的應用,通常由多個容器組成。使用Docker Compose,不再需要使用shell指令碼來啟動容器。在配置檔案中,所有的容器通過services來定義,然後使用docker-compose指令碼來啟動,停止和重啟應用,和應用中的服務以及所有依賴服務的容器 Compose 通過一個配置檔案來管理多個Docker容器,非常適合組合使用多個容器進行開發的場景。
服務編排工具使得Docker應用管理更為方便快捷。
Docker Compose網站:docs.docker.com/compose
使用Compose
基本上是三個步驟:
1.定義Dockerfile
2.編寫docker-compose.yml
3.最後執行 docker-compose up
啟動服務
系統環境
Ubuntu 17.04 x64
Docker CE: 17.12.0-ce
Docker Compose: 1.18.0
參考-https://docs.docker.com/compose/install/#prerequisites
在Linux上,您可以從GitHub上的Compose儲存庫版本頁面下載Docker Compose 最新二進位制檔案
Compose 安裝
執行此命令下載最新版本的Docker Compose
$ curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
複製程式碼
對二進位制檔案應用可執行許可權
$ chmod +x /usr/local/bin/docker-compose
複製程式碼
驗證
$ docker-compose --version
docker-compose version 1.16.1, build 6d1ac21
複製程式碼
解除安裝
要解除安裝 Docker Compose,如果使用 curl 以下安裝:
$ rm /usr/local/bin/docker-compose
複製程式碼
入門示例
WordPress
使用Docker Compose
可以輕鬆地在Docker
容器中,構建獨立環境執行的WordPress
,在開始之前必須安裝Docker Compose
。
編寫配置
1.建立一個空的專案目錄。
新建一個你能記住的目錄,這個目錄是應用映象的上下文,該目錄用於存放構建該映象的資源
在這個目錄裡面將會新建一個docker-compose.yml
檔案
$ mkdir my_wordpress
複製程式碼
2.進入my_wordpress
目錄
$ cd my_wordpress
複製程式碼
3.建立一個docker-compose.yml
檔案,將啟動您的 WordPress
部落格和一個單獨的MySQL
例項並掛載資料持久化到宿主機
$ touch docker-compose.yml
$ vi docker-compose.yml
複製程式碼
內容如下
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
複製程式碼
image
image:
指定服務的映象名稱或映象 ID
image: mysql
,image: wordpress:latest
。如果映象在本地不存在,Compose 將會嘗試拉取這個映象。
所以我們不需要先拉取映象
volumes
- db_data:
指MySQL
例項掛載資料持久化到宿主機/var/lib/docker/volumes/mywordpress_db_data/_data
PS
$ docker run -v /var/lib/mysql --name mywordpress_db_data -e MYSQL_ROOT_PASSWORD=wordpress -d mysql
$ docker run --name some-wordpress --link mywordpress_db_data:mysql -p 8002:80 -d wordpress
複製程式碼
以上命令的意思是新建mywordpress_db_data
和some-wordpress
容器。等同於:docker-compose.yml
內容
啟動服務
root@souyunku:/opt/my_wordpress# docker-compose up -d
複製程式碼
如果看到如下資訊就證明沒毛病
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
f49cf87b52c1: Pull complete
78032de49d65: Pull complete
837546b20bc4: Pull complete
9b8316af6cc6: Pull complete
1056cf29b9f1: Pull complete
86f3913b029a: Pull complete
f98eea8321ca: Pull complete
3a8e3ebdeaf5: Pull complete
4be06ac1c51e: Pull complete
920c7ffb7747: Pull complete
Digest: sha256:7cdb08f30a54d109ddded59525937592cb6852ff635a546626a8960d9ec34c30
Status: Downloaded newer image for mysql:5.7
Pulling wordpress (wordpress:latest)...
latest: Pulling from library/wordpress
e7bb522d92ff: Pull complete
75651f247827: Pull complete
dbcf8fd0150f: Pull complete
de80263f26f0: Pull complete
65be8ad4c5fd: Pull complete
239d5fed0dda: Pull complete
5ab39b683a9f: Pull complete
4a3f54f2d93a: Pull complete
28c970ad99e9: Pull complete
5d1e20c7c396: Pull complete
05f877a23903: Pull complete
e0a5c61bdaa6: Pull complete
d27d2d70a072: Pull complete
ba039fef4b7e: Pull complete
fd026e22f5c3: Pull complete
a523c6d55ab4: Pull complete
025590874132: Pull complete
d1f0ca983d7b: Pull complete
40d597c8be8b: Pull complete
Digest: sha256:573257b41e1c3554cfe3a856d3c329030a821194172e2aeb1d3a7f5dd896ccb4
Creating mywordpress_db_1 ... done
Creating mywordpress_db_1 ...
Creating mywordpress_wordpress_1 ... done
root@souyunku:/opt/my_wordpress#
複製程式碼
檢視容器
root@souyunku:/opt/my_wordpress# docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d715012934dc wordpress:latest "docker-entrypoint.s…" 2 hours ago Up 19 seconds 0.0.0.0:8000->80/tcp mywordpress_wordpress_1
ce956cf8d74b mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 2 hours 3306/tcp mywordpress_db_1
複製程式碼
檢視映象
root@souyunku:/opt/my_wordpress# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 f008d8ff927d 2 days ago 409MB
wordpress latest 28084cde273b 9 days ago 408MB
root@souyunku:/opt/my_wordpress#
複製程式碼
訪問服務
編寫參考
每個docker-compose.yml
必須定義image
或者build
中的一個,其它的是可選的。
image
image
指定映象tag
或者ID
。示例:
image: mysql
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
複製程式碼
注意,在version 1
裡同時使用image和build是不允許的,version 2
則可以,如果同時指定了兩者,會將build
出來的映象打上名為image
標籤。
build
用來指定一個包含Dockerfile
檔案的路徑。一般是當前目錄.build
並生成一個隨機命名的映象。
例項
├── app
│ ├── Dockerfile
│ └── docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar
├── docker-compose.yml
複製程式碼
Dockerfile 內容
root@souyunku:/opt/app# cat Dockerfile
FROM java:8
VOLUME /tmp
ADD docker-spring-boot-demo-maven-plugin-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
複製程式碼
**docker-compose.yml ** 內容
root@souyunku:/opt# cat docker-compose.yml
app:
build: ./app
ports:
- "9090:80"
expose:
- 80
複製程式碼
./app
是放Dockerfile
的路徑
ports
用於暴露埠 同docker run -p
command
用來覆蓋預設命令。示例:
command: bundle exec thin -p 3000
複製程式碼
command
也支援陣列形式
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
複製程式碼
進入MySQL容器
檢視容器ID
root@souyunku:# docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
559e49f8dc01 wordpress:latest "docker-entrypoint.s…" 18 minutes ago Up 18 minutes 0.0.0.0:8000->80/tcp mywordpress_wordpress_1
3c207b3e16bd mysql:5.7 "docker-entrypoint.s…" 18 minutes ago Up 18 minutes 3306/tcp mywordpress_db_1
複製程式碼
通過容器ID進入MySQL容器
root@souyunku:# docker exec -it 3c207b3e16bd bash
複製程式碼
進入MySQL容器的儲存目錄
root@3c207b3e16bd:/# cd var/lib/mysql
root@3c207b3e16bd:/var/lib/mysql# ls
auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 mysql private_key.pem server-cert.pem sys wordpress
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 performance_schema public_key.pem server-key.pem test.txt
root@3c207b3e16bd:/var/lib/mysql# cat test.txt
1234
複製程式碼
新建一個文字,用於測試MySQL容器的掛載目錄,有沒有同步到宿主機
root@3c207b3e16bd:/var/lib/mysql# touch test.txt
root@3c207b3e16bd:/var/lib/mysql# echo '1234' >test.txt
複製程式碼
宿主機檢視容器掛載是否同步
root@souyunku:/var/lib/docker/volumes/mywordpress_db_data/_data# pwd
/var/lib/docker/volumes/mywordpress_db_data/_data
root@souyunku:/var/lib/docker/volumes/mywordpress_db_data/_data# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys wordpress
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem test.txt
root@souyunku:/var/lib/docker/volumes/mywordpress_db_data/_data# cat test.txt
1234
root@souyunku:/var/lib/docker/volumes/mywordpress_db_data/_data#
複製程式碼
volumes_from
掛載資料卷容器,掛載是容器。同docker run --volumes-from
。示例:
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
複製程式碼
container:container_name
格式僅支援version 2
。
environment
新增環境變數。同docker run -e
。可以是陣列或者字典格式:
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
複製程式碼
depends_on
用於指定服務依賴,一般是mysql、redis
等。
指定了依賴,將會優先於服務建立並啟動依賴。
links
也可以指定依賴。
external_links
連結搭配docker-compose.yml
檔案或者Compose
之外定義的服務,通常是提供共享或公共服務。格式與links
相似:
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
複製程式碼
注意,external_links
連結的服務與當前服務必須是同一個網路環境。
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
複製程式碼
extends
繼承自當前yml
檔案或者其它檔案中定義的服務,可以選擇性的覆蓋原有配置。
extends:
file: common.yml
service: webapp
複製程式碼
service
必須有,file
可選。service
是需要繼承的服務,例如web
、database
。
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
複製程式碼
更多
cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir
這些命令都是單個值,含義請參考
編寫 docker-compose 請參考官方文件
Compose file version 3
Compose file version 2
Compose file version 1
參考
Contact
- 作者:鵬磊
- 出處:www.ymq.io/2018/01/17/…
- Email:admin@souyunku.com
- 版權歸作者所有,轉載請註明出處
- Wechat:關注公眾號,"搜雲庫",專注於開發技術的研究與知識分享