这里有一个使用 wordpress 的 docker-compose.yml的示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
version: '3'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment: 
      MYSQL_ROOT_PASSWORD: gaofeifiy
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    ports:
      - 33060:3306
  
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8080:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
volumes:
  db_data: 

其中有一点奇怪的地方就是在db的数据挂载当中,是这么写的:

1
2
3
4
5
6
7
8
9
...
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
....

volumes:
  db_data: 

这是docker-compose version2 起开始的新语法,目的就是方便多个服务之间公用同一个卷

1
2
volumes:
  db_data: 

这种写法就是声明一个命名卷, 通过docker volume ls 可以列出来宿主机上的所有挂载的卷,而且这些卷不会因为容器被删除而删除,为的就是方便数据和服务分离

可以通过命令docker inspect wordpress_db_data 来查看卷的配置,这里wordpress_db_data就是我们刚才声明的那个卷的名字

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
➜  wordpress git:(master) ✗ docker inspect wordpress_db_data
[
    {
        "CreatedAt": "2018-02-13T04:29:29Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "wordpress",
            "com.docker.compose.volume": "db_data"
        },
        "Mountpoint": "/var/lib/docker/volumes/wordpress_db_data/_data",
        "Name": "wordpress_db_data",
        "Options": {},
        "Scope": "local"
    }
]

不过他的mountpoint的路径并不是宿主机上的路径,而依然是属于docker的路径,在macOS系统当中可以执行

1
2
3
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

# ls -ltrh /var/lib/docker/volumes

macOS 中并不能看到实体文件,而是进入linuxkit中,所有的资源也是在那里,这在winmac会出现,在 linuxOS中就是正常的/var/lib/docker路径 可以查看卷的列表, 参考资料1 参考资料2

清除本地的卷可以执行docker volume prune

官方文档