利用Docker-Machine創建虛擬Docker主機
## 下載docker-machine https://github.com/docker/machine/releases
sucd@homestead:~$ curl -L https://github.com/docker/machine/releases/download/v0.16.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
chmod +x /tmp/docker-machine &&
sudo cp /tmp/docker-machine /usr/local/bin/docker-machine
## 查看版本號
sucd@homestead:~$ docker-machine -v
docker-machine version 0.16.0, build 702c267f
## 下載並安裝virtualbox 參見 http://blog.51cto.com/autophp/2320962
[sucd@localhost ~]$ VBoxManage -v 報錯
[sucd@localhost ~]$ sudo /sbin/vboxconfig
提示先安裝gcc
[sucd@localhost ~]$ sudo yum -y install gcc
[sucd@localhost ~]$ sudo /sbin/vboxconfig
[sucd@localhost ~]$ VBoxManage -v
5.2.22r126460
成功
## 下載boot2docker.iso(一個基於Tiny Core Linux的系統,裏面Docker啥的都幫你搞定了 v18.06.1-ce版本)
https://github.com/boot2docker/boot2docker/releases/
## 首先檢查 /home/sucd/.docker/machine/cache 是否存在。不存在則創建
## 將 boot2docker.iso 文件 拷貝到 **/cache 上述目錄下
## 創建虛擬機v1
[sucd@localhost ~]$ docker-machine create --driver=virtualbox v1
[sucd@localhost ~]$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
v1 - virtualbox Running tcp://192.168.99.100:2376 v18.09.0
說明虛擬機創建成功
## docker-machine相關命令
doceker-machine ls ## 列出所有虛擬機
doceker-machine ip 虛擬機名稱 ## 查看IP地址
doceker-machine stop/start 虛擬機名稱 ## 停止和開啓
doceker-machine env 虛擬機名稱 ## 環境變量
doceker-machine ssh 虛擬機名稱 ## SSH方式連接
## 移植images,具體操作步驟如下
[sucd@localhost ~]$ docker pull registry
[sucd@localhost ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos nginx 14d81ad3d755 44 hours ago 303MB
centos httpd bbe52af5c400 44 hours ago 333MB
centos latest 75835a67d134 6 weeks ago 200MB
registry latest 2e2f252f3c88 2 months ago 33.3MB
[sucd@localhost ~]$ docker run -d -p 5000:5000 --name registry registry
85dfccab3f3a70da31068871be7ef56fd2e9eb651f900ee0c72d914090f3a46d
[sucd@localhost ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85dfccab3f3a registry "/entrypoint.sh /etc…" 12 seconds ago Up 7 seconds 0.0.0.0:5000->5000/tcp registry
[sucd@localhost ~]$ docker tag centos:httpd localhost:5000/web
[sucd@localhost ~]$ docker push localhost:5000/web
[sucd@localhost ~]$ curl http://localhost:5000/v2/_catalog
{"repositories":["web"]}
## 在虛擬機中pull鏡像
[sucd@localhost ~]$ docker-machine ssh v1
docker@v1:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker@v1:~$ docker pull 192.168.99.1:5000/web
Using default tag: latest
Error response from daemon: Get https://192.168.99.1:5000/v2/: http: server gave HTTP response to HTTPS client
提示報錯,需要用hppts,我們可以讓其不用https, 在主機 /etc/docker/daemon.json文件中加入 "insecure-registies":["192.168.99.1:5000"]
-- 主機中
[sucd@localhost ~]$ sudo vim /etc/docker/daemon.json
[sucd@localhost ~]$ cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://z6z6dcky.mirror.aliyuncs.com"],
"insecure-registries":["192.168.99.1:5000"]
}
[sucd@localhost ~]$ sudo systemctl daemon-reload
[sucd@localhost ~]$ sudo systemctl restart docker
[sucd@localhost ~]$ docker start registry
-- 虛擬機中(先配置文件後退出)
docker@v1:~$ cat /etc/docker/daemon.json
{
"insecure-registries":["192.168.99.1:5000"]
}
[sucd@localhost ~]$ docker-machine restart v1
[sucd@localhost ~]$ docker-machine ssh v1
docker@v1:~$ docker pull 192.168.99.1:5000/web
利用Docker-Machine在虛擬機中使用compose啓動nginx負載均衡實例,設置IP轉發在windows中訪問
## 配置虛擬機docker用戶環境變量(1、虛擬機中創建 .local/bin/目錄 2、複製宿主機的.bash_profile到虛擬機 3、重新登錄虛擬機驗證)
[sucd@localhost ~]$ docker-machine ssh v1
docker@v1:~$ mkdir -p .local/bin/
[sucd@localhost ~]$ docker-machine scp /home/sucd/.bash_profile v1:/home/docker/
[sucd@localhost ~]$ docker-machine ssh v1
docker@v1:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/apps/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/docker/.local/bin:/home/docker/bin
## 拷貝 docker-compose
[sucd@localhost ~]$ docker-machine scp /usr/local/bin/docker-compose v1:/home/docker/.local/bin/
/home/docker/.local/bin/ 是虛擬機用戶的一個環境變量(也可以自己設置)
docker@v1:~$ docker-compose -v
docker-compose version 1.23.1, build b02f1306
## 拷貝之前做的 compose配置文件
[sucd@localhost ~]$ docker-machine scp -r mycompose/ v1:/home/docker
## 虛擬機創建一個空文件夾 nginx(不用進入虛擬機)
[sucd@localhost ~]$ docker-machine ssh v1 mkdir nginx
## 掛載虛擬機目錄到宿主機目錄
[sucd@localhost ~]$ mkdir mnginx
[sucd@localhost ~]$ docker-machine mount v1:/home/docker/nginx /home/sucd/mnginx/
You must have a copy of the sshfs binary locally to use the mount feature
## 提示需要安裝 sshfs
[sucd@localhost ~]$ sudo yum -y install epel-release
[sucd@localhost ~]$ sudo yum -y install fuse-sshfs
## 繼續掛載
[sucd@localhost ~]$ docker-machine mount v1:/home/docker/nginx /home/sucd/mnginx/
## 將nginx目錄文件全部複製到 mnginx/
[sucd@localhost mnginx]$ cd /home/sucd/nginx/
[sucd@localhost nginx]$ cp . /home/sucd/mnginx/ -r
## 進入虛擬機中並修改compose配置文件
[sucd@localhost ~]$ docker-machine ssh v1
docker@v1:~$ vi mycompose/docker-compose.yaml
docker@v1:~$ cat mycompose/docker-compose.yaml
services:
nginx:
container_name: mynginx
image: "nginx"
ports:
- "9090:80"
privileged: true
volumes:
- "/home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
networks:
mynginx-net:
ipv4_address: 192.156.0.2
healthcheck:
test: ["CMD", "curl","-s","-f", "http://localhost:80"]
interval: 5s
timeout: 5s
retries: 3
web1:
container_name: web1
image: "web"
ports:
- "8080:80"
privileged: true
volumes:
- "/home/docker/nginx/web1/:/var/www/html/"
networks:
mynginx-net:
ipv4_address: 192.156.0.6
healthcheck:
test: ["CMD", "curl","-s","-f", "http://localhost:80"]
interval: 5s
timeout: 5s
retries: 3
web2:
container_name: web2
image: "web"
ports:
- "8081:80"
privileged: true
volumes:
- "/home/docker/nginx/web2/:/var/www/html/"
networks:
mynginx-net:
ipv4_address: 192.156.0.3
healthcheck:
test: ["CMD", "curl","-s","-f", "http://localhost:80"]
interval: 5s
timeout: 5s
retries: 3
networks:
mynginx-net:
driver: bridge
ipam:
config:
- subnet: 192.156.0.0/16
version: "3"
## 進入mycompose並且啓動多個服務
docker@v1:~$ cd mycompose/
docker@v1:~/mycompose$ docker-compose up -d
## 測試,宿主機中訪問虛擬機服務web1和web2交替出現說明成
[sucd@localhost ~]$ curl $(docker-machine ip v1):9090
web1
[sucd@localhost ~]$ curl $(docker-machine ip v1):9090
web2
Docker Swarm + Docker-machine創建集羣
## 先創建兩個虛擬機
[sucd@localhost ~]$ docker-machine create -d virtualbox --virtualbox-hostonly-cidr "192.168.90.1/24" m1
[sucd@localhost ~]$ docker-machine create -d virtualbox --virtualbox-hostonly-cidr "192.168.90.1/24" v1
[sucd@localhost ~]$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
m1 - virtualbox Running tcp://192.168.90.100:2376 v18.09.0
v1 - virtualbox Running tcp://192.168.90.101:2376 v18.09.0
## 初始化一個集羣
[sucd@localhost ~]$ docker-machine ssh m1
docker@m1:~$ docker swarm init --advertise-addr 192.168.99.100
docker@m1:~$ docker swarm join-token worker
## 加入節點
[sucd@localhost ~]$ docker-machine ssh v1 docker swarm join --token SWMTKN-1-0zlzmet1ggrmlbeijj9oalsotaj2edlqnkoezuyi7h397srims-5kxodjp43mklqwfp1uh46diak 192.168.90.100:2377
This node joined a swarm as a worker.
docker@m1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
4a9jw24oq7hx0qenh5ayqw3v7 * m1 Ready Active Leader 18.09.0
hy5hw7xpvwmlhuzsikp40x39m v1 Ready Active 18.09.0
## 創建一個純淨的apache鏡像
[sucd@localhost ~]$ docker pull httpd
[sucd@localhost ~]$ docker tag httpd:latest localhost:5000/httpd
[sucd@localhost ~]$ docker push localhost:5000/httpd
[sucd@localhost ~]$ docker rmi localhost:5000/httpd:latest
鏡像的網站路徑: /usr/local/apache2/htdocs/
配置文件: /usr/local/apach2/conf/httpd.conf
## 創建服務
在m1中 加入/etc/docker/daemon.json文件
sudo /etc/init.d/docker restart # 重啓docker
docker pull 192.168.90.1:5000/httpd
docker tag 192.168.90.1:5000/httpd httpd && docker rmi 192.168.90.1:5000/httpd
在m1中創建空文件夾web,並添加一個index.html文件
doceker-machine ssh m1 mkdir web
在v1中執行相同的步驟
## 最後在m1中執行創建服務
docker@m1:~$ docker service create \
--replicas 2 \
--name myweb \
--publish 9091:80 \
--mount type=bind,source=/home/docker/web/,target=/usr/local/apache2/htdocs/ \
httpd
## 查看服務列表
docker@m1:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
v03oigi0wp0z myweb replicated 2/2 httpd:latest *:9090->80/tcp