一個使用Docker容器的應用,一般由多個容器組成。使用Docker Compose,再也不須要使用shell腳原本啓動容器。在配置文件中,全部的容器經過services來定義,而後使用docker-compose腳原本啓動,中止和重啓應用,和應用中的服務以及全部依賴服務的容器
Compose 經過一個配置文件來管理多個Docker容器,很是適合組合使用多個容器進行開發的場景。java
服務編排工具使得Docker應用管理更爲方便快捷。 mysql
Docker Compose網站:https://docs.docker.com/composegit
使用Compose
基本上是三個步驟:github
1.定義Dockerfile
web
2.編寫docker-compose.yml
redis
3.最後運行 docker-compose up
啓動服務spring
Ubuntu 17.04 x64
Docker CE: 17.12.0-ce
Docker Compose: 1.18.0 sql
參考-https://docs.docker.com/compose/install/#prerequisitesdocker
在Linux上,您能夠從GitHub上的Compose存儲庫版本頁面下載Docker Compose 最新二進制文件shell
運行此命令下載最新版本的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
使用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
指定鏡像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
標籤。
用來指定一個包含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: bundle exec thin -p 3000
command
也支持數組形式
command: [bundle, exec, thin, -p, 3000]
用於連接另外一容器服務,如須要使用到另外一容器的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
因此咱們在容器裏就能夠直接使用別名做爲服務的主機名。
用於暴露端口。同docker run -p
。
示例:
ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"
expose
提供container
之間的端口訪問,不會暴露給主機使用。同docker run --expose
。
expose: - "3000" - "8000"
掛載數據卷。同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#
掛載數據卷容器,掛載是容器。同docker run --volumes-from
。示例:
volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw
container:container_name
格式僅支持version 2
。
添加環境變量。同docker run -e
。能夠是數組或者字典格式:
environment: RACK_ENV: development SESSION_SECRET: environment: - RACK_ENV=development - SESSION_SECRET
用於指定服務依賴,通常是mysql、redis
等。
指定了依賴,將會優先於服務建立並啓動依賴。
links
也能夠指定依賴。
連接搭配docker-compose.yml
文件或者Compose
以外定義的服務,一般是提供共享或公共服務。格式與links
類似:
external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql
注意,external_links
連接的服務與當前服務必須是同一個網絡環境。
添加主機名映射。
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
將會在/etc/hosts
建立記錄:
162.242.195.82 somehost 50.31.209.229 otherhost
繼承自當前yml
文件或者其它文件中定義的服務,能夠選擇性的覆蓋原有配置。
extends: file: common.yml service: webapp
service
必須有,file
可選。service
是須要繼承的服務,例如web
、database
。
設置網絡模式。同docker
的--net
參數。
net: "bridge" net: "none" net: "container:[name or id]" net: "host"
自定義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
https://docs.docker.com/compose/compose-file/
Compose file version 2
https://docs.docker.com/compose/compose-file/compose-file-v2/
Compose file version 1
https://docs.docker.com/compose/compose-file/compose-file-v1/
參考
https://docs.docker.com/compose/overview/
https://docs.docker.com/compose/