Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用,Compose 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景。
安装Docker compose
pip安装:
pip install docker-compose
从github安装:
curl -L --fail https://github.com/docker/compose/releases/download/1.17.0/run.sh -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
卸载:
rm /usr/local/bin/docker-compose # 使用curl安装的
pip uninstall docker-compose # 使用pip卸载
基本使用
#查看帮助
docker-compose -h
# -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d
#启动所有容器,-d 将会在后台启动并运行所有的容器
docker-compose up -d
#停用移除所有容器以及网络相关
docker-compose down
#查看服务容器的输出
docker-compose logs
#列出项目中目前的所有容器
docker-compose ps
#构建(重新构建)项目中的服务容器。服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。可以随时在项目目录下运行 docker-compose build 来重新构建服务
docker-compose build
#拉取服务依赖的镜像
docker-compose pull
#重启项目中的服务
docker-compose restart
#删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
docker-compose rm
#在指定服务上执行一个命令。
docker-compose run ubuntu ping docker.com
#设置指定服务运行的容器个数。通过 service=num 的参数来设置数量
docker-compose scale web=3 db=2
#启动已经存在的服务容器。
docker-compose start
#停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
docker-compose stop
快速入门
通过搭建一个WordPress来熟悉compose的使用
https://hub.docker.com//wordpress/
https://hub.docker.com//mysql/
编写docker-compose.yml文件
docker-compose.yml 文件是 Compose 使用的主模板文件,包含三大概念:Services、networks、Volumes
。
一个service代表一个container,这个container可以从dockerhub的image来创建,或者从本地的Dockerfile build出来的image来创建,Service的启动类似docker run,我们可以给其指定network和volume,所以可以给service指定network和volume的引用。
version: '3'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge
mysql:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridge
上述文件中的定义等价于在命令行中手动启动WordPress和mysql容器:
docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql:5.7
docker run -d --name wordpress -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress
启动应用:
# docker-compose up -d
Creating network "tmp_my-bridge" with driver "bridge"
Creating tmp_wordpress_1 ... done
Creating tmp_mysql_1 ... done
这样就成功了,然后浏览器访问http://host-ip:8080即可
服务后台启动后查看状态:
# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------
tmp_mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
tmp_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8080->80/tcp
# docker-compose logs
Attaching to tmp_wordpress_1, tmp_mysql_1
wordpress_1 | WordPress not found in /var/www/html - copying now...
wordpress_1 | Complete! WordPress has been successfully copied to /var/www/html
wordpress_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
wordpress_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
wordpress_1 | [Wed Dec 12 02:11:39.611507 2018] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.25 (Debian) PHP/7.2.13 configured -- resuming normal operations
....
注意:这里最好不要使用mysql最新的镜像,因为在MySQL 8.0以上版本中,caching_sha2_password取代了mysql_native_password成为默认的身份验证插件,运行中会报
MySQL Connection Error: (2002) Connection refused
的错误
docker-compose.yml参考
每个docker-compose.yml必须定义image或者build中的一个,其它的是可选的。
image
指定镜像tag或者ID:
image: wordpress
image: mysql:5.7
build
用来指定一个包含Dockerfile文件的路径。一般是当前目录.
。
build: ./dir
---------------
build:
context: ./dir
dockerfile: Dockerfile
args:
buildno: 1
context
为路径,dockerfile
为需要替换默认docker-compose的文件名,args
为构建(build)过程中的环境变量,用于替换Dockerfile里定义的ARG参数,容器中不可用
command
覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
----------------------------------
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
volumes_from
挂载数据卷容器,挂载是容器。同docker run --volumes-from
。
volumes_from:
- service_name
- service_name:ro
- container:container_name
environment
添加环境变量。同docker run -e
。可以是数组或者字典格式:
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
logs
日志输出信息
--no-color 单色输出,不显示其他颜.
-f, --follow 跟踪日志输出,就是可以实时查看日志
-t, --timestamps 显示时间戳
--tail 从日志的结尾显示,--tail=200
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
参考链接
https://www.cnblogs.com/52fhy/p/5991344.html
https://hub.docker.com//wordpress/
https://hub.docker.com//mysql/