Docker-Compose模版,常用命令,学习笔记

Docker Compose

笔记来源与编程不良人的docker-compose教学 : https://www.bilibili.com/video/BV1wQ4y1Y7SE?p=30&vd_source=91fb39ddf3fc1f01afd5208696618e41

怕自己忘记, 记录此笔记.....

安装Docker-Compose

  • github下载地址: https://github.com/docker/compose/releases/tag/1.25.5
  • 下载 docker-compose-Linux-x86_64 放打/usr/local/bin
  • 改名为 docker-compose
  • 赋予权限 chmod +x docker-compose
  • 查看是否安装成功 docker-compose version

docker-compose模板

网上下的, 具体位置忘记了

多个服务

# Compose 版本 Version 2支持更多的指令。Version 1将来会被弃用。
version: "3"

# 定义服务
services:

  # 为project定义服务
  redis:
    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
    image: redis:4.0
    # 配置端口 - "宿主机端口:容器暴露端口"
    ports:
    - "6379:6379"
      # 配置容器连接的网络,引用顶级 networks 下的条目(就是最下面配置的networks(一级目录))
    networks:
      network_name:
          # 为单redis创建别名, REDIS_URL标记为redis服务的地址. (不配置aliases也可以, 这样就通过定义的服务名: redis链接)
        aliases:
         - REDIS_URL
    # 挂载
    volumes:
      - "/docker/redis/conf/redis.conf:/etc/redis/redis.conf"
      - "/docker/redis/data:/data"
    # 容器总是重新启动
    restart: always
    # 相当于执行一些命令
    command:
      redis-server /etc/redis/redis.conf --appendonly yes
    # 指定一个自定义容器名称,而不是生成的默认名称。
    container_name: redis
    # 使用该参数,container内的root拥有真正的root权限。
    privileged: true

  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    # 添加环境变量
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
    volumes:
      - "/docker/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf"
      - "/docker/mysql/logs:/var/log/mysql"
      - "/docker/mysql/data:/var/lib/mysql"
      - "/docker/mysql/sql/init.sql:/docker-entrypoint-initdb.d/init.sql"
      - "/etc/localtime:/etc/localtime"
    networks:
      network_name:
        aliases:
        - MYSQL_URL
    restart: always
    command: --init-file /docker-entrypoint-initdb.d/init.sql
    container_name: mysql
    privileged: true

  project-name:
    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
    image: project-name:1.0.0
    # 构建镜像
    build:
      # 指定项目的地址
      context: /root/docker_mysql_redis
      # 指定Dockerfile
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    # 从文件添加环境变量
    env_file:
      - /root/environment.env
    networks:
      network_name:
        aliases:
          - PROJECT_URL
    privileged: true
    restart: always
    container_name: test-name
# ........可以继续添加

networks:
  # bridge:默认,需要单独配置ports映射主机port和服务的port,并且开启了容器间通信
  network_name:
    driver: bridge

单个服务

version: "3"

services:

  nacos:
    image: nacos/nacos-server:1.2.1
    ports:
    - "8848:8848"
      # 加入已存在的网络 docker_network_mysql(docker-mysql.yaml), 并创建一个新的网络 network_nacos
    networks:
      network_nacos:
        aliases:
          - NACOS_URL
        # 通过docker network ls 进行获取
      docker_network_mysql:
    restart: always
    environment:
      MODE: standalone
    container_name: nacos
    privileged: true

networks:
  docker_network_mysql:
    external: true
  network_nacos:
    driver: bridge

实战

  • 编写docker-compose.yaml, 第一行的version根据docker版本填写对应版本
# 代表使用docker-compose项目的版本号
version: "3.8"

services:
  # 服务名 自定义的
  tomcat:
   # 镜像名
   images: tomcat:8.0
   ports:
    # 端口映射, 多个写多行
    - 8080:8080
  • 启动docker-compose服务
# 需要在docker-compose   .yaml目录下执行启动命令
docker-compose up
  • 再启动一个tomcat
# 代表使用docker-compose项目的版本号
version: "3.8"

services:
  # 服务名 自定义的
  tomcat:
   # 镜像名
   images: tomcat:8.0
   ports:
    # 端口映射, 多个写多行
    - 8080:8080
  tomcat02:
   image: tomcat:8.0
   ports:
    - 8081:8080
  • 添加一个redis服务
# 代表使用docker-compose项目的版本号
version: "3.8"

services:
  # 服务名 自定义的
  tomcat:
   # 镜像名
   images: tomcat:8.0
   ports:
    # 端口映射, 多个写多行
    - 8080:8080
  tomcat02:
   image: tomcat:8.0
   ports:
    - 8081:8080
  redis:
   image: redis:5.0.12
   ports:
    - 6379:6379
#   volumes:
   # 在配置文件挂载目录, 添加上redis.conf配置文件, 不然挂在出来会是个文件夹
#    - "/home/docker-compose/redis/conf/redis.conf:/etc/redis/redis.conf"
#    - "/home/docker-compose/redis/data:/data"
  • 再添加一个mysql
version: "3.8"
services:
  # 服务名 自定义的
  tomcat:
   # 镜像名
   images: tomcat:8.0
   ports:
    # 端口映射, 多个写多行
    - 8080:8080
  tomcat02:
   image: tomcat:8.0
   ports:
    - 8081:8080
  redis:
   image: redis:5.0.12
   ports:
    - 6379:6379
  mysql:
   image: mysql:8.0
   ports:
    - 3306:3306
   enviroment: 
    - "MYSQL_ROOT_PASSEORD=admin@123"
  • 给mysql添加挂载目录
version: "3.8"
services:
  # 服务名 自定义的
  tomcat:
   # 镜像名
   images: tomcat:8.0
   ports:
    # 端口映射, 多个写多行
    - 8080:8080
  tomcat02:
   image: tomcat:8.0
   ports:
    - 8081:8080
  redis:
   image: redis:5.0.12
   ports:
    - 6379:6379
  mysql:
   image: mysql:8.0
   ports:
    - 3306:3306
   enviroment: 
    - "MYSQL_ROOT_PASSEORD=admin@123"
   volumes:
    - /home/docker-compose/mysql:/var/lib/mysql
  • 自定义容器名
version: "3.8"
# 管理一组服务 
services:
  # 服务名 自定义的
  tomcat:
  # 给当前取名字
  container_name: tomcat01
   # 镜像名 
   images: tomcat:8.0
   ports:
    # 端口映射, 多个写多行
    - 8080:8080
  tomcat02:
   image: tomcat:8.0
   ports:
    - 8081:8080
  redis:
  container_name: redis01
   image: redis:5.0.12
   ports:
    - 6379:6379
  mysql:
  container_name: mysql01
   image: mysql:8.0
   ports:
    - 3306:3306
   enviroment: 
    - "MYSQL_ROOT_PASSEORD=admin@123"
   volumes:
    - /home/docker-compose/mysql:/var/lib/mysql

Docker-Compose模板命令

build

构建 , 通过docker-compose在启动容器之前根据Dockerfile构建镜像, 然后根据构建的镜像启动容器

version: "3.8"
services:
  apps:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"

command

覆盖启动后默认执行的指令, 相当于在把app.jar改为test.jar

Dockerfile

FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=9080"]
EXPOSE 9080
ENTRYPOINT ["java", "-jar"]
CMD ["/app.jar"]

docker-compose.yaml

version: "3.8"
services:
  apps:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
    command: test.jar

container_name

用来指定docker-compose启动容器名称, 不推荐使用, docker不允许同样名字容器存在

version: "3.8"
services:
  tomcat:
   image: tomcat:8.0
   container_name: tomcat01
   ports: "8080:8080"

depends_on

解决容器依赖,启动先后的问题

version: "3.8"
services:
  tomcat:
   image: tomcat:8.0
   ports: "8080:8080"
  apps:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再tomcat启动之后再启动当前容器, 多个多行
			- tomcat
#			- mysql
#			- redis

env_file

设置环境变量

version: "3.8"
services:
  tomcat:
   image: tomcat:8.0
   ports: "8080:8080"
  apps:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再tomcat启动之后再启动当前容器, 多个多行
			- tomcat
	mysql:
	 image: mysql:8.0
	 ports: "3306:3306"
	 # 设置环境变量
	 enviroment:
	  MYSQL_ROOT_PASSWORD:admin@123

在服务器中添加.env文件, 隐藏不想展示的环境变量, .env文件在服务器上是隐藏文件. ls -a才看得到

.env

MYSQL_ROOT_PASSWORD:admin@123

docker-compose.yaml

version: "3.8"
services:
  tomcat:
   image: tomcat:8.0
   ports: "8080:8080"
  apps:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再tomcat启动之后再启动当前容器, 多个多行
			- tomcat
	mysql:
	 image: mysql:8.0
	 ports: "3306:3306"
	 # 设置环境变量
	 env_file: ./.env.file

expose

用来指定构建镜像过程中容器暴露的端口, 一般是自己构建的镜像中需要该指令, 一般在Dockerfile中使用

version: "3.8"
services:
  tomcat:
   expose: 8080
   image: tomcat:8.0
   ports: "8080:8080"
  apps:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再tomcat启动之后再启动当前容器, 多个多行
			- tomcat
	mysql:
	 image: mysql:8.0
	 ports: "3306:3306"
	 # 设置环境变量
	 env_file: ./.env.file

image

指定启动容器使用的镜像

network

用来指定容器启动用的网桥 相当于docker -network

docker-compose.yaml

version: "3.8"
services:
  tomcat:
   expose: 8080
   image: tomcat:8.0
   ports: "8080:8080"
   networks: 
    - app
  apps:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再tomcat启动之后再启动当前容器, 多个多行
			- tomcat
   networks: 
    - app
	mysql:
	 image: mysql:8.0
	 ports: "3306:3306"
	 # 设置环境变量
	 env_file: ./.env.file
   networks: 
    - app
    
# 上面这种直接使用网桥的方式, docker不会自动创建网桥, 需要声明一下
networks:
 app:

volumes

数据卷挂载

docker-compose.yaml

version: "3.8"
services:
  tomcat:
   expose: 8080
   image: tomcat:8.0
   ports: "8080:8080"
   networks: 
    - app
  apps:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再tomcat启动之后再启动当前容器, 多个多行
			- tomcat
   networks: 
    - app
	mysql:
	 image: mysql:8.0
	 ports: "3306:3306"
	 # 设置环境变量
	 env_file: ./.env.file
	 volumes:
	 # 需要添加声明
	  - mysqlData:/var/lib/mysql
   networks: 
    - app
    
# 上面这种直接使用网桥的方式, docker不会自动创建网桥, 需要声明一下
networks:
 app:
volumes:
 mysqlData: 

ports

宿主机和容器端口映射, 相当于docker run -p

restart

用来指定docker容器总是运行 相当于docekr run --restart=always

version: "3.8"
services:
  tomcat:
   expose: 8080
   image: tomcat:8.0
   ports: "8080:8080"
   networks: 
    - app
  apps:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再tomcat启动之后再启动当前容器, 多个多行
			- tomcat
   networks: 
    - app
	mysql:
	 image: mysql:8.0
	 ports: "3306:3306"
	 # 设置环境变量
	 env_file: ./.env.file
	 volumes:
	 # 需要添加声明
	  - mysqlData:/var/lib/mysql
   networks: 
    - app
   restart: always
    
# 上面这种直接使用网桥的方式, docker不会自动创建网桥, 需要声明一下
networks:
 app:
volumes:
 mysqlData: 

docker-compose常用命令

服务id 就是docker-compose.yaml中的服务名

up / up -d 启动

# 启动整个项目
docker-compose up

# 启动某个服务, 服务id指的是定义在yaml中services下的服务名
docker-compose up [服务id]      docker-compose up mysql

# 后台启动
docker-compose up -d

stop 停止

docker-compose stop [options] [SERVICES...]

停止运行状态的容器

start 开启

docker-compose start [SERVICES...]

开启停止状态的容器

dowm 停止

类似 up , 不跟服务名 停止全部, 并且会移除网络

docker-compose down [服务id]

restart 重启

# 重启整个项目
docker-compose restart 

# 重启指定服务
docker-compose restart [服务id]

# 指定时间重启, 20秒后重启
docker-compose restart -t 20

rm 删除

# 删除所有停止状态的服务容器, 推荐先执行docker-compose stop命令停止容器
docker-compose rm [options] [SERVICE...]

-f --force强制直接删除, 包括非停止状态的
-v 删除容器挂载的数据卷

-f 指定docker-compose文件名

# 默认是docker-compose,  可以不写
docker-compose -f docker-compose.yml

exec 进入指定容器

docker-compose exec 服务id bash

ps 列出所有运行的服务

docker-compose ps

pause / unpause 暂停 恢复

# 暂停所有服务
docker-compose pause 

# 暂停指定服务
docker-compose pause [SERVICE]

# 恢复同理

logs 日志

docker-compose logs -f [服务id]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值