This project is intended for use in local development environment i.e. do not use in production environments 🤔
- Simple Commands
- Postgres
- MySQL
- MySQL Cluster
- DynamoDB
- Ubuntu
- Alpine Java
- OpenAPI
- InfluxDB
- Grafana
- Zookeeper
- Zookeeper Cluster
- Kafka
- Kafka Cluster
- RabbitMQ
- Redis
$ docker-compose -f ./docker-compose.yaml up -d $ docker logs -f [container_name] $ docker-compose -f ./docker-compose.yaml down -v
See ./composes/mariadb for details
version: '3.4' services: mariadb: image: mariadb:10.2 container_name: mariadb environment: MYSQL_ROOT_PASSWORD: pass MYSQL_DATABASE: testdb MYSQL_USER: tester MYSQL_PASSWORD: tester ports: - "3306:3306" logging: driver: syslog options: tag: "{{.DaemonName}}(image={{.ImageName}};name={{.Name}};id={{.ID}})" networks: - backend restart: on-failure volumes: - ${PWD}/mariadb:/var/lib/mysql - ${PWD}/custom.cnf:/etc/mysql/conf.d/custom.cnf networks: backend: driver: bridge
$ cd composes/mariadb $ docker-compose up -d $ docker exec -it mariadb bash root@19d6c77a0f0e:/# mysql -u tester -p testdb Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 10.2.23-MariaDB-1:10.2.23+maria~bionic mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [testdb]> show tables; Empty set (0.01 sec) MariaDB [testdb]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | testdb | +--------------------+ 2 rows in set (0.00 sec)
See ./composes/postgres for details
version: '3.1' services: postgresdb: image: postgres container_name: postgresdb restart: always environment: - POSTGRES_PASSWORD=pass ports: - "5432:5432"
$ docker exec -it postgresdb bash root@f979f2462b94:/# psql -d postgres -U postgres psql (11.2 (Debian 11.2-1.pgdg90+1)) Type "help" for help. postgres=#
See ./composes/mysql for details
version: '3.1' services: mysqldb: image: mysql:8.0.17 container_name: mysqldb platform: linux/amd64 # for m1 command: [ '--default-authentication-plugin=mysql_native_password', '--default-storage-engine=innodb' ] environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_DATABASE=my_database ports: - 3306:3306
$ docker exec -it mysqldb bash bash-4.4# mysql -u root -p my_database Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.30 MySQL Community Server - GPL Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ ...
See ./composes/mysqlcluster for details
version: '3' services: mysql_master: platform: linux/amd64 image: mysql:5.7 env_file: - ./master/mysql_master.env container_name: "mysql_master" restart: "no" ports: - 4406:3306 volumes: - ./master/conf/mysql.conf.cnf:/etc/mysql/conf.d/mysql.conf.cnf - ./master/__data:/var/lib/mysql networks: - overlay mysql_slave: platform: linux/amd64 image: mysql:5.7 env_file: - ./slave/mysql_slave.env container_name: "mysql_slave" restart: "no" ports: - 5506:3306 depends_on: - mysql_master volumes: - ./slave/conf/mysql.conf.cnf:/etc/mysql/conf.d/mysql.conf.cnf - ./slave/__data:/var/lib/mysql networks: - overlay networks: overlay:
# Run mysql cluster $ cd composes/mysqlcluster $ ./composes/mysqlcluster/build.sh # Run tests. this example try to write(insert/update/delete) to master and read(select) from slave. $ go run main.go 2022年09月03日 03:10:27 //============================================== 2022年09月03日 03:10:27 Try to save an user [Callback - Create] >> current user: Master(mydb_user@192.168.96.1), err: <nil> 2022年09月03日 03:10:27 ================================================// 2022年09月03日 03:10:27 //============================================== 2022年09月03日 03:10:27 Try to update an user [Callback - Update] >> current user: Master(mydb_user@192.168.96.1), err: <nil> 2022年09月03日 03:10:27 ================================================// 2022年09月03日 03:10:28 //============================================== 2022年09月03日 03:10:28 Try to find an user by calling First() [Callback - Query] >> current user: Slave(mydb_slave_user@192.168.96.1), err: <nil> 2022年09月03日 03:10:28 ================================================// 2022年09月03日 03:10:28 //============================================== 2022年09月03日 03:10:28 Try to find an user by calling exec() [Callback - Row] >> current user: Slave(mydb_slave_user@192.168.96.1), err: <nil> 2022年09月03日 03:10:28 ================================================// 2022年09月03日 03:10:29 //============================================== 2022年09月03日 03:10:29 Try to find an user with manual switching [Callback - Query] >> current user: Master(mydb_user@192.168.96.1), err: <nil> 2022年09月03日 03:10:29 ================================================// 2022年09月03日 03:10:29 //============================================== 2022年09月03日 03:10:29 Try to delete an user [Callback - Delete] >> current user: Master(mydb_user@192.168.96.1), err: <nil> 2022年09月03日 03:10:29 ================================================//
See ./composes/dynamodb for details
version: '3.1' services: dynamodb: image: amazon/dynamodb-local:latest container_name: dynamodb ports: - "8000:8000" volumes: - $HOME/.aws:/root/.aws dynamodb-ui: restart: always image: aaronshaf/dynamodb-admin container_name: dynamodb-ui environment: - DYNAMO_ENDPOINT=http://dynamodb:8000 ports: - 8001:8001 volumes: - $HOME/.aws:/root/.aws dynamodb-init: image: amazon/aws-cli entrypoint: /bin/sh -c container_name: dynamodb-init command: "/dynamodb/init.sh" environment: - ENVIRONMENT=LOCAL - HOST=dynamodb:8000 depends_on: - dynamodb volumes: - ${HOME}/.aws:/root/.aws - ./init.sh:/dynamodb/init.sh - ./tables:/dynamodb/tables
$ cd composes/dynamodb
$ docker-compose up -dConnect to http://localhost:8001 in your browser.
See ./composes/ubuntu for details
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y sudo && apt-get install -y openssh-server
RUN apt-get install net-tools
RUN mkdir /var/run/sshd
RUN echo 'root:rootpw' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
# Install docker
RUN apt-get install --assume-yes apt-transport-https ca-certificates curl gnupg-agent software-properties-common && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - && add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && apt-get update && apt-get install --assume-yes docker-ce docker-ce-cli containerd.io
# Install docker-compose (TODO : dependencies)
# RUN curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
$ cd composes/ubuntu $ docker-compose up -d # $ docker build -t eg_sshd . $ ssh root@localhost -p 49154 password: rootpw
See ./composes/alpine/java for details
version: '3.1' services: alpine-java: platform: linux/x86_64 image: openjdk:8-jre-alpine container_name: alpine-java command: sh -c 'echo before comamnd; cd /tmp; java HelloWorld scan01; echo after command' volumes: - ${PWD}/HelloWorld.class:/tmp/HelloWorld.class # this class compiled from 1.8
$ cd composes/alpine/java $ docker-compose up Starting alpine-java ... done Attaching to alpine-java alpine-java | before comamnd alpine-java | Hello World~! alpine-java | after command alpine-java exited with code 0
See ./composes/openapi for details
version: '3.4' services: swagger-ui: image: swaggerapi/swagger-ui container_name: swagger-ui environment: - SWAGGER_JSON=/config/sample-api.yaml - BASE_URL=/swagger ports: - "8080:8080" volumes: - ${PWD}/sample-api.yaml:/config/sample-api.yaml httpd: image: httpd:latest container_name: httpd ports: - "8081:80" volumes: - ./sample-api.html:/usr/local/apache2/htdocs/docs.html
$ cd composes/openapi
$ npm i -g redoc-cli
$ redoc-cli build ./sample-api.yaml -o ./sample-api.html
Prerendering docs
🎉 bundled successfully in: ./sample-api.html (1086 KiB) [⏱ 0.082s]$ cd composes/openapi
$ docker-compose up- swagger-ui: http://localhost:8080/swagger
- generated openapi docs: http://localhost:8081/docs.html
See ./composes/influxdb for details
version: '3.4' services: influxdb: image: influxdb:latest container_name: influxdb ports: - "8083:8083" - "8086:8086" - "8090:8090" environment: - INFLUXDB_DB=db0 - INFLUXDB_ADMIN_USER=admins - INFLUXDB_ADMIN_PASSWORD=pass volumes: # Mount data directory for persistent. - ./influxdb/__data:/var/lib/influxdb chronograf: image: chronograf:latest ports: - '8888:8888' volumes: - ./__chronograf-storage:/var/lib/chronograf depends_on: - influxdb environment: - INFLUXDB_URL=http://influxdb:8086 - INFLUXDB_USERNAME=admin - INFLUXDB_PASSWORD=pass
$ cd composes/influxdb
$ docker-compose up -dConnect to http://localhost:8888 in your browser.
See ./composes/grafana for details
version: '3' services: grafana: container_name: grafana image: grafana/grafana:latest user: "1000" ports: - 3000:3000 volumes: - ./__gfdata:/var/lib/grafana environment: - GF_SECURITY_ADMIN_USER=admins - GF_SECURITY_ADMIN_PASSWORD=pass
$ cd composes/grafana
$ docker-compose up -dConnect to http://localhost:3000 in your browser.
See ./composes/zookeeper for details
version: '3.1' services: zoo1: image: zookeeper:latest restart: always hostname: zoo1 ports: - "2181:2181" environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 volumes: - ./__zookeeper1/data:/data - ./__zookeeper1/datalog:/datalog
$ cd composes/zookeeper $ docker-compose up # This example try to create and delete znode with watcher. $ go run main.go 2022年09月03日 03:21:50 [EventLoop] EventOccur: {EventSession StateConnecting <nil> [::1]:2181} 2022年09月03日 03:21:50 [ZKClient]connected to [::1]:2181 2022年09月03日 03:21:50 [EventLoop] EventOccur: {EventSession StateConnected <nil> [::1]:2181} 2022年09月03日 03:21:50 [ZKClient]authenticated: id=72058349199360000, timeout=4000 2022年09月03日 03:21:50 [EventLoop] EventOccur: {EventSession StateHasSession <nil> [::1]:2181} 2022年09月03日 03:21:50 [ZKClient]re-submitting `0` credentials after reconnect 2022年09月03日 03:21:50 '/MyFirstZnode' exists: false, stat: &{0 0 0 0 0 0 0 0 0 0 0} 2022年09月03日 03:21:50 '/MyFirstZnode' create result: /MyFirstZnode 2022年09月03日 03:21:50 Stopping event loop 2022年09月03日 03:21:50 [ZKClient]recv loop terminated: EOF 2022年09月03日 03:21:50 [ZKClient]send loop terminated: <nil>
See ./composes/zookeepercluster for details
version: '3.1' services: zookeeper1: image: 'bitnami/zookeeper:latest' container_name: zookeeper1 ports: - '12181:2181' - '12888:2888' - '13888:3888' volumes: - __zookeeper1_data:/bitnami environment: - ZOO_SERVER_ID=1 - ALLOW_ANONYMOUS_LOGIN=yes - ZOO_SERVERS=0.0.0.0:2888:3888,zookeeper2:2888:3888,zookeeper3:2888:3888 zookeeper2: image: 'bitnami/zookeeper:latest' container_name: zookeeper2 ports: - '22181:2181' - '22888:2888' - '23888:3888' volumes: - __zookeeper2_data:/bitnami environment: - ZOO_SERVER_ID=2 - ALLOW_ANONYMOUS_LOGIN=yes - ZOO_SERVERS=zookeeper1:2888:3888,0.0.0.0:2888:3888,zookeeper3:2888:3888 zookeeper3: image: 'bitnami/zookeeper:latest' container_name: zookeeper3 ports: - '32181:2181' - '32888:2888' - '33888:3888' volumes: - __zookeeper3_data:/bitnami environment: - ZOO_SERVER_ID=3 - ALLOW_ANONYMOUS_LOGIN=yes - ZOO_SERVERS=zookeeper1:2888:3888,zookeeper2:2888:3888,0.0.0.0:2888:3888 volumes: __zookeeper1_data: driver: local __zookeeper2_data: driver: local __zookeeper3_data: driver: local
$ cd composes/zookeepercluster $ docker-compose up # This example try to create and delete znode with watcher. $ go run main.go 2022年09月03日 03:24:25 Conn State: StateDisconnected 2022年09月03日 03:24:25 [EventLoop] EventOccur: {EventSession StateConnecting <nil> [::1]:22181} 2022年09月03日 03:24:25 [ZKClient] connected to [::1]:22181 2022年09月03日 03:24:25 [EventLoop] EventOccur: {EventSession StateConnected <nil> [::1]:22181} 2022年09月03日 03:24:26 [ZKClient] authenticated: id=144115953666293760, timeout=4000 2022年09月03日 03:24:26 [ZKClient] re-submitting `0` credentials after reconnect 2022年09月03日 03:24:26 [EventLoop] EventOccur: {EventSession StateHasSession <nil> [::1]:22181} 2022年09月03日 03:24:26 '/MyFirstZnode' exists: true, stat: &{4294967306 4294967306 1662136980002 1662136980002 0 0 0 0 6 0 4294967306} 2022年09月03日 03:24:26 '/MyFirstZnode' create result: /MyFirstZnode 2022年09月03日 03:24:26 Stopping event loop 2022年09月03日 03:24:26 [ZKClient] recv loop terminated: EOF 2022年09月03日 03:24:26 [ZKClient] send loop terminated: <nil>
See ./composes/kafka for details
version: '3.4' services: zoo1: image: zookeeper:latest restart: always container_name: zoo1 ports: - "2181:2181" environment: - ZOO_MY_ID=1 - ZOO_SERVERS=server.1=0.0.0.0:2888:3888;2181 kafka1: image: confluentinc/cp-kafka:5.2.1 hostname: kafka1 ports: - "9092:9092" container_name: kafka1 environment: KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER_INTERNAL://kafka1:19092,LISTENER_DOCKER_EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER_INTERNAL KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181" KAFKA_BROKER_ID: 1 KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO" KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 volumes: - ./__kafka_data/kafka1/data:/var/lib/kafka/data depends_on: - zoo1 kafdrop: image: obsidiandynamics/kafdrop restart: "no" hostname: kafdrop container_name: kafdrop ports: - "9000:9000" environment: KAFKA_BROKERCONNECT: "kafka1:19092" JVM_OPTS: "-Xms16M -Xmx48M -Xss180K -XX:-TieredCompilation -XX:+UseStringDeduplication -noverify" depends_on: - "kafka1"
$ cd composes/kafka
$ docker-compose up
$ go run main.go
2022年09月03日 02:25:02 Skip to create a new topic sample-message because already exists
2022年09月03日 02:25:05 [Consumer] Setup Session. memberid:sarama-349f44c9-f0b8-477a-9af2-85a272281ead
2022年09月03日 02:25:05 consume message: message-1
2022年09月03日 02:25:05 consume message: message-2
2022年09月03日 02:25:05 consume message: message-3
2022年09月03日 02:25:05 consume message: message-4
2022年09月03日 02:25:05 consume message: message-5Check kafka topics from kafdrop(http://localhost:9000 in your browser).
See ./composes/kafkacluster for details
version: '3.4' services: zoo1: image: zookeeper:latest container_name: zoo1 hostname: zoo1 ports: - "2181:2181" environment: - ZOO_MY_ID=1 - ZOO_SERVERS=server.1=0.0.0.0:2888:3888;2181 kafka1: image: confluentinc/cp-kafka:5.2.1 hostname: kafka1 ports: - "9092:9092" container_name: kafka1 restart: always environment: KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER_INTERNAL://kafka1:19092,LISTENER_DOCKER_EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER_INTERNAL KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181" KAFKA_BROKER_ID: 1 KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO" KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 volumes: - ./__kafka1_data:/var/lib/kafka/data depends_on: - zoo1 kafka2: image: confluentinc/cp-kafka:5.2.1 hostname: kafka2 ports: - "9093:9093" container_name: kafka2 restart: always environment: KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER_INTERNAL://kafka2:19093,LISTENER_DOCKER_EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9093 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER_INTERNAL KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181" KAFKA_BROKER_ID: 2 KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO" volumes: - ./__kafka2_data:/var/lib/kafka/data depends_on: - zoo1 kafka3: image: confluentinc/cp-kafka:5.2.1 hostname: kafka3 ports: - "9094:9094" container_name: kafka3 restart: always environment: KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER_INTERNAL://kafka3:19094,LISTENER_DOCKER_EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9094 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER_INTERNAL KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181" KAFKA_BROKER_ID: 3 KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO" volumes: - ./__kafka3_data:/var/lib/kafka/data depends_on: - zoo1 kafdrop: image: obsidiandynamics/kafdrop restart: "no" ports: - "9000:9000" container_name: kafdrop environment: KAFKA_BROKERCONNECT: "kafka1:19092" JVM_OPTS: "-Xms16M -Xmx48M -Xss180K -XX:-TieredCompilation -XX:+UseStringDeduplication -noverify" depends_on: - "kafka1"
$ cd composes/kafkacluster
$ docker-compose up
$ go run main.go
2022年09月03日 02:41:19 Success to create a new topic: sample-message
2022年09月03日 02:41:32 [Consumer] Setup Session. memberid:sarama-338051c9-1d6a-44e7-8926-e2470ce6fcb4
2022年09月03日 02:41:33 consume message: message-1
2022年09月03日 02:41:33 consume message: message-2
2022年09月03日 02:41:33 consume message: message-3
2022年09月03日 02:41:33 consume message: message-4
2022年09月03日 02:41:33 consume message: message-5Check kafka brokers and topics from kafdrop (Connect to http://localhost:9000 in your browser).
See ./composes/rabbitmq for details
version: '3' services: rabbitmq: image: "rabbitmq:3-management" hostname: "rabbit" ports: - "15672:15672" - "5672:5672" labels: NAME: "rabbitmq" volumes: - ./rabbitmq-isolated.conf:/etc/rabbitmq/rabbitmq.config
[
{rabbit,
[
%% The default "guest" user is only permitted to access the server
%% via a loopback interface (e.g. localhost).
%% {loopback_users, [<<"guest">>]},
%%
%% Uncomment the following line if you want to allow access to the
%% guest user from anywhere on the network.
{loopback_users, []},
{default_vhost, "/"},
{default_user, "user"},
{default_pass, "secret"},
{default_permissions, [".*", ".*", ".*"]}
]}
].
$ cd cd composes/rabbitmq $ docker-compose up -d
See ./composes/redis
version: '3.1' services: redis: image: redis:latest ports: - "6379:6379" restart: always
$ docker exec -it redis /usr/local/bin/redis-cli INCR mycounter (integer) 1
$ cd composes/redis $ docker-compose up -d $ docker exec -it redis /usr/local/bin/redis-cli INCR mycounter (integer) 1
; TBD
; TBD