概念
之前运行一个镜像,需要添加大量的参数,可以通过Docker-Compose编写这些参数。而且Docker-Compose可以帮助我们批量的管理容器。这些信息只需要通过一个docker-compose.yml文件去维护即可。
安装
这个地址比较慢可以使用下面这个下载
# 下载
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 是否安装
docker-compose --version
可能出现权限不足,解决如下
[root@base bin]# docker-compose --version
-bash: /usr/local/bin/docker-compose: 权限不够
# chmod +x 的意思就是给执行权限
[root@base bin]# chmod +x /usr/local/bin/docker-compose
[root@base bin]# docker-compose --version
docker-compose version 1.24.0, build 0aa59064
#chmod +x 颜色就是普通文本的颜色,+x 之后颜色就是绿色的了。chmod -x 就是普通文本颜色,普通文本颜色是不能执行的,执行会报错;chmod +x 就是绿色的可执行文件了。
图解 chmod +x
用 docker-compose 编排第一个容器
[root@base bin]# mkdir -p /usr/local/docker/mysql_new
[root@base bin]# cd /usr/local/docker/mysql_new
# 编辑 docker-compose.yaml
[root@base mysql_new]# vi docker-compose.yaml
# 查看 docker-compose.yaml
[root@base mysql_new]# cat docker-compose.yaml
version: '3.1'
services:
new_mysql: # 服务的名称
restart: always # 代表只要docker启动,那么这个容器就跟着一起启动
image: mysql:5.7 # 指定镜像路径
container_name: new_mysql # 指定容器名称
ports:
- 3308:3306 # 指定端口号的映射
environment:
MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码
TZ: Asia/Shanghai # 指定时区
volumes:
- ./data:/var/lib/mysql # 映射数据卷
# 编排容器
[root@base mysql_new]# docker-compose up -d
Creating network "mysql_new_default" with the default driver
Creating new_mysql ... done
[root@base mysql_new]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d2db530fe0a3 mysql:5.7 "docker-entrypoint.s…" 14 seconds ago Up 12 seconds 33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp new_mysql
35074a683876 dockerfile:1.0 "java -jar my.jar" 48 minutes ago Up 48 minutes 0.0.0.0:7777->7777/tcp, :::7777->7777/tcp dockerfile-test
66d2797cdf06 mysql:5.7 "docker-entrypoint.s…" 21 hours ago Up 21 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp some-mysql
# 卸载编排的容器
[root@base mysql_new]# docker-compose down
Stopping new_mysql ... done
Removing new_mysql ... done
Removing network mysql_new_default
[root@base mysql_new]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
35074a683876 dockerfile:1.0 "java -jar my.jar" 49 minutes ago Up 49 minutes 0.0.0.0:7777->7777/tcp, :::7777->7777/tcp dockerfile-test
66d2797cdf06 mysql:5.7 "docker-entrypoint.s…" 21 hours ago Up 21 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp some-mysql
docker-compose.yaml 可以编排多个容器
linux下,MySQL默认的数据文档存储目录为/var/lib/mysql。
version: '3.1'
services:
mysql_linux: # 服务的名称
restart: always # 代表只要docker启动,那么这个容器就跟着一起启动
image: mysql:5.7 # 指定镜像路径
container_name: mysql_linux # 指定容器名称
ports:
- 3308:3306 # 指定端口号的映射
environment:
MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码
TZ: Asia/Shanghai # 指定时区
volumes:
- ./data:/var/lib/mysql # 映射数据卷
springcloud_user: # 服务的名称
restart: always # 代表只要docker启动,那么这个容器就跟着一起启动
image: myimage:1.0 # 指定镜像路径
container_name: springcloud_user # 指定容器名称
ports:
- 7001:7001 # 指定端口号的映射
environment:
profile: prod
TZ: Asia/Shanghai # 指定时区
springcloud_share: # 服务的名称
restart: always # 代表只要docker启动,那么这个容器就跟着一起启动
image: myimage:1.0 # 指定镜像路径
container_name: springcloud_share # 指定容器名称
ports:
- 7002:7002 # 指定端口号的映射
environment:
profile: prod
TZ: Asia/Shanghai # 指定时区
springcloud_right: # 服务的名称
restart: always # 代表只要docker启动,那么这个容器就跟着一起启动
image: myimage:1.0 # 指定镜像路径
container_name: springcloud_right # 指定容器名称
ports:
- 7003:7003 # 指定端口号的映射
environment:
profile: prod
TZ: Asia/Shanghai # 指定时区
其他docker-compose 命令
在使用docker-compose的命令时,默认会在当前目录下找docker-compose.yml文件
基于docker-compose.ym1启动管理的容器
docker-compose up -d
关闭并删除容器
docker-compose down
开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose start| stop | restart
查看由docker-compose管理的容器
docker-compose ps
查看日志
docker-compose logs -f
docker-compose 和 Dockerfile 连用
容器间的网络通信
准备一个项目
jar中没有主清单属性
解决链接:https://blog.csdn.net/weixin_56219549/article/details/122123158.
提交gitee
[root@base /]# mkdir -p /usr/project
[root@base /]# cd /usr/project
[root@base project]# git clone git@gitee.com:lht1999/dockercomposedemo.git
[root@base dockerfile]# cd dockercomposedemo/
[root@base dockerfile]# mvn clean package -Dmaven.test.skip=true
[root@base dockercomposedemo]# cp springcloud_user_6001/target/user.jar /usr/project/dockerfile/user.jar
[root@base dockercomposedemo]# cd /usr/project/dockerfile/
[root@base dockerfile]# ls
user.jar
[root@base dockerfile]# vim Dockerfile
[root@base dockerfile]# cat Dockerfile
FROM openjdk:8-jre
ENV HOME /home
run mkdir HOME
COPY ./user.jar HOME/user_image.jar
WORKDIR HOME
ENTRYPOINT ["java", "-jar", "user_image.jar"]
[root@base dockerfile]# docker build -t image:1.0 .
[root@base dockerfile]# vim docker-compose.yaml
[root@base dockerfile]# cat docker-compose.yaml
version: '3.1'
services:
mysql_linux: # 服务的名称
restart: always # 代表只要docker启动,那么这个容器就跟着一起启动
image: mysql:5.7 # 指定镜像路径
container_name: mysql_linux # 指定容器名称
ports:
- 3308:3306 # 指定端口号的映射
environment:
MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码
TZ: Asia/Shanghai # 指定时区
volumes:
- ./data:/var/lib/mysql # 映射数据卷
springcloud_user: # 服务的名称
restart: always # 代表只要docker启动,那么这个容器就跟着一起启动
image: image:1.0 # 指定镜像路径
container_name: springcloud_user # 指定容器名称
ports:
- 7001:6001 # 指定端口号的映射
environment:
profiles: prod
TZ: Asia/Shanghai # 指定时区
volumes:
- /logs:/logs # 创建容器数据卷
[root@base dockerfile]# docker-compose up -d
测试
[root@base dockerfile]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0458ea31025a mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp mysql_linux
84f2ff45b302 image:1.0 "java -jar user_imag…" 2 minutes ago Up 2 minutes 0.0.0.0:7001->6001/tcp, :::7001->6001/tcp springcloud_user
更改容器id后重新部署
部署注释ports
[root@base dockerfile]# cat docker-compose.yaml
version: '3.1'
services:
mysql_linux: # 服务的名称
restart: always # 代表只要docker启动,那么这个容器就跟着一起启动
image: mysql:5.7 # 指定镜像路径
container_name: mysql_linux # 指定容器名称
# ports:
# - 3308:3306 # 指定端口号的映射
environment:
MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码
TZ: Asia/Shanghai # 指定时区
volumes:
- ./data:/var/lib/mysql # 映射数据卷
springcloud_user: # 服务的名称
restart: always # 代表只要docker启动,那么这个容器就跟着一起启动
image: image:1.0 # 指定镜像路径
container_name: springcloud_user # 指定容器名称
ports:
- 7001:6001 # 指定端口号的映射
environment:
profiles: prod
TZ: Asia/Shanghai # 指定时区
volumes:
- /logs:/logs # 创建容器数据卷
测试结果依旧正常(但是数据库确连不上了)
怎样让不在同一个 docker-compose.yaml 中编排的容器 处于同一网络
首先删除所有容器和镜像
docker-compose down
重新编排多个容器都需要加上不同内容(举例如下)
# 创建网络名称
Creating network "mysql_default"
查看现在的网络
docker network list
为整个项目新建网络
docker network create my_network
让docker-compose.yaml 中的容器 处于同一网络
networks:
default:
external:
name: my_network