Spring Cloud Alibaba-Docker(二十六)

Centos下安裝

官方地址html

  • Uninstall old versions
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
複製代碼
  • Install using the repository
# Install required packages
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
# Use the following command to set up the stable repository
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
複製代碼
  • INSTALL DOCKER ENGINE - COMMUNITY
sudo yum install docker-ce docker-ce-cli containerd.io
複製代碼
  • Start Docker
sudo systemctl start docker
複製代碼
  • Verify that Docker Engine
sudo docker run hello-world
複製代碼

Docker Image

概念

todopython

vagrant用戶使用docker命令

  • 受權
# Adding user vagrant to group docker
sudo gpasswd -a vagrant docker
sudo service docker restart
複製代碼
  • 從新登錄
exit
vagrant ssh
複製代碼

pull太慢問題

sudo vim /etc/docker/daemon.jsonmysql

{
   "registry-mirrors" : ["https://docker.mirrors.ustc.edu.cn"]
}
複製代碼

sudo service docker restartlinux

構建

  • 本身構建Base Imagenginx

    • c文件
    #include<stdio.h>
      
    int main()
    {
     printf("hello docker\n");
    }
    複製代碼
    • 編譯
    gcc -static hello.c -o hello
    複製代碼
    • Dockerfile
    # 製作Base Image
    FROM scratch
    ADD hello /
    CMD ["/hello"]
    複製代碼
    • 構建
    docker build -t zzh/test .
    複製代碼
    • 運行
    docker run zzh/test
    複製代碼
  • 在已有Base Image基礎上構建Imagegit

    • 方式一:命令
    # 拉一個centos的Image
    docker pull centos
    # 相互模式運行centos
    docker run -it centos
    # 下載vim
    yum install vim -y
    # 退出container
    exit;
    # 查詢container
    docker container ls -a
    # 構建Image
    docker build docker commit -a "zzh" -m "centos with vim" ac327be41bb1 zzh/centos
    # 清理全部container
    docker rm $(docker container ls -aq)
    # 清理Image
    docker rmi 21fb0d14f197
    複製代碼
    • 方式二:Dockerfile
    # Dockerfile文件
    # 使用Base Image
    From centos
    yum install vim -y 
    複製代碼
    # 構建命令
    docker build -t zzh/centos-vim .
    # 退出container
    exit;
    # 清理全部container
    docker rm $(docker container ls -aq)
    # 清理Image
    docker rmi ae813e1893f3
    複製代碼
    • 本質(只是在centos基礎上多了一層Image Layer)

Docker Container

概念

todogithub

Dockerfile

# 製做Base Image
FROM scratch
# 使用Base Image
FROM centos
複製代碼
  • LABEL(metadata)
LABEL maintainer="xxx@qq.com"
LABEL version="1.0"
LABEL description="test"
複製代碼
  • RUN
# &&聯接兩個命令,\換行,一個RUN一層,建議用&&寫一塊兒,避免無用分層
RUN yum update && yum install -y vim \
python-dev 
複製代碼
  • WORKDIR
# 不存在就建立
WORKDIR /test
WORKDIR demo
# 結果/test/demo,不要使用RUN cd,儘可能使用絕對路徑
RUN pwd 
複製代碼
  • ADD && COPY
# 相同:把文件拷貝到指定目錄
# 不一樣:ADD若是拷貝壓縮文件會自動解壓,優先使用COPY
ADD hello /
COPY hello /
# /root/test/hello
WORKDIR /root
ADD hello test/
複製代碼
  • ENV
# 定義常量,以後用"${MYSQL_VERSION}"獲取5.6
ENV MYSQL_VERSION 5.6
複製代碼
  • RUN && CMD && ENTRYPOINT
RUN:執行命令且建立新的Image Layer
CMD:設置容器啓動後默認執行的命令和參數,若是docker run指定了其餘命令,CMD命令被忽略如docker run -it centos /bin/bash,定義了多個CMD只會執行最後一個
ENTRYPOINT:設置容器啓動時運行的命令,讓容器以應用程序的行程運行,必定會執行
複製代碼

鏡像發佈

Docker Hubsql

# 輸入帳號密碼登錄
docker login
docker push xxx/test:latest
複製代碼

私有Registry官方地址docker

# 另一臺服務器上安裝docker後執行
docker run -d -p 5000:5000 --restart always --name registry registry:2
# 構建image
docker build -t ip:5000/hello-world .
# 安全
cd /etc/docker/
# 內容{"insecure-registries":["ip:5000"]}
vim daemon.json
sudo vim /lib/systemd/system/docker.service
# 重啓docker
sudo service docker restart
複製代碼

docker.service加一行 json

打開地址http://ip:5000/v2/_catalog,查看是否已經push到registry

Docker Network

  • none:容器沒法與外界通訊
  • host:容器和虛擬機共享Network,有端口衝突風險
  • bridge:容器和虛擬機經過鏈接一一對應(docker0<->vethXXXX)

ping && telnet

  • ping :驗證IP的可達性
  • telnet:驗證服務的可達性
  • ping測試,Wireshark抓取

Linux Network Namespace

# 啓動兩個容器
docker run -d --name test1 busybox /bin/sh -c "while true;do sleep 3600;done"
docker run -d --name test2 busybox /bin/sh -c "while true;do sleep 3600;done"
# 查詢docker網絡
docker network ls
# 新建bridge
docker network create -d bridge my-bridge
# docker run指定bridge,鏈接my-bridge的容器自動link好了,一個容器能夠同時鏈接多個bridge,可是不互通除非同時在。
--network my-bridge
# docker run指定link,能夠經過test2:80這樣的方式訪問,相似dns解析
--link test2
# 鏈接bridge
docker network connect my-bridge test2 
# 端口映射
-p 80:80
複製代碼

虛擬機網絡狀況

brctl show

docker inspect bridge

整體

多容器通訊

todo

docker overlay & etcd

持久化存儲和數據共享

方案一:基於本地文件系統的Volume

能夠在執行Docker create/Docker run時,經過-v參數將主機的目錄做爲容器的數據卷。這部分功能是基於本地文件系統的volume管理

方案二:基於plugin的Volume

支持第三方存儲方案,例如aws等雲廠商

Volume類型

  • 受管理的data Volume,又docker後臺自動建立
  • 綁定掛載的Volume,具體掛載位置能夠由用戶指定

Mysql案例

Mysql的Dockerfile和安裝指南

  • Data Volume
# mysql 
docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
# 查看日誌
docker logs mysql1
# 查看volume
docker volume ls
# 進入mysql容器
docker exec -it mysql1 /bin/bash
# 添加database
mysql -u root
create database docker;
show databases;
# 中止和刪除容器
docker rm -f mysql1
# 從新建立容器用上一個volume,發現docker還在
docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
# 刪除volume
docker volume rm id
複製代碼
  • Bind Mouting
# 當前目錄下的index.html和容器內/usr/share/nginx/html的index.html同步,修改外面的=修改容器內部的
docker run -d -p 80:80 -v $(pwd):/usr/share/nginx/html  --name test nginx
複製代碼

Docker Compose

Docker Compose是一個經過yml文件能夠同時建立/管理多個容器的工具。 官方地址

  • 安裝
# 經過官方的方法太慢,這裏經過python-pip安裝
sudo yum -y install epel-release
sudo yum install python-pip
sudo pip install --upgrade pip
sudo pip --default-timeout=200 install -U docker-compose
docker-compose --version
複製代碼
  • yml
version: '3'

services:

  wordpress:
    image: wordpress
    ports:
      - 8080:80
    depends_on:
      - mysql
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root
    networks:
      - my-bridge

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - my-bridge

volumes:
  mysql-data:

networks:
  my-bridge:
    driver: bridge
複製代碼
# 運行(默認名稱docker-compose.yml能夠不指定)
docker-compose -f docker-compose.yml up -d
# 啓動
docker-compose start
# 查看Image
docker-compose images
# 進入容器
docker-compose exec mysql bash
# 中止
docker-compose stop
# 中止容器服務且刪除容器
docker-compose down
# 水平拓展(先啓動一臺test再執行)
docker-compose --scale test=3 -d 
複製代碼
相關文章
相關標籤/搜索