docker-compose是docker官方的多容器编排工具,用于定义和运行多容器 Docker 应用程序的工具。在学习使用docker-compose之前必须要了解YAML语言的用法。
docker-compose的使用:
用 docker-compose.yml 配置文件定义构成应用程序的服务和环境,这样它们可以在隔离环境中一起运行,再用docker-compose up 来启动整个docker应用程序的运行。
目录
- 1、docker-compose的安装检测
- 2、配置docker-compose.yml文件
- 3、docker-compose启动及检测
- 4、docker-compose常用命令
- 5、Yaml 语法
- 6、docker--compose 实战部署个人博客
1、docker-compose的安装检测
安装docker-compose
(最新发行的版本地址:https://github.com/docker/compose/releases)
[root@localhost ~]# curl -L “https://github.com/docker/compose/releases/download/1.24.1/docker-compose-(uname -m)” -o /usr/local/bin/docker-compose
给docker-compose添加执行权限
[root@localhost ~]# cd /usr/local/bin/
[root@localhost bin]# chmod a+x docker-compose
创建软连接
[root@localhost bin]# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试镜像是否成功
[root@localhost bin]# docker-compose --version
2、配置docker-compose.yml文件
vim docker-compose.yml
version: ‘2’services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpresswordpress:
depends_on:
- db
image: wordpress:latest
restart: always
ports:
- “8000:80”
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
3、docker-compose启动及检测
[root@localhost bin]# docker-compose up
4、docker-compose常用命令
docker-compose -f 路径 start/stop(指定yml文件位置)
docker-compose ps(显示所有容器信息)
docker-compose start/stop(启动)
docker-compose logs(查看日志)
docker-compose pause/unpause(暂停/启动)
docker-compose config -q (验证配置文件是否正确)
docker-compose rm (删除容器)
docker-compose up -d (启动容器项目)
#和docker常用命令差不多
5、Yaml 语法
1、image
services:
web:
image: hello-world
#镜像可用格式
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
2、build
服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器
build: /path/to/build/dir
也可以是相对路径,只要上下文确定就可以读取到 Dockerfile
build: ./dir
build:
context: …/
dockerfile: path/of/Dockerfile
args:
buildno: 1
password: secret
image: webapp:tag3、command
command: bundle exec thin -p 3000
command: [bundle, exec, thin, -p, 3000]4、container_name:<项目名称><服务名称><序号>
container_name: app5、depends_on
version: ‘2’
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
image: postgres6、dns
dns: 8.8.8.8
dns:• 8.8.8.8
• 9.9.9.9
• 8.8.8.8
7、tmpfs
tmpfs: /run
tmpfs:• /run
• /tmp
8、 entrypoint
entrypoint: /code/entrypoint.sh9、env_file
env_file: .env
env_file:• ./common.env
• ./apps/web.env
• /opt/secrets.env
10、environment:镜像变量
environment:
RACK_ENV: development
SHOW: ‘true’
SESSION_SECRET:environment:
• RACK_ENV=development
• SHOW=true
• SESSION_SECRET
11、expose
expose:• “3000”
• “8000”
12、 external_links:链接外部容器
external_links:• redis_1
• project_db_1:mysql
• project_db_1:postgresql
13、extra_hosts
extra_hosts:• “somehost:162.242.195.82”
• “otherhost:50.31.209.229”
14、labels
labels:
com.example.description: “Accounting webapp”
com.example.department: “Finance”
com.example.label-with-empty-value: “”
labels:• “com.example.description=Accounting webapp”
• “com.example.department=Finance”
• “com.example.label-with-empty-value”
15、links:与 Docker client 的 --link 一样效果,会连接到其它服务中的容器
links:
• db
• db:database
• redis
16、 logging
logging:
driver: syslog
options:
syslog-address: “tcp://192.168.0.42:123”17、pid
pid: “host”18、port
ports:• “3000”
• “8000:8000”
• “49100:22”
• “127.0.0.1:8001:8001”
#为每个容器覆盖默认的标签。简单说来就是管理全部服务的标签。比如设置全部服务的user标签值为USER。
security_opt:• label:user:USER
• label:role:ROLE
20、 stop_signal
stop_signal: SIGUSR121、volumes
volumes:
// 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。• /var/lib/mysql
// 使用绝对路径挂载数据卷
• /opt/data:/var/lib/mysql
// 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
• ./cache:/tmp/cache
// 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
• ~/configs:/etc/configs/:ro
// 已经存在的命名的数据卷。
• datavolume:/var/lib/mysql
// 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
22、volumes_from:从其它容器或者服务挂载数据卷,可选的参数是 :ro或者 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的。默认情况下是可读可写的
volumes_from:
• service_name
• service_name:ro
• container:container_name
• container:container_name:rw
23、cap_add, cap_drop
cap_add:• ALL
cap_drop:
• NET_ADMIN
• SYS_ADMIN
24、extends
extends:
file: common.yml
service: webapp25、network_mode
network_mode: “bridge”
network_mode: “host”
network_mode: “none”
network_mode: “service:[service name]”
network_mode: “container:[container name/id]”26、 networks
services:
some-service:
networks:
- some-network
- other-network
6、docker–compose 实战部署个人博客
[root@www ~]# mkdir -p /my_wordpress
[root@www ~]# cd /my_wordpress/
[root@www my_wordpress]# cat docker-compose.yml
version: '2'
services:
db:
image: mysql:5.7
volumes:
- /db_data:/var/lib/mysql
ports:
- "3306:3306"
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
WORDPRESS_DB_NAME: wordpress
[root@www my_wordpress]# docker-compose up -d
Creating network "mywordpress_default" with the default driver
Creating mywordpress_db_1
Creating mywordpress_wordpress_1
[root@www my_wordpress]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress latest 2da59c54a06a 5 days ago 543MB
mysql 5.7 718a6da099d8 7 days ago 448MB
[root@www my_wordpress]# docker-compose ps
Name Command State Ports
mywordpress_db_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp
mywordpress_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8000->80/tcp
```python
[root@www my_wordpress]# ls /db_data/
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem wordpress
[root@www my_wordpress]# docker network ls | awk 'NR==1 || $2=="mywordpress_default"'
NETWORK ID NAME DRIVER SCOPE