知乎专栏 | 多维度架构 |
本章节介绍如何定义 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
![]() | 提示 |
---|---|
注意:启动必须加入 --compatibility 选项 docker-compose --compatibility up |