Docker之Docker-compose使用案例

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運行SpringbootJar包。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章