容器雲技術

来源:https://www.cnblogs.com/tui463/archive/2020/06/02/12976198.html
-Advertisement-
Play Games

容器雲技術 Docker引擎的安裝 準備兩台虛擬機,一臺為docker主節點,一臺為docker客戶端,安裝CentOS7.5_1804系統 基礎環境配置 網卡配置(master節點) 修改docker主節點主機名 # hostnamectl set-hostname master 配置網卡 # v ...


容器雲技術

Docker引擎的安裝

準備兩台虛擬機,一臺為docker主節點,一臺為docker客戶端,安裝CentOS7.5_1804系統

基礎環境配置

網卡配置(master節點)

修改docker主節點主機名

# hostnamectl set-hostname master

配置網卡

# vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=099334fe-751c-4dc4-b062-d421640ceb2e
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.7.10
NETMASK=255.255.255.0
GATEWAY=192.168.7.2
DNS1=114.114.114.114

網卡配置(slave節點)

修改docker客戶端主機名

# hostnamectl set-hostname slave

配置網卡

# vi /etc/sysconfig/network-scripts/ifcfg-ens33
iTYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=53bbedb7-248e-4110-bd80-82ca6371f016
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.7.20
NETMASK=255.255.255.0
GATEWAY=192.168.7.2
DNS1=114.114.114.114

配置YUM源(兩個節點)

將提供的壓縮包Docker.tar.gz上傳至/root目錄並解壓

# tar -zxvf Docker.tar.gz

配置本地YUM源

# vi /etc/yum.repos.d/local.repo
[kubernetes]
name=kubernetes
baseurl=file:///root/Docker
gpgcheck=0
enabled=1

升級系統內核(兩個節點)

Docker CE支持64位版本CentOS 7,並且要求內核版本不低於3.10

# yum -y upgrade

配置防火牆(兩個節點)

配置防火牆及SELinux

# systemctl stop firewalld && systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

# iptables -t filter -F

# iptables -t filter -X

# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

# reboot

開啟路由轉發(兩個節點)

# vi /etc/sysctl.conf

 

net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1

# modprobe br_netfilter

# sysctl -p
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

Docker引擎安裝

安裝依賴包(兩個節點)

yum-utils提供了yum-config-manager的依賴包,device-mapper-persistent-data和lvm2are需要devicemapper存儲驅動

# yum install -y yum-utils device-mapper-persistent-data

安裝docker-ce(兩個節點)

Docker CE是免費的Docker產品的新名稱,Docker CE包含了完整的Docker平臺,非常適合開發人員和運維團隊構建容器APP

安裝指定版本的Docker CE

# yum install -y docker-ce-18.09.6 docker-ce-cli-18.09.6 containerd.io

啟動Docker(兩個節點)

啟動Docker並設置開機自啟

# systemctl daemon-reload

# systemctl restart docker

# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

查看docker的系統信息

# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.09.6
Storage Driver: overlay2

Docker倉庫的使用

構建私有倉庫

官方的Docker Hub是一個用於管理公共鏡像的倉庫,用戶可以在上面找到需要的鏡像,也可以把私有鏡像推送上去。官方在Docker Hub上提供了Registry的鏡像,可以直接使用該Registry鏡像來構建一個容器,搭建私有倉庫服務

運行Registry(master節點)

Registry鏡像運行並生成一個容器

# ./image.sh

# docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
dff76b9fb042ff1ea15741a50dc81e84d7afad4cc057c79bc16e370d2ce13c2a

 

Registry服務預設會將上傳的鏡像保存在容器的/var/lib/registry中,將主機的/opt/registry目錄掛載到該目錄,可實現將鏡像保存到主機的/opt/registry目錄

查看運行情況(master節點)

查看容器運行情況

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
dff76b9fb042        registry:latest     "/entrypoint.sh /etc…"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp   registry

查看狀態

Registry容器啟動後,打開瀏覽器輸入地址http://192.168.7.10:5000/v2/

上傳鏡像(master節點)

配置私有倉庫

# vi /etc/docker/daemon.json {
        "insecure-registries":["192.168.7.10:5000"]
} # systemctl restart docker 標記鏡像 # docker tag centos:latest 192.168.7.10:5000/centos:latest 使用上傳標記的鏡像 # docker push 192.168.7.10:5000/centos:latest
The push refers to repository [192.168.7.10:5000/centos]
9e607bb861a7: Pushed
latest: digest: sha256:6ab380c5a5acf71c1b6660d645d2cd79cc8ce91b38e0352cbf9561e050427baf size: 529 查看倉庫中的鏡像 # curl -L http://192.168.7.10:5000/v2/_catalog
{"repositories":["centos"]}

拉取鏡像(slave節點)

配置私有倉庫地址

# vi /etc/docker/daemon.json
{
        "insecure-registries":["192.168.7.10:5000"]
}

# systemctl restart docker

拉取鏡像並查看結果

# docker pull 192.168.7.10:5000/centos:latest
latest: Pulling from centos
729ec3a6ada3: Pull complete
Digest: sha256:6ab380c5a5acf71c1b6660d645d2cd79cc8ce91b38e0352cbf9561e050427baf
Status: Downloaded newer image for 192.168.7.10:5000/centos:latest

# docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
192.168.7.10:5000/centos   latest              0f3e07c0138f        7 months ago        220MB

Docker鏡像和容器的使用 

在docker主節點master主機上操作

鏡像的基本管理和使用

鏡像有多種生成方法:

(1)可以從無到有開始創建鏡像

(2)可以下載並使用別人創建好的現成的鏡像

(3)可以在現有鏡像上創建新的鏡像

可以將鏡像的內容和創建步驟描述在一個文本文件中,這個文件被稱作Dockerfile,通過執行docker build <docker-file>命令可以構建出Docker鏡像

查看鏡像列表

列出本地主機上的鏡像

# ./image.sh

# docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
httpd                      latest              d3017f59d5e2        7 months ago        165MB
busybox                    latest              020584afccce        7 months ago        1.22MB
nginx                      latest              540a289bab6c        7 months ago        126MB
redis                      alpine              6f63d037b592        7 months ago        29.3MB
python                     3.7-alpine          b11d2a09763f        7 months ago        98.8MB
<none>                     <none>              4cda95efb0e4        7 months ago        80.6MB
192.168.7.10:5000/centos   latest              0f3e07c0138f        7 months ago        220MB
centos                     latest              0f3e07c0138f        7 months ago        220MB
registry                   latest              f32a97de94e1        14 months ago       25.8MB
swarm                      latest              ff454b4a0e84        24 months ago       12.7MB
httpd                      2.2.32              c51e86ea30d1        2 years ago         171MB
httpd                      2.2.31              c8a7fb36e3ab        3 years ago         170MB

REPOSITORY:表示鏡像的倉庫源

TAG:鏡像的標簽

IMAGE ID:鏡像ID

CREATED:鏡像創建時間

SIZE:鏡像大小

運行容器

同一倉庫源可以有多個TAG,代表這個倉庫源的不同個版本

# docker run -i -t -d httpd:2.2.31 /bin/bash
be31c7adf30f88fc5d6c649311a5640601714483e8b9ba6f8db853c73fc11638

-i:互動式操作

-t:終端

-d:後臺運行

httpd:2.2.31:鏡像名,使用https:2.2.31鏡像為基礎來啟動容器

/bin/bash:容器互動式Shell

如果不指定鏡像的版本標簽,則預設使用latest標簽的鏡像

獲取鏡像

當本地主機上使用一個不存在的鏡像時,Docker會自動下載這個鏡像。如果需要預先下載這個鏡像,可以使用docker pull命令來下載

格式

# docker pull [OPTIONS] NAME[:TAG|@DIGEST]

OPTIONS說明:

-a:拉取所有tagged鏡像。

--disable-content-trust:忽略鏡像的校驗,預設開啟

查找鏡像

查找鏡像一般有兩種方式,可以通過Docker Hub(https://hub.docker.com/)網站來搜索鏡像,也可以使用docker search命令來搜索鏡像

格式

# docker search [OPTIONS] TERM

OPTIONS說明:

--automated:只列出automated build類型的鏡像

--no-trunc:顯示完整的鏡像描述

--filter=stars:列出收藏數不小於指定值的鏡像

搜索httpd尋找適合的鏡像

# docker search --filter=stars=10 java
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
node                              Node.js is a JavaScript-based platform for s…   8863                [OK]               
tomcat                            Apache Tomcat is an open source implementati…   2739                [OK]               
openjdk                           OpenJDK is an open-source implementation of …   2265                [OK]               
java                              Java is a concurrent, class-based, and objec…   1976                [OK]               
ghost                             Ghost is a free and open source blogging pla…   1188                [OK]               
couchdb                           CouchDB is a database that uses JSON for doc…   347                 [OK]               
jetty                             Jetty provides a Web server and javax.servle…   336                 [OK]               
groovy                            Apache Groovy is a multi-faceted language fo…   92                  [OK]               
lwieske/java-8                    Oracle Java 8 Container - Full + Slim - Base…   46                                      [OK]
nimmis/java-centos                This is docker images of CentOS 7 with diffe…   42                                      [OK]
fabric8/java-jboss-openjdk8-jdk   Fabric8 Java Base Image (JBoss, OpenJDK 8)      28                                      [OK]
cloudbees/java-build-tools        Docker image with commonly used tools to bui…   15                                      [OK]
frekele/java                      docker run --rm --name java frekele/java        12                                      [OK]

NAME:鏡像倉庫源的名稱

DESCRIPTION:鏡像的描述

OFFICIAL:是否是Docker官方發佈

stars:類似GitHub裡面的star,表示點贊、喜歡的意思

AUTOMATED:自動構建

刪除鏡像

格式

# docker rmi [OPTIONS] IMAGE [IMAGE...]

OPTIONS說明:

-f:強制刪除

--no-prune:不移除該鏡像的過程鏡像,預設移除

強制刪除本地鏡像busybox

# docker rmi -f busybox:latest
Untagged: busybox:latest
Deleted: sha256:020584afccce44678ec82676db80f68d50ea5c766b6e9d9601f7b5fc86dfb96d
Deleted: sha256:1da8e4c8d30765bea127dc2f11a17bc723b59480f4ab5292edb00eb8eb1d96b1

容器的基本管理和使用

容器是一種輕量級的、可移植的、自包含的軟體打包技術,使應用程式幾乎可以在任何地方以相同的方式運行。容器由應用程式本身和依賴兩部分組成

運行容器

運行第一個容器

# docker run -it --rm -d -p 80:80 nginx:latest
d7ab2c1aa4511f5ffc76a9bba3ab736fb9817793c6bec5af53e1cfddfb0904cd

-i:互動式操作

-t:終端

-rm:容器退出後隨之將其刪除,可以避免浪費空間

-p:埠映射

-d:容器在後臺運行

過程

簡單描述

(1)下載Nginx鏡像

(2)啟動容器,並將容器的80埠映射到宿主機的80埠

使用docker run來創建容器

(1)檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載

(2)利用鏡像創建並啟動一個容器

(3)分配一個文件系統,併在只讀的鏡像層外面掛載一層可讀寫層

(4)從宿主主機配置的網橋介面中橋接一個虛擬介面到容器中去

(5)從地址池配置一個IP地址給容器

(6)執行用戶指定的應用程式

驗證容器是否正常工作

在瀏覽器輸入地址 http://192.168.7.10

 

 

啟動容器

格式

# docker start [CONTAINER ID]

啟動所有的docker容器

# docker start $(docker ps -aq)
d7ab2c1aa451
be31c7adf30f
dff76b9fb042

操作容器

列出運行中的容器

# docker ps 或者 # docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
d7ab2c1aa451        nginx:latest        "nginx -g 'daemon of…"   8 minutes ago       Up 8 minutes        0.0.0.0:80->80/tcp       distracted_hoover
be31c7adf30f        httpd:2.2.31        "/bin/bash"              26 minutes ago      Up 26 minutes       80/tcp                   priceless_hellman
dff76b9fb042        registry:latest     "/entrypoint.sh /etc…"   21 hours ago        Up 44 minutes       0.0.0.0:5000->5000/tcp   registry

列出所有容器

# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
d7ab2c1aa451        nginx:latest        "nginx -g 'daemon of…"   9 minutes ago       Up 9 minutes        0.0.0.0:80->80/tcp       distracted_hoover
be31c7adf30f        httpd:2.2.31        "/bin/bash"              27 minutes ago      Up 27 minutes       80/tcp                   priceless_hellman
dff76b9fb042        registry:latest     "/entrypoint.sh /etc…"   21 hours ago        Up About an hour    0.0.0.0:5000->5000/tcp   registry

查看具體容器的信息

# docker inspect [container ID or NAMES]

查看容器的使用資源狀況

# docker stats [container ID or NAMES]

查看容器日誌

# docker logs [OPTIONS] [container ID or NAMES]

OPTIONS說明:

--details:顯示更多的信息

-f,--follow:跟蹤實時日誌

--sincestring:顯示自某個timestamp之後的日誌,或相對時

--tailstring:從日誌末尾顯示多少行日誌,預設是all

-t,--timestamps:顯示時間戳

--until string:顯示自某個timestamp之前的日誌,或相對時間

進入容器

格式

# docker exec -it [CONTAINER ID] bash

進入容器後,輸入exit或者按Crtl+C鍵即可退出容器

終止容器

刪除終止狀態的容器

 

# docker rm [CONTAINER ID]

刪除所有處於終止狀態的容器

# docker container prune

刪除未被使用的數據捲

# docker volume prune

刪除運行中的容器

# docker rm -f [CONTAINER ID]

批量停止所有的容器

# docker stop $(docker ps -aq)

批量刪除所有的容器

 

# docker rm $(docker ps -aq)

終止容器進程,容器進入終止狀態

# docker container stop [CONTAINER ID]

導入/導出容器

將容器快照導出為本地文件

格式

# docker export [CONTAINER ID] > [tar file]

# docker export d7ab2c1aa451 > nginx.tar
# ll
總用量 1080192
-rw-------. 1 root root      1569 5月  28 02:19 anaconda-ks.cfg
drwxr-xr-x. 4 root root        34 10月 31 2019 Docker
-rw-r--r--. 1 root root 977776539 11月  4 2019 Docker.tar.gz
drwxr-xr-x. 2 root root      4096 10月 31 2019 images
-rwxr-xr-x. 1 root root       498 10月 31 2019 image.sh
drwxr-xr-x. 2 root root        40 11月  4 2019 jdk
-rw-r--r--  1 root root 128325632 5月  28 17:30 nginx.tar

把容器快照文件再導入為鏡像

格式

# cat [tar file] | docker import - [name:tag]

# cat nginx.tar | docker import - nginx:test
sha256:743846df0ce06109d801cb4118e9e4d3082243d6323dbaa6efdcda74f4c000bf

# docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
nginx                      test                743846df0ce0        17 seconds ago      125MB
httpd                      latest              d3017f59d5e2        7 months ago        165MB
nginx                      latest              540a289bab6c        7 months ago        126MB
redis                      alpine              6f63d037b592        7 months ago        29.3MB
python                     3.7-alpine          b11d2a09763f        7 months ago        98.8MB
<none>                     <none>              4cda95efb0e4        7 months ago        80.6MB
centos                     latest              0f3e07c0138f        7 months ago        220MB
192.168.7.10:5000/centos   latest              0f3e07c0138f        7 months ago        220MB
registry                   latest              f32a97de94e1        14 months ago       25.8MB
swarm                      latest              ff454b4a0e84        24 months ago       12.7MB
httpd                      2.2.32              c51e86ea30d1        2 years ago         171MB
httpd                      2.2.31              c8a7fb36e3ab        3 years ago         170MB

使用docker import命令導入一個容器快照到本地鏡像庫時,將丟棄所有的歷史記錄和元數據信息,即僅保存容器當時的快照狀態

構建自定義鏡像

構建自定義鏡像主要有兩種方式:docker commit和Dockerfile

 docker commit是在以往版本控制系統里提交變更,然後進行變更的提交  Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終創建一個新的鏡像

docker commit

從容器創建一個新的鏡像

格式

# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS說明:

-a:提交的鏡像作者

-c:使用Dockerfile指令來創建鏡像

-m:提交時的說明文字

-p:在commit時,將容器暫停

查看已有的容器 # docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
d7ab2c1aa451        nginx:latest        "nginx -g 'daemon of…"   32 minutes ago      Up 32 minutes       0.0.0.0:80->80/tcp       distracted_hoover
be31c7adf30f        httpd:2.2.31        "/bin/bash"              About an hour ago   Up About an hour    80/tcp                   priceless_hellman
dff76b9fb042        registry:latest     "/entrypoint.sh /etc…"   22 hours ago        Up About an hour    0.0.0.0:5000->5000/tcp   registry
將容器保存為新的鏡像,並添加提交人信息和說明信息 # docker commit -a "xiandian" -m "nginx-test" d7ab2c1aa451 nginx:v1
sha256:0a18e29db3b007302cd0e0011b4e34a756ef44ce4939d51e599f986204ce1f34
構建完成後查看構建結果 # docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
nginx                      v1                  0a18e29db3b0        38 seconds ago      126MB

Dockerfile

Dockerfile是一個文本文檔,其中包含了組合映像的命令,可以使用在命令行中調用任何命令。Docker通過讀取Dockerfile中的指令自動生成映像

知識點

格式

# docker build -f /path/to/a/Dockerfile

Dockerfile一般分為4部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令,“#”為Dockerfile中的註釋

Dockerfile主要指令:

FROM:指定基礎鏡像,必須為第一個命令

MAINTAINER:維護者信息

RUN:構建鏡像時執行的命令

ADD:將本地文件添加到容器中,tar類型文件會自動解壓(網路壓縮資源不會被解壓),可以訪問網路資源,類似wget

COPY:功能類似ADD,但是是不會自動解壓文件,也不能訪問網路資源

CMD:構建容器後調用,也就是在容器啟動時才進行調用

ENTRYPOINT:配置容器,使其可執行化。配合CMD可省去“application”,只使用參數

LABEL:用於為鏡像添加元數據

ENV:設置環境變數

EXPOSE:指定與外界交互的埠

VOLUME:用於指定持久化目錄

WORKDIR:工作目錄,類似於cd命令

USER:指定運行容器時的用戶名或UID,後續的RUN也會使用指定用戶。使用USER指定用戶時,可以使用用戶名、UID或GID,或是兩者的組合。當服務不需要管理員許可權時,可通過該命令指定運行用戶

ARG:用於指定傳遞給構建運行時的變數

ONBUILD:用於設置鏡像觸發器

構建準備

centos:latest為基礎鏡像,安裝jdk1.8並構建新的鏡像centos-jdk

新建文件夾用於存放JDK安裝包和Dockerfile文件

# mkdir centos-jdk

# mv jdk-8u141-linux-x64.tar.gz ./centos-jdk/

# cd centos-jdk/

編寫Dockerfile

# vi Dockerfile

內容
# CentOS with JDK 8
# Author kei
FROM centos                              ##指定基礎鏡像
MAINTAINER kei                         ##指定作者
RUN mkdir /usr/local/java            ##新建文件夾用於存放jdk文件
ADD jdk-8u141-linux-x64.tar.gz /usr/local/java                      ##將JDK文件複製到鏡像內並自動解壓
RUN ln -s /usr/local/java/jdk1.8.0_141 /usr/local/java/jdk      ##創建軟鏈接
ENV JAVA_HOME /usr/local/java/jdk                                     ##設置環境變數
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH ${JAVA_HOME}/bin:$PATH

構建新鏡像 

# docker build -t="centos-jdk" .

Sending build context to Docker daemon  185.5MB

Step 1/9 : FROM centos

 ---> 0f3e07c0138f

Step 2/9 : MAINTAINER dockerzlnewbie

 ---> Running in 1a6a5c210531

Removing intermediate container 1a6a5c210531

 ---> 286d78e0b9bf

Step 3/9 : RUN mkdir /usr/local/java

 ---> Running in 2dbbac61b2cf

Removing intermediate container 2dbbac61b2cf

 ---> 369567834d80

Step 4/9 : ADD jdk-8u141-linux-x64.tar.gz /usr/local/java/

 ---> 8fb102032ae2

Step 5/9 : RUN ln -s /usr/local/java/jdk1.8.0_141 /usr/local/java/jdk

 ---> Running in d8301e932f7c

Removing intermediate container d8301e932f7c

 ---> 7c82ee6703c5

Step 6/9 : ENV JAVA_HOME /usr/local/java/jdk

 ---> Running in d8159a32efae

Removing intermediate container d8159a32efae

 ---> d270abf08fa2

Step 7/9 : ENV JRE_HOME ${JAVA_HOME}/jre

 ---> Running in 5206ba2ec963

Removing intermediate container 5206ba2ec963

 ---> a52dc52bae76

Step 8/9 : ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib

 ---> Running in 41fbd969bd90

Removing intermediate container 41fbd969bd90

 ---> ff44f5f90877

Step 9/9 : ENV PATH ${JAVA_HOME}/bin:$PATH

 ---> Running in 7affe7505c82

Removing intermediate container 7affe7505c82

 ---> bdf402785277

Successfully built bdf402785277

Successfully tagged centos-jdk:latest

查看構建的新鏡像

# docker images

REPOSITORY     TAG         IMAGE ID      CREATED       SIZE

centos-jdk         latest         bdf402785277   11 minutes ago    596MB

使用新構建的鏡像運行容器驗證JDK是否安裝成功

# docker run -it centos-jdk /bin/bash

 java -version

java version "1.8.0_141"

Java(TM) SE Runtime Environment (build 1.8.0_141-b15)

Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)

Docker容器編排

準備兩台虛擬機,一臺為swarm集群Master節點master,一臺為swarm集群Node節點node,所有節點已配置好主機名和網卡,並安裝好docker-ce

容器編排工具提供了有用且功能強大的解決方案,用於跨多個主機協調創建、管理和更新多個容器

Swarm是Docker自己的編排工具,現在與Docker Engine完全集成,並使用標準API和網路

部署Swarm集群

配置主機映射(兩個節點)

修改/etc/hosts文件配置主機映射

# vi /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.7.10 master

192.168.7.20 node

配置時間同步

安裝服務(兩個節點)

安裝chrony服務

# yum install -y chrony

master節點

修改/etc/chrony.conf文件,註釋預設NTP伺服器,指定上游公共NTP伺服器,並允許其他節點同步時間

# sed -i 's/^server/#&/' /etc/chrony.conf

# vi /etc/chrony.conf

local stratum 10

server master iburst

allow all

重啟chronyd服務並設為開機啟動,開啟網路時間同步功能

# systemctl enable chronyd && systemctl restart chronyd

 

# timedatectl set-ntp true

node節點

修改/etc/chrony.conf文件,指定內網 Master節點為上游NTP伺服器

# sed -i 's/^server/#&/' /etc/chrony.conf

# echo server 192.168.7.10 iburst >> /etc/chrony.conf

 

重啟服務並設為開機啟動

# systemctl enable chronyd && systemctl restart chronyd

查詢同步(兩個節點)

# chronyc sources

210 Number of sources = 1

MS Name/IP address            Stratum Poll Reach LastRx Last sample

==================================================================

^* master                       10   6    77    7   +13ns[-2644ns] +/-   13us

配置Docker API(兩個節點)

開啟docker API

# vi /lib/systemd/system/docker.service

   ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

修改為

   ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

# systemctl daemon-reload

# systemctl restart docker

# ./image.sh

初始化集群(master節點)

創建swarm集群

# docker swarm init --advertise-addr 192.168.7.10

Swarm initialized: current node (jit2j1itocmsynhecj905vfwp) is now a manager.

 

To add a worker to this swarm, run the following command:

 

    docker swarm join --token SWMTKN-1-2oyrpgkp41z40zg0z6l0yppv6420vz18rr171kqv0mfsbiufii-c3ficc1qh782wo567uav16n3n 192.168.7.10:2377

 

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

 

初始化命令中“--advertise-addr”選項表示管理節點公佈它的IP是多少。其它節點必須能通過這個IP找到管理節點

輸出結果中包含3個步驟:

(1)Swarm創建成功,swarm-manager成為manager node

(2)添加worker node需要執行的命令

(3)添加manager node需要執行的命令   

node節點加入集群(node節點)

複製前面的docker swarm join命令,執行以加入Swarm集群

# docker swarm join --token SWMTKN-1-2oyrpgkp41z40zg0z6l0yppv6420vz18rr171kqv0mfsbiufii-c3ficc1qh782wo567uav16n3n 192.168.7.10:2377

This node joined a swarm as a worker.

驗證集群(master節點) 

查看各節點狀態

# docker node ls

ID HOSTNAME STATUS AVAILABILITY  MANAGER STATUS  ENGINE VERSION

jit2j1itocmsynhecj905vfwp *     master    Ready    Active    Leader    18.09.6

8mww97xnbfxfrbzqndplxv3vi       node   Ready    Active             18.09.6

安裝portainer(master節點)

Portainer是Docker的圖形化管理工具,提供狀態顯示面板、應用模板快速部署、容器鏡像網路數據捲的基本操作(包括上傳和下載鏡像、創建容器等操作)、事件日誌顯示、容器控制台操作、Swarm集群和服務等集中管理和操作、登錄用戶管理和控制等功能

安裝

# docker volume create portainer_data

portainer_data  

# docker service create --name portainer --publish 9000:9000 --replicas=1 --constraint 'node.role == manager' --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock --mount type=volume,src=portainer_data,dst=/data portainer/portainer -H unix:///var/run/docker.sock

nfgx3xci88rdcdka9j9cowv8g

overall progress: 1 out of 1 tasks

1/1: running  

verify: Service converged

登錄portainer

打開瀏覽器,輸入地址http://master_IP:9000訪問Portainer主頁  首次登錄時需設置用戶名和密碼,然後輸入設置的用戶名和密碼進行登錄,進入Swarm控制台

運行service

運行(master節點)

部署一個運行httpd鏡像的Service

# docker service create --name web_server httpd

查看當前Swarm中的Service

# docker service ls

ID             NAME      MODE      REPLICAS     IMAGE         PORTS

2g18082sfqa9    web_server   replicated    1/1         httpd:latest

REPLICAS顯示當前副本信息,1/1意思是web_server這個Service期望的容器副本數量為1,目前已經啟動的副本數量為1,即當前Service已經部署完成

查看Service每個副本的狀態

# docker service ps web_server

ID        NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS

4vtrynwddd7m  web_server.1  httpd:latest  node   Running   Running 27 minutes ago

Service唯一的副本被分派到node,當前的狀態是Running

service伸縮(master節點)

副本數增加到5

# docker service scale web_server=5

web_server scaled to 5

overall progress: 5 out of 5 tasks

1/5: running  

2/5: running  

3/5: running  

4/5: running  

5/5: running  

verify: Service converged

查看副本的詳細信息

# docker service ls

ID           NAME      MODE      REPLICAS   IMAGE      PORTS

2g18082sfqa9  web_server   replicated    5/5          httpd:latest

# docker service ps web_server

ID         NAME        IMAGE        NODE        DESIRED STATE    CURRENT STATE        ERROR        PORTS

4vtrynwddd7m        web_server.1        httpd:latest        node                Running             Running 36 minutes ago

n3iscmvv9fh5        web_server.2        httpd:latest        master              Running             Running about a minute ago

mur6cc8k6x7e        web_server.3        httpd:latest        node                Running             Running 3 minutes ago

rx52najc1txw        web_server.4        httpd:latest        master              Running             Running about a minute ago

jl0xjv427goz        web_server.5        httpd:latest        node                Running             Running 3 minutes ago

減少副本數

# docker service scale web_server=2

web_server scaled to 2

overall progress: 2 out of 2 tasks

1/2: running  

2/2: running  

verify: Service converged

# docker service ps web_server

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR          

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.我們要知道為啥用框架? 代碼可讀性提高,加快開發速度,提高代碼穩定性,重覆代碼的封裝。 2.用框架有啥好處 結構清晰,調用方便,能低代碼開發。 3.怎麼用框架 根據邏輯邏輯與功能現實,把不同分類的東西,按照一定的規則,區分好模塊,一個令你滿意的框架就出來了 註意點: 技術薄弱的學員,不要著急學框 ...
  • Elasticsearch 入門(三)使用Elasticsearch.Net & NEST作為elasticsearch客戶端 GitHub倉庫 https://github.com/elastic/elasticsearch-net 選擇 Elasticsearch.Net 作為客戶端 連接方式 ...
  • LINQ 的優勢並不是提供了什麼新功能,而是讓我們能夠用更新、更簡單、更優雅的方法來實現原有的功能。不過通常來講,這類功能所帶來的就是對性能上的影響——LINQ 也不例外。本篇文章的主要目的就是讓你瞭解 LINQ 查詢對性能的影響。我們將介紹最基本的 LINQ 性能分析方法,並提供一些數據。還會給出 ...
  • 搞學習 猿學:http://yuanxue365.com/簡書:https://www.jianshu.com/doyoudo:http://www.doyoudo.com/好知網:http://www.howzhi.com/學小易(大學生搜題)https://www.51xuexiaoyi.com ...
  • 上一篇(https://www.cnblogs.com/meowv/p/12974439.html)完成了全網各大平臺的熱點新聞數據的抓取,本篇繼續圍繞抓取完成後的操作做一個提醒。當每次抓取完數據後,自動發送郵件進行提醒。 在開始正題之前還是先玩一玩之前的說到卻沒有用到的一個庫PuppeteerSh ...
  • [導讀] 前文分析了Linux設備驅動的驅動模型,本文來聊聊Platform_driver/Platform_device這個類。做嵌入式Linux的驅動,這個也是繞不開的,所以來學習分析總結一下。 上文閱讀: 註:代碼分析基於linux-5.4.31 為什麼有Platform_driver 前文談 ...
  • 預設/dev下是沒有spi設備的JetPack版本JetPack-L4T-3.2.1-linux-x64_b23.run下載Kernelsudo git clone http://github.com/jetsonhacks/buildJetsonTX2Kernel.gitgit checkout ... ...
  • [導讀] Linux設備林林總總,嵌入式開發一個繞不開的話題就是設備驅動開發,在做具體設備驅動開發之前,有必要對Linux設驅動模型有一個相對清晰的認識,將會幫助驅動開發,明白具體驅動介面操作符相應都做些什麼。 個人對於驅動模型的理解概括起來就是一句話:利用面向對象編程思想,實現設備分層管理軟體體系 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...