Docker-compose

一、Docker-compose简介

1、Docker-compose定义

Docker容器的编排工具,单台Docker上,用于定义和运行多个相关联的容器。

例如:

LNMT,先启动MySQL,再启动Tomcat,最后启动Nginx。

还有,像前面安装harbor时需要安装docker-compose,是为了同时管理9个容器。

官网文档地址:https://docs.docker.com/compose/overview/

Docker-compose技术,就是通过一个 docker-compose.yml 配置文件,将所有的容器的部署方法、文件映射、容器连接等等一系列的配置写在一个配置文件里,最后只需要执行docker-compose up命令就会像执行脚本一样的去一个个安装容器并自动部署他们,极大的便利了复杂服务的部署。

核心概念:

服务(service):一个应用的容器,服务可以存在多个。

项目(project):由一组关联的容器组成的一个完整业务单元,在“docker-compose.yml”中定义。

2、服务架构的演进

单体服务架构

分布式服务架构

微服务架构

超微服务架构

3、容器编排工具

Docker compose:是一个用于定义和运行多Docker容器的管理工具(单主机上)。

Docker Swarm:是 Docker 官方提供的容器编排工具,集成在 Docker 引擎中。

Kubernetes:(简称 K8s),由 Google 开发并开源。后贡献给了CNCF(云原生计算基金会),是目前是最流行的容器编排工具。

二、安装Docker-compose

实验环境

安装好Docker

使用其中之一方法安装即可

1、官方在线安装

curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

赋予执行权限

chmod +x /usr/local/bin/docker-compose

查看版本进行验证

docker-compose version

2、离线安装

使用wget下载软件包或上传docker-compose-linux-x86_64包到/root目录

wget https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64

移动到指定目录

mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose

赋予执行权限

chmod +x /usr/local/bin/docker-compose

查看版本进行验证

docker-compose version

三、docker-compose.yml文件

1、符合yaml文件格式

大小写敏感

使用缩进表示层级关系

缩进时不允许使用tab键默认空格数

使用空格键或更改默认tab空格数为2

缩进的空格数目不重要,只要相同层级的元素左右对齐即可,一般为两个

设置tab键的空格数

vim .vimrc

添加:

set tabstop=2

重新加载 vim 的配置文件,使对配置文件的修改立即生效

source .vimrc

2、通过一个实例认识docker-compose.yml文件

将如下容器运行命令改写成yml文件

docker run -d -p 80:80 --name web-nginx --restart=always -v /webserver:/usr/share/nginx/html nginx:latest

创建存放目录并编辑docker-compose.yml文件

mkdir nginx

cd nginx/

vim docker-compose.yml

添加:

version: '3.2'

services:

  nginx:

    restart: always

    image: nginx:latest

    container_name: web-nginx

    ports:

      - 80:80

    volumes:

      - /webserver:/usr/share/nginx/html

启动容器

docker-compose up -d

停止容器

docker-compose stop

四、使用docker-compose控制容器运行

1、启动容器

docker-compose up

在执行命令的当前目录下,需要有一个docker-compose.yml的配置文件

2、后台启动容器

docker-compose up -d

3、停止容器

docker-compose stop

4、重启容器

docker-compose restart

常用命令:

docker-compose --help     ——帮助信息

docker-compose build   ——用来创建或重新创建服务使用的镜像

docker-compose kill nginx  ——用于通过容器发送SIGKILL信号强行停止服务

docker-compose logs    ——显示service的日志信息

docker-compose pause ——暂停服务

docker-compose unpause   ——恢复被暂停的服务

docker-compose port nginx 80 ——用于查看服务中的端口与物理机的映射关系

docker-compose ps ——用于显示当前项目下的容器

注意:此命令与docker ps不同作用,此命令会显示停止后的容器(状态为 Exited),只针对某个项目。

docker-compose pull     ——用于拉取服务依赖的镜像

docker-compose rm      ——删除停止的服务(服务里的容器)

-f    #强制删除

-v    #删除与容器相关的卷(volumes)

docker-compose run nginx ls /      ——用于在服务中运行一个一次性的命令

这个命令会新建一个容器,它的配置和srvice的配置相同。但两者之间还是有两点不同之处

1、run指定的命令会直接覆盖掉service配置中指定的命令

2、run命令启动的容器不会创建在service配置中指定的端口,如果需要指定使用--service-ports指定

docker-compose scale nginx=2(老版本docker-compose)      ——指定某个服务启动的容器个数

如果需要运行多个容器,那么容器名称就不要给了,会随机生成,还 有注意端口映射问题,不要冲突(docker-compose    port  字段支持仅写 一个容器暴露的端口)。

docker-compose 运行时是需要指定service名称,可以同时指定多个,也可以不指定。不指定时默认就是对配置文件中所有的service执行命令。

-f    #用于指定配置文件

-p    #用于指定项目名称

docker-compose -p myproject up -d nginx

docker-compose -p myproject ps

五、利用docker-compose.yml搭建wordpress博客系统

1、编辑docker-compose.yml文件

创建一个目录并编辑docker-compose.yml文件

mkdir wordpress

cd wordpress/

vim docker-compose.yml

添加:

version: '3.2'

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:

      - "80:80"

    restart: always

    environment:

      WORDPRESS_DB_HOST: db:3306

      WORDPRESS_DB_USER: wordpress

      WORDPRESS_DB_PASSWORD: wordpress

      WORDPRESS_DB_NAME: wordpress

volumes:

  db_data:

注:

volumes:      #声明上面自动数据卷

db_data:     #声明数据卷名,自动创建卷名

此案例种数据卷位置:/var/lib/docker/volumes/wordpress_db_data/_data/

如果没有对应的mysql和wordpress镜像,docker会自动从公有仓库下载

2、运行容器

docker-compose up -d

3、使用浏览器访问

192.168.10.11

六、docker-compose.yml中添加应用网络

yaml文件中指定使用已有网络

1、创建自定义网络

docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 net_test

2、创建一个目录并编辑docker-compose.yml文件

将如下命令编辑为yml文件执行:

docker run --name nginx --restart=always -p 90:80 --net net_test --ip 172.22.16.8 nginx

mkdir nginx2

cd nginx2/

vim docker-compose.yml

添加:

version: '3.8'

services:

  nginx:

    container_name: nginx

    image: nginx

    restart: always

    ports:

      - 90:80

    networks:

      net_test:

        ipv4_address: 172.22.16.8

networks:

  net_test:

    external: true

注:external该部分表示使用外部网络net_test,外部为true,容器内部创建写false。

3、启动容器

docker-compose up -d

4、使用浏览器访问

192.168.10.11:90

七、实验内容

1、将运行nginx服务的命令改成docker-compose.yml文件

docker run -d -p 80:80 --name web-nginx --restart=always -v /webserver:/usr/share/nginx/html nginx:latest

创建docker-compose.yml文件

添加:

version: '3.2'

services:

  nginx:

    restart: always

    image: nginx:latest

    container_name: web-nginx

    ports:

      - 80:80

    volumes:

      - /webserver:/usr/share/nginx/html

2、将运行tomcat服务的命令改成docker-compose.yml文件

自定义网络net_test

docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 net_test

docker run --name tomcat1  \

 --restart=always \

-p 8080:8080  \

-v /opt/tomcat-server:/usr/local/tomcat/webapps/ROOT \

--net net_test --ip 172.22.16.9 \

-d  \

tomcat:9.0

创建docker-compose.yml文件

添加:

version: '3.8'

services:

  tomcat:

    image: tomcat:9.0

    container_name: tomcat1

    restart: always

    ports:

      - "8080:8080"

    volumes:

      - /opt/tomcat-server:/usr/local/tomcat/webapps/ROOT

    networks:

      net_test:

        ipv4_address: 172.22.16.9

networks:

  net_test:

    external: true

docker-compose up -d

编辑网页

echo "tomcat is running" > /opt/tomcat-server/index.html

使用浏览器访问

3、将运行mysql服务的命令改成docker-compose.yml文件

docker run -p 3306:3306 \

 --name mysql \

 -v /opt/mysql/log:/var/log/mysql \

 -v /opt/mysql/data:/var/lib/mysql \

 -v /opt/mysql/conf:/etc/mysql/conf.d \

 -e MYSQL_ROOT_PASSWORD=root \

 -d \

 mysql:5.7

创建docker-compose.yml文件

version: '3.2'

services:

  mysql:

    image: mysql:5.7

    container_name: mysql

    ports:

      - "3306:3306"

    volumes:

      - /opt/mysql/log:/var/log/mysql

      - /opt/mysql/data:/var/lib/mysql

      - /opt/mysql/conf:/etc/mysql/conf.d

    environment:

      MYSQL_ROOT_PASSWORD: root

登录容器验证

docker exec -it mysql /bin/bash

mysql -uroot -proot

docker-compose 搭建的lamp+redis 代码 附上docker-compose # 标准配置文件应该包含 version、services、networks 三大部分, # 其中最关键的就是 services 和 networks 两个部分,下面先来看 services 的书写规则 # 指定版本号 version: '2' services: # 在 services 标签下的第二级标签是 console,这个名字是用户自己自定义,它就是服务名称。 console: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: console # 容器内置名称 hostname: console # 指明路径 build: # context 指定绝对路径或者相对路径 context: ./images/console # dockerfile 指定 Dockerfile 的文件名称 dockerfile: Dockerfile # volumes_from 从其它容器或者服务挂载数据卷, # 可选的参数是 :ro 或 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的(默认情况为可读可写的)。 volumes_from: - php # 挂载一个目录或者一个已存在的数据卷容器,可以直接使用 HOST:CONTAINER 这样的格式 # ,或者使用 HOST:CONTAINER:ro 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统 volumes: # 使用绝对路径挂载数据卷 - /root/.ssh/:/root/.ssh/ # 类似于使用 docker run 的效果 我也不知道 不写因为console并不是直接启动导致镜像不会产生 tty: true # web,这个名字是用户自己自定义,它就是服务名称。 web: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: web # 容器内置名称 hostname: web # 指明路径 build: # context 指定绝对路径或者相对路径 context: ./images/nginx # dockerfile 指定 Dockerfile 的文件名称 dockerfile: Dockerfile # 映射端口 ports: - '80:80' # 此选项解决了启动顺序的问题 这个的意思是必须在php启动以后才能启动 # 注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时, # 也会启动 php 服务,因为在配置文件中定义了依赖关系 depends_on: - php # volumes_from 从其它容器或者服务挂载数据卷, volumes_from: - php volumes: # 已经存在的命名的数据卷 - nginx-log:/var/log/nginx # 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器 - ./images/nginx/sites-enabled:/etc/nginx/sites-enabled - ./images/nginx/cert:/etc/nginx/cert # 加入指定网络 networks: default: # 同一网络上的其他容器可以使用服务器名称或别名来连接到其他服务的容器 aliases: - web.sunchanghao.top - mid.sunchanghao.top - sevice.sunchanghao.top - admin.sunchanghao.top # php,这个名字是用户自己自定义,它就是服务名称。 php: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: php # 容器内置名称 hostname: php # 服务除了可以基于指定的镜像,还可以基于一份 Dockerfile, # 在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile # 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器 build: # context 选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的 url # 当提供的值是相对路径时,它被解析为相对于撰写文件的路径,此目录也是发送到 Docker 守护进程的 context context: ./images/php # 使用此 dockerfile 文件来构建,必须指定构建路径 dockerfile: Dockerfile # 挂载一个目录或者一个已存在的数据卷容器, volumes: # 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器- ./app:/mnt/app # db,这个名字是用户自己自定义,它就是服务名称。 db: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: db # 容器内置名称 hostname: db # 从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 ID image: mysql:5.7 environment: MYSQL_USER: 'sch' MYSQL_PASS: '1111' MYSQL_ROOT_PASSWORD: 'root' volumes: - db:/var/lib/mysql ports: - '3306:3306' redis: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: redis # 容器内置名称 hostname: redis # image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。 image: redis:3.2.7 # 设置端口号 ports: - '6379:6379' # 挂载一个目录或者一个已存在的数据卷容器 volumes: # 已经存在的命名的数据卷。 - redis:/data # node volumes: nginx-log: # 设置volume的驱动,默认是local. driver: local db: driver: local redis: driver: local
`docker-compose`是一个用于管理应用及其依赖环境的强大工具。它允许开发者通过单个YAML文件配置应用程序的所有服务、网络和卷,并使用一个命令启动整个应用环境。以下是关于`docker-compose`的一些基本概述: ### `docker-compose`的主要用途 1. **简化部署**:通过将所有服务、依赖项和配置信息组织在一个地方,`docker-compose`使得应用的部署过程变得简单而统一。 2. **跨平台一致性**:无论您是在本地开发环境中还是在生产服务器上运行应用,`docker-compose`都能提供一致的体验。 3. **便于维护**:对于有多个微服务的应用程序,`docker-compose`帮助保持各个组件之间的相互依赖性和配置的一致性。 4. **快速迭代**:支持快速测试和修改服务配置,无需每次都重启容器。 5. **集成自动化**:可以轻松地将构建、测试、部署等步骤整合到CI/CD流程中。 ### 使用示例 假设有一个简单的Web应用,包含前端(React)和服务端(Node.js)。我们可以创建两个Dockerfile分别构建这两个服务,并编写一个`docker-compose.yml`文件来定义它们以及它们之间的连接。 ```yaml version: '3' services: web: build: . ports: - "8080:80" depends_on: - db db: image: postgres:latest ``` 在这个例子中,我们定义了两个服务:web和服务端数据库。`web`服务使用当前目录下的Dockerfile进行构建,并将其暴露在外部主机的8080端口上。同时,它依赖于名为`db`的服务。这意味着在启动web服务之前,数据库服务会先启动并准备就绪。 ### 安装和运行 通常,您需要安装`docker`和`docker-compose`。然后,只需在包含`docker-compose.yml`文件的项目根目录下执行以下命令即可启动应用: ``` docker-compose up ``` 这个命令将会根据`docker-compose.yml`文件的内容启动所有指定的服务,并自动处理依赖关系。当所有的服务都已准备好时,终端将显示一条确认消息。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值