一、DockerCompose是什么?
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。使用前面介绍的Dockerfile我们很容易定义一个单独的应用容器。然而在日常开发工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器;再比如在分布式应用一般包含若干个服务,每个服务一般都会部署多个实例。如果每个服务都要手动启停,那么效率之低、维护量之大可想而知。这时候就需要一个工具能够管理一组相关联的的应用容器,这就是Docker Compose。
compose有两个重要的概念:
1、项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。
2、服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
docker compose运行目录下的所有yml文件组成一个工程,一个工程包含多个服务,每个服务中 定义了容器运行的镜像、参数、依赖。一个服务可包括多个容器实例。docker-compose就是docker容器的编排工具,主要就是解决相互有依赖关系的多个容器的管理。
二、安装docker-compose
1、从GitHub下载docker-compose二进制文件
官方文档地址:Install Docker Compose | Docker Documentation
bash
https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64
添加可执行权限
bash
[root@offline-client bin]# mv docker-compose-linux-x86_64 docker-compose
[root@offline-client bin]# docker-compose version

2、pip安装dockercompose
如果没有pip需要先安装pip
bash
apt install python3-pip

bash
pip install docker-compose


三、docker compose常用命令

1、Docker Compose命令格式
docker compose [-f <arg>...] [options] [COMMAND] [ARGS...]
命令选项如下:
-f,--file FILE指定Compose模板文件,默认为docker-compose.yml,可以多次指定。
-p,--project-name NAME指定项目名称,默认将使用所在目录名称作为项目名。
-x-network-driver 使用Docker的可拔插网络后端特性(需要Docker 1.9+版本)
-x-network-driver DRIVER指定网络后端的驱动,默认为bridge(需要Docker 1.9+版本)
-verbose输出更多调试信息
-v,--version打印版本并退出
2、docker compose up
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
选项包括:
-d 在后台运行服务容器
--no-color 不使用颜色来区分不同的服务的控制输出
--no-deps 不启动服务所链接的容器
--force-recreate 强制重新创建容器,不能与--no-recreate同时使用
--no-recreate 如果容器已经存在,则不重新创建,不能与--force-recreate同时使用
--no-build 不自动构建缺失的服务镜像
--build 在启动容器前构建服务镜像
--abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
-t, --timeout TIMEOUT 停止容器时候的超时(默认为10秒)
--remove-orphans 删除服务中没有在compose文件中定义的容器
--scale SERVICE=NUM 设置服务运行容器的个数,将覆盖在compose中通过scale指定的参数
docker-compose up 启动所有服务
docker-compose up -d 在后台所有启动服务 -f 指定使用的Compose模板文件,默认docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d
3、docker compose ps
docker-compose ps [options] [SERVICE...]
docker-compose ps
列出项目中目前的所有容器
4、docker compose stop
docker-compose stop [options] [SERVICE...]
选项包括:
-t, --timeout TIMEOUT 停止容器时候的超时(默认为10秒)
docker-compose stop
停止正在运行的容器,可以通过docker-compose start 再次启动
5、docker compose -h
docker-compose -h
查看帮助
6、docker compose down
docker-compose down [options]
停止和删除容器、网络、卷、镜像。
选项包括:
--rmi type,删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像
-v, --volumes,删除已经在compose文件中定义的和匿名的附在容器上的数据卷
--remove-orphans,删除服务中没有在compose中定义的容器
docker-compose down 停用移除所有容器以及网络相关
7、docker compose logs
docker-compose logs [options] [SERVICE...]
查看服务容器的输出。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过--no-color来关闭颜色。
docker-compose logs 查看服务容器的输出
8、docker compose build
docker-compose build [options] [--build-arg key=val...] [SERVICE...]
构建(重新构建)项目中的服务容器。
选项包括:
--compress 通过gzip压缩构建上下环境
--force-rm 删除构建过程中的临时容器
--no-cache 构建镜像过程中不使用缓存
--pull 始终尝试通过拉取操作来获取更新版本的镜像
-m, --memory MEM为构建的容器设置内存大小
--build-arg key=val为服务设置build-time变量
服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新构建服务
9、docker compose pull
docker-compose pull [options] [SERVICE...]
拉取服务依赖的镜像。
选项包括:
--ignore-pull-failures,忽略拉取镜像过程中的错误
--parallel,多个镜像同时拉取
--quiet,拉取镜像过程中不打印进度信息
docker-compose pull 拉取服务依赖的镜像
10、docker compose restart
docker-compose restart [options] [SERVICE...]
重启项目中的服务。
选项包括:
-t, --timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒)
docker-compose restart 重启项目中的服务
11、docker compose rm
docker-compose rm [options] [SERVICE...]
删除所有(停止状态的)服务容器。
选项包括:
--f, --force,强制直接删除,包括非停止状态的容器
-v,删除容器所挂载的数据卷
docker-compose rm 删除所有(停止状态的)服务容器。推荐先执行docker-compose stop命令来停止容器。
12、docker compose start
docker-compose start [SERVICE...]
docker-compose start 启动已经存在的服务容器。
13、docker compose run
docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服务上执行一个命令。
docker-compose run ubuntu ping www.baidu.com 在指定容器上执行一个ping命令。
14、docker compose scale
docker-compose scale web=3 db=2设置指定服务运行的容器个数。通过service=num的参数来设置数量
15、docker compose pause
**docker-compose pause [SERVICE...]**暂停一个服务容器
16、docker compose kill
docker-compose kill [options] [SERVICE...]
通过发送SIGKILL信号来强制停止服务容器。
支持通过-s参数来指定发送的信号,例如通过如下指令发送SIGINT信号:
docker-compose kill -s SIGINT
17、dokcer compose config
docker-compose config [options]
验证并查看compose文件配置。
选项包括:
--resolve-image-digests 将镜像标签标记为摘要
-q, --quiet 只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
--services 打印服务名,一行一个
--volumes 打印数据卷名,一行一个
18、docker compose create
docker-compose create [options] [SERVICE...]
为服务创建容器。
选项包括:
--force-recreate:重新创建容器,即使配置和镜像没有改变,不兼容--no-recreate参数
--no-recreate:如果容器已经存在,不需要重新创建,不兼容--force-recreate参数
--no-build:不创建镜像,即使缺失
--build:创建容器前,生成镜像
19、docker compose exec
docker-compose exec [options] SERVICE COMMAND [ARGS...]
选项包括:
-d 分离模式,后台运行命令。
--privileged 获取特权。
--user USER 指定运行的用户。
-T 禁用分配TTY,默认docker-compose exec分配TTY。
--index=index,当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务,例如:docker-compose exec --index=1 web /bin/bash ,web服务中包含多个容器
20、docker compose port
docker-compose port [options] SERVICE PRIVATE_PORT
显示某个容器端口所映射的公共端口。
选项包括:
--protocol=proto,指定端口协议,TCP(默认值)或者UDP
--index=index,如果同意服务存在多个容器,指定命令对象容器的序号(默认为1)
21、docker compose push
docker-compose push [options] [SERVICE...]
推送服务依的镜像。
选项包括:
--ignore-push-failures 忽略推送镜像过程中的错误
22、docker compose stop
**docker-compose stop [options] [SERVICE...]**显示各个容器运行的进程情况。
23、docker compose unpause
**docker-compose unpause [SERVICE...]**恢复处于暂停状态中的服务。
24、docker compose version
docker-compose version 打印版本信息。
四、docker compose模板文件
1、docker composes模板简介
Compose允许用户通过一个docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的docker-compose.yml,可以使用.yml或.yaml作为文件扩展名。
Docker-Compose标准模板文件应该包含version、services、networks 三大部分,最关键的是services和networks两个部分。
bash
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- hm-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- hmall
networks:
- hm-net
networks:
hm-net:
name: hmall
2、image
image是指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。
3、build
服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up启动时执行构建任务,构建标签是build,可以指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器。
bash
build: /path/to/build/dir
也可以是相对路径,只要上下文确定就可以读取到Dockerfile。
bash
build: ./dir
设定上下文根目录,然后以该目录为准指定Dockerfile。
bash
build:
context: ../
dockerfile: path/of/Dockerfile
build都是一个目录,如果要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定。
如果同时指定image和build两个标签,那么Compose会构建镜像并且把镜像命名为image值指定的名字。
4、context
context选项可以是dockerfile的文件路径,也可以是到链接到git仓库的url,当提供的值是相对路劲时,被解析为相对于撰写文件的路径,此目录也是发送到docker守护进程 的context。
bash
build:
context: ./dir
5、dockerfile
使用dockerfile文件来构建必须指定构建的路径。
bash
build:
context: .
dockerfile: Dockerfile-alternate
dockerfile指令不能跟image同时使用,否则Compose将不确定根据哪个指令来生成最终的服务镜像。
6、command
使用command可以覆盖容器启动后默认执行的命令。
bash
command: bundle exec thin -p 3000
7、container_name
compose的容器名称格式是:<项目名><服务名称><序号>
可以自定义项目名称、服务名称,但如果想完全控制容器的命名,可以使用标签指定:
bash
container_name: app
8、depends_on
在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。
bash
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
上述YAML文件定义的容器会先启动redis和db两个服务,最后才启动web 服务。
9、pid
bash
pid: "host"
将PID模式设置为主机PID模式,跟主机系统共享进程命名空间。容器使用pid标签将能够访问和操纵其他容器和宿主机的名称空间。
10、ports
ports用于映射端口的标签。
使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。
bash
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
当使用HOST:CONTAINER格式来映射端口时,如果使用的容器端口小于60可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制# development.yml。所以建议采用字符串格式。
11、extra_hosts
添加主机名的标签,会在/etc/hosts文件中添加一些记录。
bash
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
启动后查看容器内部hosts:
162.242.195.82 somehost
50.31.209.229 otherhost
12、volumes
挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOST:CONTAINER:ro]格式,后者对于容器来说,数据卷是只读的,可以有效保护宿主机的文件系统。
Compose的数据卷指定路径可以是相对路径,使用 . 或者 ... 来指定相对目录。
数据卷的格式可以是下面多种形式:
bash
volumes:
// 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
- /var/lib/mysql
// 使用绝对路径挂载数据卷
- /opt/data:/var/lib/mysql
// 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
- ./cache:/tmp/cache
// 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
- ~/configs:/etc/configs/:ro
// 已经存在的命名的数据卷。
- datavolume:/var/lib/mysql
// 如果不使用宿主机的路径,可以指定一个volume_driver。
- volume_driver: mydriver
13、volumes_from
从 另一个服务或容器挂载其数据卷
bash
volumes_from:
- service_name
- container_name
14、dns
自定义DNS服务器。可以是一个值,也可以是一个列表。
bash
dns:8.8.8.8
dns:# development.yml
- 8.8.8.8
- 9.9.9.9
15、dns_search
配置DNS搜索域。可以是一个值,也可以是一个列表。
bash
dns_search:example.com
dns_search:
- domain1.example.com
- domain2.example.com
16、entrypoint
在Dockerfile中有一个指令叫做ENTRYPOINT指令,用于指定接入点。
在docker-compose.yml中可以定义接入点,覆盖Dockerfile中的定义:
bash
entrypoint: /code/entrypoint.sh
17、env_file
在docker-compose.yml中可以定义一个专门存放变量的文件。
如果通过docker-compose -f FILE指定配置文件,则env_file中路径会使用配置文件路径。
如果有变量名称与environment指令冲突,则以后者为准。格式如下:
env_file: .env 或者根据docker-compose.yml设置多个:
bash
env_file:
- ./common.env
- ./apps/web.env
- ./opt/secrets.env
如果在配置文件中有build操作,变量并不会进入构建过程中。
18、cap_add
增加指定容器的内核能力(capacity)。
让容器具有所有能力可以指定:
bash
cap_add:
- ALL
19、cap_drop
去掉指定容器的内核能力(capacity)。
去掉NET_ADMIN能力可以指定:
bash
cap_drop:
- NET_ADMIN
20、cgroup_parent
创建了一个cgroup组名称为cgroups_1:
bash
cgroup_parent: cgroups_1
21、devices
指定设备映射关系,例如:
bash
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"
22、expose
暴露端口,但不映射到宿主机,只允许能被连接的服务访问。仅可以指定内部端口为参数,如下所示:
bash
expose:
- "3000"
- "8000"
23、extends
基于其它模板文件进行扩展。例如,对于webapp服务定义了一个基础模板文件为common.yml:
bash
webapp:
build: ./webapp
environment:
- DEBUG=false
- SEND_EMAILS=false
再编写一个新的development.yml文件,使用common.yml中的webapp服务进行扩展:
bash
web:
extends:
file: common.yml
service: webapp
ports:
- "8000:8000"
links:
- db
environment:
- DEBUG=true
db:
image: mysql
后者会自动继承common.yml中的webapp服务及环境变量定义。
extends限制如下:
A、要避免出现循环依赖
B、extends不会继承links和volumes_from中定义的容器和数据卷资源
推荐在基础模板中只定义一些可以共享的镜像和环境变量,在扩展模板中具体指定应用变量、链接、数据卷等信息
24、external_links
链接到docker-compose.yml外部的容器,可以是非Compose管理的外部容器。
bash
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
25、labels
为容器添加Docker元数据(metadata)信息。例如,可以为容器添加辅助说明信息:
bash
labels:
com.startupteam.description: "webapp for a strtup team"
26、links
链接到其它服务中的容器。使用服务名称(同时作为别名),或者"服务名称:服务别名"(如 SERVICE:ALIAS),例如:
bash
links:
- db
- db:database
- redis
使用别名将会自动在服务容器中的/etc/hosts里创建。例如:
bash
172.17.2.186 db
172.17.2.186 database
172.17.2.187 redis
27、log_driver
指定日志驱动类型。目前支持三种日志驱动类型:
bash
log_driver: "json-file"
log_driver: "syslog"
log_driver: "none"
28、log_opt
日志驱动的相关参数。例如:
bash
log_driver: "syslog"log_opt:
syslog-address: "tcp://192.168.0.42:123"
29、net
设置网络模式。
bash
net: "bridge"
net: "none"
net: "host"
30、security_opt
指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等)。例如,配置标签的用户名和角色名:
bash
security_opt:
- label:user:USER
- label:role:ROLE
31、环境变量
环境变量可以用来配置Docker-Compose的行为。
COMPOSE_PROJECT_NAME
设置通过Compose启动的每一个容器前添加的项目名称,默认是当前工作目录的名字。
COMPOSE_FILE
设置docker-compose.yml模板文件的路径。默认路径是当前工作目录。
DOCKER_HOST
设置Docker daemon的地址。默认使用unix:///var/run/docker.sock。 DOCKER_TLS_VERIFY
如果设置不为空,则与Docker daemon交互通过TLS进行。
DOCKER_CERT_PATH
配置TLS通信所需要的验证(ca.pem、cert.pem 和 key.pem)文件的路径,默认是 ~/.docker 。
五、docker实战,前后端(nginx+springboot+nginx)
1、使用docker执行hello-world
docker pull hello-world 拉取hello-world镜像
docker images 查看下镜像
docker container run hello-world 运行镜像
docker run hello-world 创建并运行镜像


2、拉取mysql镜像
1、docker pull mysql

2、删除mysql镜像,下载指定版本的镜像
docker rmi mysql
删除容器 docker rm -f mysql(容器名)


链接: https://pan.baidu.com/s/1PGoInL5rPkP6vAejSgxtXQ 提取码: 9fiw
3、准备mysql的相关数据到 /root/mysql 文件夹下

4、创建并运行mysql容器,挂载本地目录。
bash
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v ./mysql/data:/var/lib/mysql \
-v ./mysql/conf:/etc/mysql/conf.d \
-v ./mysql/init:/docker-entrypoint-initdb.d \
mysql
启动容器成功后使用命令进入容器:
docker exec -it mysql mysql -uroot -p123

使用工具DBeaver连接MySQL时报错:Public Key Retrieval is not allowed



连接成功!
3、拉取nginx镜像

3.1 直接访问虚拟机地址确认nginx启动好了。

3.2 进入nginx容器
docker exec -it nginx bash

3.3、docker数据卷--nginx资源映射
容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题:
如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?
MySQL、Nginx容器运行后,如果我要修改其中的某些配置该怎么办?
我想要让Nginx代理我的静态资源怎么办?
因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦。


如果我们想要修改nginx镜像里面的html的内容,这时就可以使用数据卷挂载在宿主机上即可。
1)使用命令:exit 退出容器。
2)删除原来的nginx容器,重新创建并指定数据卷


docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
查看数据卷和当前html映射的地址。
小提示:
/var/lib/docker/volumes
这个目录就是默认的存放所有容器数据卷的目录,其下再根据数据卷名称创建新目录,格式为/数据卷名/_data
。
进入挂载的路径,修改index文件,然后 重新刷新主机界面 ,更新成功!

删除nginx容器,删除html数据卷。

我有个构想,创建容器指定数据卷的同时为啥不能指定宿主机的绝对路径?

实际操作看起来是不可以的!!!
为什么不让容器目录直接指向宿主机目录呢?
因为直接指向宿主机目录就与宿主机强耦合了,如果切换了环境,宿主机目录就可能发生改变了。由于容器一旦创建,目录挂载就无法修改,这样容器就无法正常工作了。
但是容器指向数据卷,一个逻辑名称,而数据卷再指向宿主机目录,就不存在强耦合。如果宿主机目录发生改变,只要改变数据卷与宿主机目录之间的映射关系即可。
同理上传图片到该文件路径下,直接访问图片也是ok的(使用工具 MobaXterm_Personal_23.6)
4、制作镜像hello-world
链接: https://pan.baidu.com/s/1bHVb7jx0KRQHr9YV4btnAA 提取码: 8pgv
4.1、下载dockerfile和java的jar


制作镜像!
4.2、docker build -t docker-demo .
命令说明:
docker build : 就是构建一个docker镜像
-t docker-demo:1.0 :-t参数是指定镜像的名称(repository和tag)
. : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录
4.3、查看构建的镜像 docker images

4.4、运行镜像
docker run -d --name docker-demo -p 8080:8080 docker-demo 创建并运行容器
docker logs -f docker-demo 查看启动日志
访问地址查看项目运行成功!
http://192.168.32.16:8080/hello/count

5、docker网络


如果使用默认的网桥,mysql第一次是172.168.0.2 如果下次后启动该ip可能被其他容器占用,所以需要自定义网桥。
容器名不变,根据容器名访问,ip变了无关紧要。
5.1 创建网络
docker network create heima 创建网络heima
docker network ls查看网络
5.2 将容器加入到网络中
docker network connect heima mysql 将容器mysql连接到网络heima
docker inspect mysql 查看网络情况

5.3 创建容器加入到指定网络中
docker run -d --name dd2 -p 8080:8080 --network heima docker-demo 创建容器dd加入网络heima中

没有注意细看,启动dd2容器失败了,由于端口被占用了!!!
docker inspect dd2 进入容器dd2查看详情

docker exec -it dd2 bash 进入容器内部,ping mysql 可以拼通,因为这两个容器都在heima网络里面。ping nginx不通,不在同一个网络里面。

docker inspect nginx 可以看到nginx在默认的bridge网络里面,如果将nginx加入heima网络就可以相互ping通了。

6、部署java项目
6.1、下载资料,https://pan.baidu.com/s/1bHVb7jx0KRQHr9YV4btnAA 提取码: 8pgv

6.2、构建镜像 docker build -t hmall . 末尾的.代表dockerfile在当前目录

6.3、运行容器加入heima网络
docker run -d --name hmall -p 8080:8080 --network heima hmall 创建hmall容器,指定heima网络,此后就可以访问mysql了,同一个网络heima

前面应用占用 了8080端口,先停止其他容器,然后启动hmall容器,最后查看启动日志 docker logs -f hmall 最后访问地址验证是否部署成功!
http://192.168.32.16:8080/search/list?pageNo=1&pageSize=5
7、部署前端项目
7. 1、官网查看nginx.conf的 挂载命令

7.2、准备前端项目 https://pan.baidu.com/s/1bHVb7jx0KRQHr9YV4btnAA 提取码: 8pgv 将资料放入对应的文件夹如图


7.3 创建并运行容器
由于前面创建过容器nginx,先删除再创建
docker stop 容器id 如下图
docker rm -f nginx

运行新的nginx容器:
docker run -d --name nginx -p 18080:18080 -p 18081:18081 -v /root/nginx/html:/usr/share/nginx/html -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf --network heima nginx
验证是否启动成功



界面点击发现 数据会有变化,说明前后端+数据库联动部署成功了!!!
8、总结
先部署mysql,再部署springboot后端,然后再部署前端,并且都需要加入到 一个网络里面,从上面得知,过程之繁琐,如果服务再多一点,任务量直接翻倍,所以此时我们的主角docker-compose闪亮登场了!!!!!
六、使用docker-compose实战,部署上面的项目

1、对比docker run命令和docker-compose.yml

2、dockerCompose的命令格式

3、部署项目
3.1、前面我们是先部署mysql到网络heima(前面创建的网络),然后部署service到网络heima,最后是前端项目也加入到网络heima
现在可以使用dockercompose 一键部署,需要注意的就是编写dockercompose.yml文件
上面项目对应的docker-compose.yml
bash
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- hm-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- hmall
networks:
- hm-net
networks:
hm-net:
name: hmall
3.2 项目内容安装图里的结构放置,不然需要修改一些路径,按照前面的步骤操作,这里无需额外的操作了,文件和前面单个部署的文件一样,注意路径

3.3、部署操作
安装前删除所有的容器(相同的)

3.4、docker-compose部署项目
docker compose up -d 一键部署

验证是否成功,http://192.168.32.16:18080/search.html 验证成功,项目部署成功!!!

总结:使用docker-compose 部署多个项目很方便快捷,我们只需要关注,docker-compose.yml文件的编写,和相关项目的 准备即可,相比第五章的单个部署,效率直接提高!!!