docker三劍客之應用machine,compose,swarm

利用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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章