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", "[email protected]", "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 # 啓動容器的時候執行的命令