| 知乎专栏 | 
本章节介绍如何定义 docker-compose.yml 文件
首先创建项目目录
mkdir docker cd docker vim docker-compose.yml
image: mysql:5.7 表示使用 mysql:5.7 镜像, image: mysql:latest 表示 mysql 最新版
			
services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress			
			
		
	
			
# Define in docker-compose:
 services:
  prometheus:
    image: prom/prometheus
    user: "1000:1000"
 services:
  prometheus:
    image: prom/prometheus
    user: root
# Dockerfile
USER 1000:1000			
			
		
	将容器中的端口暴漏给宿主主机。
ports: - "3000" - "80:80" - "22:22" - "127.0.0.1:8000:8000"
默认 "端口:端口" 将监听 127.0.0.1 主机。如果需要将端口暴漏出去,格式是"IP:PORT:PORT",IP地址是宿主主机的网络适配器IP地址。
往/etc/hosts文件中添加主机名,与Docker client的--add-host类似:
extra_hosts: - "orderer.example.com:10.130.116.8" - "peer0.org1.example.com:10.130.116.9" - "peer1.org1.example.com:10.130.116.10" - "peer0.org2.example.com:10.130.116.25" - "peer1.org2.example.com:10.130.116.27"
			
version: '3.9'
networks:
  default:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.88.10.0/24
          gateway: 172.88.10.1			
			
			
		创建固定网段的网络bridge2。
docker network create --subnet=10.16.1.0/16 --gateway=10.16.1.1 --opt "com.docker.network.bridge.name"="bridge2" bridge2
把bridge2网络配置导docker-compose里面。
		
networks:
  default:
    driver: bridge
  persist:
    external:
      name: bridge2		
		
			
		links的作用是在当前服务里面创建一个链接外部服务的别名。
docker-compose.yml
			
services:
  tomcat:
    image: netkiller:latest
    links:
      - mysql:db.netkiller.cn
			
		
		这时配置文件 application.properties 就可以这样些
sql.mysql.jdbc-url=jdbc:mysql://db.netkiller.cn:3306/test?characterEncoding=utf8&serverTimezone=UTC&autoReconnect=true&useSSL=false sql.mysql.username=root sql.mysql.password=abcdef sql.mysql.driverClassName=com.mysql.jdbc.Driver
创建 development 网络
docker network create development --driver bridge docker run --name redis-external --net development -d redis
		
version: "3.9"
networks:
  default:
    external:
      name: development
services:
  demo-external:
    image: demo:1.0
    container_name: demo-external
    restart: always
    environment:
      REDIS_HOST: redis-external
    ports:
      - 80:80
    external_links:
      - redis-external
		
		
		测试方法,进入 demo-external 容器,然后 ping redis-external 容器
docker exec -it demo-external ping redis-external
[root@netkiller docker]# docker exec -it demo-external ping redis-external PING redis-external (172.18.0.3) 56(84) bytes of data. 64 bytes from redis-external.development (172.18.0.3): icmp_seq=1 ttl=64 time=0.091 ms 64 bytes from redis-external.development (172.18.0.3): icmp_seq=2 ttl=64 time=0.122 ms 64 bytes from redis-external.development (172.18.0.3): icmp_seq=3 ttl=64 time=0.185 ms
通过depends_on告诉docker-compose当前服务启动之前先要把depends_on指定的服务启动起来才行。
			
services:
  kafka:
    image: tflinux_kafka
    depends_on:
      - zookeeper
  spring:
    image: springboot
    depends_on:
      - redis
      - mysql      	
			
		
	environment 实现容器中环境变量的定义
			
version: '3'
networks:
  basic:
services:
  tools:
    container_name: tools 
    image: hyperledger/fabric-tools
    tty: true
    environment:
      - GOPATH=/opt/gopath
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_LOGGING_LEVEL=DEBUG
      - CORE_PEER_ID=cli
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
      - CORE_CHAINCODE_KEEPALIVE=10
    # working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    working_dir: /root/netkiller
    command: /bin/bash
    volumes:
        - /var/run/:/host/var/run/
        - ~/netkiller:/root/netkiller
        - ./chaincode/:/opt/gopath/src/github.com/
        - ./crypto:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
    networks:
        - basic
			
		
	编译当前目录下的 Dockerfile 使用 build: .
			
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"			
			
		
		指定镜像名称
			
version: "3.7"
services:
  redis-image:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - node=master
    image: netkiller/redis:latest
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    networks:
      - redis
    privileged: true
    sysctls:
      net.core.somaxconn: '511'
    ulimits:
      nproc: 65535
      nofile:
        soft: 65535
        hard: 65535			
			
		
		docker-compose build redis-image 构建镜像
neo@MacBook-Pro ~/workspace/docker/docker-compose/redis/cluster % docker-compose build redis-image Building redis-image Step 1/12 : FROM redis:latest ---> a55fbf438dfd Step 2/12 : ARG node ---> Using cache ---> 4deb8fc1e1df Step 3/12 : ENV REDIS_PORT 6379 ---> Using cache ---> 5723ff2fe55c Step 4/12 : COPY redis.conf /etc/redis/redis.conf ---> Using cache ---> daf496f8c342 Step 5/12 : COPY docker-entrypoint.sh /usr/local/bin/ ---> Using cache ---> 600ae3b0c059 Step 6/12 : RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ---> Using cache ---> 630e3813bc8f Step 7/12 : RUN echo 'Asia/Shanghai' >/etc/timezone ---> Using cache ---> 7d48350d6621 Step 8/12 : RUN echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' > /etc/rc.local ---> Using cache ---> c096dc75da72 Step 9/12 : RUN chmod +rw /etc/redis/redis.conf ---> Using cache ---> 25d8b0ac8893 Step 10/12 : EXPOSE $REDIS_PORT ---> Using cache ---> 99f31a88d2ff Step 11/12 : ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] ---> Using cache ---> ef98f89610ae Step 12/12 : CMD [ "redis-server", "/etc/redis/redis.conf" ] ---> Using cache ---> 095823650068 Successfully built 095823650068 Successfully tagged netkiller/redis:latest neo@MacBook-Pro ~/workspace/docker/docker-compose/redis/cluster % docker images | grep netkiller/redis netkiller/redis latest 095823650068 8 minutes ago 95MB
			
version: "3"
services:
  node:
    build:
     context: .
      dockerfile: ./Dockerfile
    restart: always
    environment:
      - HOST=localhost
    volumes:
      - logs:/app/logs
    expose:
      - 8080
    deploy:  		
      resources:
        limits:
          cpus: '0.001'
          memory: 50M
        reservations:
          cpus: '0.0001'
          memory: 20M			
			
		
		| ![[提示]](/graphics/tip.png) | 提示 | 
|---|---|
| 注意:启动必须加入 --compatibility 选项 docker-compose --compatibility up |