Docker-Compose使用案例

1. Docker-Compose简介

Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。

Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。

2. Docker-Compose使用命令

创建并启动容器

docker-compose up -d # 创建并启动容器

查看当前compose进程

docker-compose ps # 查看当前compose进程

启动容器

docker-compose start # 启动容器

关闭容器

docker-compose stop  # 关闭容器

关闭并移除容器

docker-compose down   # 关闭并移除容器

3. Docker-Compose安装MySQL

3.1 目录结构

[root@long mysql-service]# tree
.
├── conf (存放配置文件)
│ |
│ └── my.conf (MySQL配置)
├── db (数据库文件)
│ ├──
|
├── docker-compose.yml (docker-compose文件)
└── init
└── init.sql (mysql初始化文件sql语句)

3.2 ​​my.cnf​​ 文件

[root@long conf]# cat my.cnf 
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

3.3 ​​init.sql​​文件

[root@long init]# cat init.sql 
use mysql;
# 为root用户授权
grant all privileges on *.* to 'root'@'%' identified by '123456';
# 刷新权限
flush privileges;
# 创建数据库
create database mytest;
use mytest;
# 创建表
create table user (
id int auto_increment primary key,
username varchar(64) unique not null,
email varchar(120) unique not null,
password_hash varchar(128) not null,
avatar varchar(128) not null;
)
# 插入表数据
insert into user values(1, "zhangsan", "zhangsan123@qq.com", "password", "avaterpath");

3.4 ​​Docker-Compose.yaml​​文件

[root@long mysql-service]# cat docker-compose.yml 
version: '3' # 使用Docker-Compose版本
services:
mysql:
image: mysql:5.7 # 使用mysql:5.7镜像
restart: always
container_name: mysql_db # mysql最后的容器名
environment:
MYSQL_ROOT_PASSWORD: 123456 # 设置root用户的密码
MYSQL_USER: test # 设置另一个用户 test
MYSQL_PASS: test # 设置test用户的密码
networks:
extnetwork:
ipv4_address: 175.20.0.4 # 分配ip地址
volumes: # 将自己顶一个数据和配置文件映射到mysql容器对应的文件
- './db:/var/lib/mysql'
- './conf/my.cnf:/etc/my.cnf'
- './init:/docker-entrypoint-initdb.d/'
ports:
- '6606:3306' # 将3306端口映射到主机的6606
networks: # 定义网络地址
extnetwork:
ipam:
config:
- subnet: 175.20.0.0/16

3.5 启动容器

docker-compose up -d

3.6 注意点

​mysql​​​容器的IP地址是可以不配置的,但是每次启动的时候​​ip​​地址都会变化。所以最好配置成静态的。

​docker​​会在系统中生成一个虚拟的网卡。

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:caff:fe3f:93db prefixlen 64 scopeid 0x20<link>
ether 02:42:ca:3f:93:db txqueuelen 0 (Ethernet)
RX packets 82535 bytes 3383930 (3.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 122388 bytes 384976398 (367.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

如果我们对外访问的时候直接访问主机的IP地址加上端口号6606就可以。

4. 实例

使用​​Docker-Compose​​​的搭建Java运行环境,​​MySQL+Redis+Jdk​​​运行​​Springboot​​​的​​Jar​​包。

​Docker-Compose.yaml​​文件

[root@long java-jar-web-project-docker]# cat docker-compose.yml 
version: '3' # Docker-Compose版本
services:
web:
build: # Jdk运行环境使用Dockerfile文件
context: ./web-service
dockerfile: Dockerfile
ports: # 端口映射 9999 -> 9999
- '9999:9999'
container_name: web_db # 容器名
volumes:
- './jar:/home/jar_home' # 映射路径, 将主机的 ./jar 路径映射到容器内的/home/jar_home
depends_on: # 执行顺序
- 'redis'
- 'mysql'
networks: # 绑定ip地址
extnetwork:
ipv4_address: 175.20.0.4
mysql: # mysql 同上
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_USER: test
MYSQL_PASS: test
image: mysql:5.7
networks:
extnetwork:
ipv4_address: 175.20.0.2
container_name: mysql_db
restart: always
volumes:
- './mysql-service/db:/var/lib/mysql'
- './mysql-service/conf/my.cnf:/etc/my.cnf'
- './mysql-service/init:/docker-entrypoint-initdb.d/'
ports:
- '6606:3306'
redis: # redis
restart: always
image: redis # redis镜像
container_name: redis_db # redis容器名字
command: redis-server --requirepass 123456 --appendonly yes # redis容器密码,开启持久化
networks: # 绑定ip地址
extnetwork:
ipv4_address: 175.20.0.3
ports: # 端口映射
- '6609:6379'
volumes: # 将本地 ./redis-service/db 映射到 容器中的 /data 目录
- './redis-service/db:/data'
networks:
extnetwork:
ipam:
config:
- subnet: 175.20.0.0/16

​Dockerfile​​文件

[root@long web-service]# cat Dockerfile 
FROM centos:7
RUN yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y # 安装jdk1.8
ENV JAVA_HOME /usr/lib/jvm/java # 设置变量
RUN echo "export JAVA_HOME=$JAVA_HOME" >> /etc/profile
ENV PATH $JAVA_HOME/bin:$PATH
RUN echo "export PATH=$PATH" >> /etc/profile # 设置环境变量
VOLUME /home/jar_home # 挂载数据卷
EXPOSE 9999 # 映射端口
CMD sleep 10s && cd /home/jar_home && java -jar sso-client-server-1.0.0.jar >> sso.log && tail -f /dev/null # 启动容器的时候执行的命令

5. 实例的码云地址:

​https://gitee.com/molonglove/docker_compose_java.git​