├── .gitignore ├── LICENSE ├── README.md ├── Vagrantfile ├── cronjobs ├── date.sh └── dnsdock.sh ├── crontab ├── docker ├── docs └── troubleshoot.md └── vagrant.yaml.dist /.gitignore: -------------------------------------------------------------------------------- 1 | .vagrant 2 | vagrant.yaml 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Yappa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![docker](https://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2015/04/1429543497dockerimg.png) 2 | 3 | # A lightweight Docker VM 4 | 5 | ## Getting started 6 | 7 | ### Requirements 8 | 9 | * Brew 10 | * Brew Cask 11 | * Virtualbox 12 | * Vagrant 13 | * Docker 14 | * Docker Compose 15 | 16 | ### Install Requirements 17 | 18 | #### Vagrant and Virtualbox 19 | 20 | ``` 21 | brew cask install vagrant 22 | brew cask install virtualbox 23 | vagrant plugin install vagrant-disksize 24 | ``` 25 | 26 | #### Docker 27 | 28 | ``` 29 | brew install docker 30 | brew install docker-compose --ignore-dependencies 31 | ``` 32 | 33 | 34 | ### Add dns resolver domain 35 | 36 | ``` 37 | sudo vim /etc/resolver/docker 38 | ``` 39 | 40 | Add the following line: 41 | 42 | ``` 43 | nameserver 172.17.8.101 44 | ``` 45 | 46 | Also add resolver files for any additional domains you might want to use (eg. docker.example.com) 47 | 48 | ### Vagrant up 49 | 50 | ``` 51 | git clone https://github.com/yappabe/vagrant-docker.git 52 | cd vagrant-docker 53 | vagrant up 54 | ``` 55 | 56 | An issue with port-forwarding, reload to fix this. 57 | 58 | ``` 59 | vagrant reload 60 | ``` 61 | 62 | ### Flush DNS cache 63 | 64 | ``` 65 | sudo dscacheutil -flushcache;sudo killall -HUP mDNSResponder 66 | ``` 67 | 68 | ### Reboot 69 | 70 | You may need to reboot your device to ensure `/etc/resolver/docker` is being used. 71 | 72 | ### Add the `DOCKER_HOST` env var 73 | 74 | ``` 75 | export DOCKER_HOST=tcp://localhost:2375 76 | ``` 77 | 78 | You can add this in `.bashrc` or any file that runs every interactive shell launch. 79 | 80 | 81 | ## Test Docker 82 | 83 | ``` 84 | docker ps 85 | ``` 86 | 87 | When the following line appears: 88 | 89 | ``` 90 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 91 | fd17358a9eda ailispaw/dnsdock:1.16.4 "dnsdock" 8 days ago Up 21 hours 0.0.0.0:53->53/udp dnsdock 92 | ``` 93 | 94 | You can now visit `http://dnsdock.docker/services`. 95 | 96 | ## Install Docker Compose 97 | 98 | ``` 99 | brew install docker-compose 100 | ``` 101 | 102 | 103 | ## Example docker-compose.yml for Symfony development in PHP 7.1. 104 | 105 | ```yml 106 | version: '3' 107 | 108 | services: 109 | nginx: 110 | image: yappabe/nginx:1.9 111 | volumes: 112 | - ./docker/shared/:/shared 113 | - ./:/var/www/app 114 | depends_on: 115 | - php 116 | env_file: 'app/config/.env' 117 | environment: 118 | DNSDOCK_ALIAS: project.docker, admin.project.docker 119 | 120 | mysql: 121 | image: mariadb:10 122 | env_file: 'app/config/.env' 123 | environment: 124 | DNSDOCK_ALIAS: mysql.project.docker 125 | 126 | php: 127 | image: yappabe/php:7.1 128 | volumes: 129 | - ./docker/shared/:/shared 130 | - ./:/var/www/app 131 | - vendor:/vendor 132 | links: 133 | - mysql 134 | working_dir: /var/www/app 135 | env_file: 'app/config/.env' 136 | environment: 137 | - HISTFILE=/shared/.bash_history 138 | depends_on: 139 | - mysql 140 | - mailcatcher 141 | 142 | mailcatcher: 143 | image: yappabe/mailcatcher 144 | environment: 145 | DNSDOCK_ALIAS: mailcatcher.project.docker 146 | 147 | volumes: 148 | mysql-data: 149 | vendor: 150 | ``` 151 | 152 | And `app/config/.env` 153 | 154 | ``` 155 | APP_ENV=dev 156 | APP_DEBUG=1 157 | DOCUMENT_ROOT=/var/www/app/web 158 | INDEX_FILE=app_dev.php 159 | PHP_FPM_SOCKET=php:9000 160 | MYSQL_ROOT_PASSWORD=dev 161 | MYSQL_DATABASE=project 162 | MYSQL_USER=root 163 | MYSQL_HOST=mysql 164 | MYSQL_PORT=3306 165 | PHP_FPM_USER=root 166 | PHP_ERROR_REPORTING=E_ALL 167 | HISTFILE=/shared/.bash_history 168 | MAILER_TRANSPORT=smtp 169 | MAILER_HOST=mailcatcher 170 | MAILER_USER=null 171 | MAILER_PASSWORD=null 172 | MAILER_PORT=1025 173 | MAILER_SECURITY=null 174 | ``` 175 | 176 | ``` 177 | docker-compose up -d 178 | ``` 179 | 180 | ## Troubleshoot 181 | 182 | [Troubleshoot issues](/docs/troubleshoot.md) 183 | -------------------------------------------------------------------------------- /Vagrantfile: -------------------------------------------------------------------------------- 1 | require 'yaml' 2 | 3 | Vagrant.require_version ">= 2.1.0" 4 | 5 | # Load settings from vagrant.yml or vagrant.yml.dist 6 | current_dir = File.dirname(File.expand_path(__FILE__)) 7 | 8 | if File.file?("#{current_dir}/vagrant.yaml") 9 | config_file = YAML.load_file("#{current_dir}/vagrant.yaml") 10 | else 11 | config_file = YAML.load_file("#{current_dir}/vagrant.yaml.dist") 12 | end 13 | 14 | settings = config_file['settings'] 15 | 16 | $vm_gui = settings['vm']['gui'] 17 | $vm_memory = settings['vm']['memory'] 18 | $vm_cpus = settings['vm']['cpus'] 19 | $vm_disk = settings['vm']['disk'] 20 | $vm_ip_address = settings['vm']['ip'] 21 | $docker_version = settings['docker']['version'] 22 | $docker_net = settings['docker']['network'] 23 | 24 | def vm_gui 25 | $vb_gui.nil? ? $vm_gui : $vb_gui 26 | end 27 | 28 | def vm_memory 29 | $vb_memory.nil? ? $vm_memory : $vb_memory 30 | end 31 | 32 | def vm_cpus 33 | $vb_cpus.nil? ? $vm_cpus : $vb_cpus 34 | end 35 | 36 | # A dummy plugin for Barge to set hostname and network correctly at the very first `vagrant up` 37 | module VagrantPlugins 38 | module GuestLinux 39 | class Plugin < Vagrant.plugin("2") 40 | guest_capability("linux", "change_host_name") { Cap::ChangeHostName } 41 | guest_capability("linux", "configure_networks") { Cap::ConfigureNetworks } 42 | end 43 | end 44 | end 45 | 46 | Vagrant.configure("2") do |config| 47 | 48 | config.vm.box = "ailispaw/barge" 49 | config.disksize.size = $vm_disk 50 | config.vm.network :private_network, ip: "#{$vm_ip_address}" 51 | config.vm.synced_folder ENV['HOME'], ENV['HOME'], id: "home", :nfs => true, :mount_options => ['noatime,soft,nolock,vers=3,udp,proto=udp,udp,rsize=8192,wsize=8192,namlen=255,timeo=10,retrans=3,nfsvers=3,actimeo=1'] 52 | config.vm.guest = :linux 53 | 54 | config.vm.provider :virtualbox do |vb| 55 | vb.check_guest_additions = false 56 | vb.functional_vboxsf = false 57 | vb.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"] 58 | vb.customize ["modifyvm", :id, "--nicpromisc2", "allow-all"] 59 | vb.gui = vm_gui 60 | vb.memory = vm_memory 61 | vb.cpus = vm_cpus 62 | vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] 63 | vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"] 64 | vb.customize ["modifyvm", :id, "--nictype1", "virtio"] 65 | vb.customize ["modifyvm", :id, "--ioapic", "on"] 66 | end 67 | 68 | config.vm.network "forwarded_port", guest: 2375, host: 2375, auto_correct: true 69 | config.vm.network "forwarded_port", guest: 9000, host: 9000, auto_correct: true 70 | 71 | if Vagrant.has_plugin?("vagrant-vbguest") then 72 | config.vbguest.auto_update = false 73 | end 74 | 75 | # Adjusting datetime before provisioning. 76 | config.vm.provision :shell, run: "always" do |sh| 77 | sh.inline = "sntp -4sSc pool.ntp.org; date" 78 | end 79 | 80 | config.vm.provision "file", source: "./docker", destination: '/tmp/docker' 81 | config.vm.provision "shell", inline: "mv /tmp/docker /etc/default/docker", privileged: true 82 | config.vm.provision "shell", inline: "mkdir -p /home/bargee/cronjobs", privileged: false 83 | config.vm.provision "file", source: "./cronjobs/date.sh", destination: '/home/bargee/cronjobs/date.sh' 84 | config.vm.provision "file", source: "./cronjobs/dnsdock.sh", destination: '/home/bargee/cronjobs/dnsdock.sh' 85 | config.vm.provision "file", source: "./crontab", destination: '/home/bargee/crontab' 86 | config.vm.provision "shell", inline: "cd /home/bargee/cronjobs; chmod 755 *.sh", privileged: true 87 | config.vm.provision "shell", inline: "cd /home/bargee; cat crontab | crontab -; crontab -l", privileged: true 88 | config.vm.provision "shell", inline: "/etc/init.d/docker restart #{$docker_version}", privileged: true 89 | 90 | config.vm.provision "docker" do |d| 91 | d.pull_images "ailispaw/dnsdock:1.16.4" 92 | d.post_install_provision "shell", inline:"docker rm -f dnsdock || true" 93 | d.run "dnsdock", 94 | image: "ailispaw/dnsdock:1.16.4", 95 | args: "-v /var/run/docker.sock:/var/run/docker.sock -p 0.0.0.0:53:53/udp", 96 | restart: "always", 97 | daemonize: true 98 | end 99 | 100 | config.vm.provision :shell do |sh| 101 | sh.inline = <<-EOT 102 | echo "nameserver 127.0.0.1" > /etc/resolv.conf.head 103 | dhcpcd -x eth0 && dhcpcd eth0 104 | EOT 105 | end 106 | 107 | config.trigger.after [:up, :resume] do |trigger| 108 | trigger.info = "Setup route to vm ip #{$docker_net} -> #{$vm_ip_address}!" 109 | trigger.run = {inline: "sudo route -n add -net #{$docker_net} #{$vm_ip_address}"} 110 | trigger.info = "Update vm.max_map_count!" 111 | trigger.run_remote = {inline: "sudo sysctl -w vm.max_map_count=262144"} 112 | end 113 | 114 | config.trigger.after [:destroy, :suspend, :halt] do |trigger| 115 | trigger.info = "Remove route to vm ip!" 116 | trigger.run = {inline: "sudo route -n delete -net #{$docker_net} #{$vm_ip_address}"} 117 | end 118 | 119 | end 120 | -------------------------------------------------------------------------------- /cronjobs/date.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | sudo sntp -4sSc pool.ntp.org; date -------------------------------------------------------------------------------- /cronjobs/dnsdock.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | sudo docker restart dnsdock 3 | -------------------------------------------------------------------------------- /crontab: -------------------------------------------------------------------------------- 1 | */5 * * * * /home/bargee/cronjobs/date.sh 2 | */5 * * * * /home/bargee/cronjobs/dnsdock.sh 3 | -------------------------------------------------------------------------------- /docker: -------------------------------------------------------------------------------- 1 | # DOCKER_STORAGE="overlay" 2 | 3 | # DOCKER_DIR="/var/lib/docker" 4 | 5 | # DOCKER_HOST="-H unix://" 6 | DOCKER_HOST="-H unix:// -H tcp://0.0.0.0:2375" 7 | 8 | DOCKER_EXTRA_ARGS="--default-address-pool base=172.16.0.0/12,size=24 --bip 172.18.0.1/24 --log-opt max-size=10m" 9 | 10 | # DOCKER_ULIMITS=1048576 11 | 12 | # DOCKER_LOGFILE="/var/log/docker/docker.log" 13 | 14 | # DOCKER_TIMEOUT=5 15 | -------------------------------------------------------------------------------- /docs/troubleshoot.md: -------------------------------------------------------------------------------- 1 | # Issues 2 | 3 | 4 | ## 'name not resolved' 5 | 6 | Clear DNS cache on your Mac: 7 | 8 | ``` 9 | sudo killall -HUP mDNSResponder 10 | ``` 11 | 12 | Or add an alias: 13 | 14 | ``` 15 | alias dnsflush='sudo dscacheutil -flushcache;sudo killall -HUP mDNSResponder;echo dns cache flushed' 16 | alias flushdns='dnsflush' 17 | ``` 18 | 19 | 20 | ## I need my ssh key in my container 21 | 22 | Add your ssh key as a volume: 23 | 24 | ``` 25 | app: 26 | image: php 27 | volumes: 28 | - ~/.ssh/id_rsa:/root/.ssh/id_rsa:ro 29 | ``` 30 | -------------------------------------------------------------------------------- /vagrant.yaml.dist: -------------------------------------------------------------------------------- 1 | --- 2 | settings: 3 | vm: 4 | gui: false 5 | memory: 2048 6 | cpus: 8 7 | disk: 128GB 8 | ip: 172.17.8.101 9 | docker: 10 | version: 18.06.0-ce 11 | network: 172.16.0.0/12 12 | --------------------------------------------------------------------------------