centos7安裝docker
安裝儲存裝置映射包
yum install -y yum-utils device-mapper-persistent-data lvm2
添加docker軟體鏡像
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安裝dockerCE
yum install -y docker-ce
啟動docker
systemctl start docker
自動啟動docker
systemctl enable docker
安裝docker-compose(叢集管理)Compose 是用于定義和運作多容器 Docker 應用程式的工具
yum install -y epel-release
yum install -y python-pip
pip install --upgrade pip
pip install docker-compose
檢視版本
docker-compose -version
建立子網段
docker network create --subnet=10.0.192.0/24 docker-net
安裝redis
搜尋元件
docker search redis
拉取redis鏡像
docker pull redis:latest
準備redis.conf
mkdir -p /usr/local/redis/conf
cd /usr/local/redis/conf
wget https://raw.githubusercontent.com/antirez/redis/5.0.3/redis.conf -O /usr/local/redis/conf/redis.conf
修改配置檔案
vim conf/redis.conf
修改内容(修改以下三項,其他不變)
bind 0.0.0.0 #所有IP都可以通路
protected-mode no # 關閉保護模式
appendonly yes
放行端口号
firewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --reload
建立并啟動容器
docker run --net host -v /data/redis/redis6379:/data -v /data/config/redis6379/redis.conf:/usr/local/etc/redis/redis.conf --name redis10 -d redis:latest redis-server /usr/local/etc/redis/redis.conf
指令詳解
-p 6379:6379:端口映射
-v /usr/local/redis/conf/redis.conf: /usr/local/etc/redis/redis.conf :把主控端配置好的redis.conf放到容器中
-v /usr/local/redis/data:/data:把redis持久化的資料在主控端内顯示,做資料備
份
redis-server /usr/local/etc/redis/redis.conf 讓redis按照redis.conf的配置啟動
–appendonly yes redis啟動後資料持久化
連接配接redis
docker exec -it redis redis-cli
1* 下載下傳鏡像
docker pull 名稱:tag
docker pull hub.c.163.com/nce2/ubuntu:16.04
2* 檢視版本
docker version
docker --version
3* 檢視目前鏡像清單
docker images
檢視鏡像詳細資訊
docker image inspect 鏡像id
docker image inspect fc99158db54a
删除docker基礎鏡像
docker rmi -f 鏡像名稱
docker rmi -f nvtienanh/hadoop-resourcemanager
4* 檢視目前docker資訊
docker info
5* 運作的容器資訊
docker ps
檢視目前容器清單
docker ps -a
6* 運作容器中鏡像ubuntu
docker run -it repository名稱:tag /bin/bash
docker run -it hub.c.163.com/nce2/ubuntu:16.04 /bin/bash
docker run -it ubuntu-upstart:latest /bin/bash
7* 删除鏡像
docker rmi repository名稱
docker rmi mysql
8* 使用鏡像建立新執行個體
docker create --name 示例名 -p 主機端口:容器端口 respository名稱
docker create --name dev_tomcat -p 8080:8080 rossbachp/apache-tomcat8
docker create --name dev_mysql -p 3306:3306 mysql/mysql-server
docker create --name dev_mysql1 -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mysql/mysql-server
9* 搜尋鏡像
docker search 元件名
docker search tomcat8
10* 配置設定一個終端(進入docker)
docker exec -i -t 容器名稱/容器id /bin/bash
docker exec -i -t 24e6fd60d600 /bin/bash
docker exec -i -t mynginx /bin/bash
docker exec -i -t myredis /bin/bash
docker exec -i -t webadmin /bin/bash
11* 建立子網及網絡相關
docker network create --subnet=子網網段/子網路遮罩 網絡名稱
docker network create --subnet=192.168.101.0/24 docker-net
docker network COMMAND
子指令 說明
docker network connect 将容器連接配接到網絡。
docker network create 建立新的 Docker 網絡。預設情況下,在 Windows 上會采用 NAT 驅動,在 Linux 上會采用Bridge 驅動。可以使用 -d 參數指定驅動(網絡類型)。
docker network disconnect 斷開容器的網絡。docker network disconnect -f 網絡名 容器名
docker network disconnect -f mydockeroverlay1 redis13
docker network inspect 提供 Docker 網絡的詳細配置資訊。docker inspect name(容器名/鏡像名)
docker network ls 用于列出運作在本地 Docker 主機上的全部網絡。
docker network prune 删除 Docker 主機上全部未使用的網絡。
docker network rm 删除 Docker 主機上指定網絡。
12* 運作容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
OPTIONS說明:
-a stdin: 指定标準輸入輸出内容類型,可選 STDIN/STDOUT/STDERR 三項
-d: 背景運作容器,并傳回容器ID
-i: 以互動模式運作容器,通常與 -t 同時使用
-P: 随機端口映射,容器内部端口随機映射到主機的高端口
-p: 指定端口映射,格式為:主機(宿主)端口:容器端口
-t: 為容器重新配置設定一個僞輸入終端,通常與 -i 同時使用
–name=“nginx-lb”: 為容器指定一個名稱
–dns 8.8.8.8: 指定容器使用的DNS伺服器,預設和宿主一緻
–dns-search example.com: 指定容器DNS搜尋域名,預設和宿主一緻
-h “mars”: 指定容器的hostname
-e username=“ritchie”: 設定環境變量
–env-file=[]: 從指定檔案讀入環境變量
–cpuset=“0-2” or --cpuset=“0,1,2”: 綁定容器到指定CPU運作
-m :設定容器使用記憶體最大值
–net=“bridge”: 指定容器的網絡連接配接類型,支援 bridge/host/none/container: 四種類型
–link=[]: 添加連結到另一個容器
–expose=[]: 開放一個端口或一組端口
–volume , -v: 綁定一個卷
示例1建立并啟動redis
docker run -p 主機端口:容器端口 -v 主機路徑:容器路徑(把redis持久化的資料在主控端内顯示,做資料備份) -v 主機配置檔案:容器配置檔案 --privileged=true(容器内真正root權限) --name 容器名稱 -d(背景運作傳回容器id) 運作指定配置檔案
docker run -p 6379:6379 -v /usr/local/redis/data:/data -v /usr/local/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf --privileged=true --name redis -d redis redis-server /usr/local/etc/redis/redis.conf
在運作docker容器時可以加如下參數來保證每次docker服務重新開機後容器也自動重新開機
docker run --restart=always
如果已經啟動了則可以使用如下指令
docker update --restart=always <CONTAINER ID>
13* docker鏡像啟動、停止、重新開機
docker start :啟動一個或多個已經被停止的容器
docker stop :停止一個運作中的容器
docker restart :重新開機容器
14* 删除docker容器
先找到要删除的容器id
docker ps -a
docker rm 容器id
停止所有容器
docker stop $(docker ps -a -q)
删除所有容器
docker rm $(docker ps -a -q)
15* 跨主機overlay網絡
Docerk overlay 網絡需要一個 key-value 資料庫用于儲存網絡狀态資訊,包括 Network、Endpoint、IP 等,Consul、Etcd 和 ZooKeeper 都是 Docker 支援的 key-vlaue 軟體。在這裡介紹etcd以及console兩種資料庫的搭建方法!
搭建etcd資料庫
第一步:在docker01上運作如下指令
yum install etcd
vi /usr/lib/systemd/system/etcd.service
vi /etc/etcd/etcd.conf
rm -rf /var/lib/etcd/default.etcd
systemctl daemon-reload
systemctl start etcd
etcd --name docker01 --initial-advertise-peer-urls http://10.0.192.10:2380 \
--listen-peer-urls http://10.0.192.10:2380 \
--listen-client-urls http://10.0.192.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.192.10:2379 \
--initial-cluster-token etcd-cluster \
--initial-cluster docker01=http://10.0.192.10:2380,docker02=http://10.0.192.20:2380 \
--initial-cluster-state new
第二步:在docker02上執行如下指令
cd /usr/local/src/
yum install etcd
etcd --name docker02 --initial-advertise-peer-urls http://10.0.192.20:2380 \
--listen-peer-urls http://10.0.192.20:2380 \
--listen-client-urls http://10.0.192.20:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.192.20:2379 \
--initial-cluster-token etcd-cluster \
--initial-cluster docker01=http://10.0.192.10:2380,docker02=http://10.0.192.20:2380 \
--initial-cluster-state new
第三步:分别在兩個節點檢查etcd cluster狀态
#在docker01上檢查
etcdctl cluster-health
member 21530c593b6325d7 is healthy: got healthy result from http://10.0.192.10:2379
member f4d46a04f640940c is healthy: got healthy result from http://10.0.192.20:2379
cluster is healthy
#在docker02上檢查
etcdctl cluster-health
member 21530c593b6325d7 is healthy: got healthy result from http://10.0.192.10:2379
member f4d46a04f640940c is healthy: got healthy result from http://10.0.192.20:2379
cluster is healthy
第四步:修改/etc/docker/daemon.json配置檔案
#docker01修改後内容如下
{
"registry-mirrors": ["https://f0lt06pg.mirror.aliyuncs.com"],
"dns": ["1.1.1.1","114.114.114.114"],
"data-root": "/data/docker",
"cluster-store": "etcd://10.0.192.10:2379",
"cluster-advertise": "10.0.192.10:2375"
}
#docker02修改後内容如下
{
"registry-mirrors": ["https://f0lt06pg.mirror.aliyuncs.com"],
"dns": ["1.1.1.1","114.114.114.114"],
"data-root": "/data/docker",
"cluster-store": "etcd://10.0.192.20:2379",
"cluster-advertise": "10.0.192.20:2375"
}
第五步:重新開機docker服務
systemctl daemon-reload
systemctl restart docker.service
建立overlay網絡
第一步:在docker01上建立一個damo的overlay network
docker network ls
docker network create --subnet=10.0.193.0/24 -d overlay mydockeroverlay1
第二步:已經可以在node2上看到這個overlay網絡了
docker network ls
第三步:檢視demo網絡的詳細資訊
docker network inspect mydockeroverlay1
第三步:如果是通過etcd建立的,可以檢視etcd的key-value
etcdctl ls
overlay網絡使用案例介紹
這裡就使用第一章節的flask-redis來做實驗,在docke01上部署redis容器,在docker02上部署app容器,并保證能正常運作!
第一步:在docker01上運作redis容器,并加入到demo網絡
docker run -d --name redis --network demo redis
第二步:在docker02上運作flask-redis容器,也加入到demo網絡
docker run -d -p 5000:5000 --network demo -e REDIS_HOST=redis --name flask-redis flask-redis
第三步:通路docker02的5000端口,檢視結果。如果出現和第一章相同結果,說明跨主機網絡已互通!
16* 檢視docker日志
docker logs 容器名稱
docker logs kafka1
檢視最近30分鐘的日志
docker logs --since 30m CONTAINER_ID
docker logs --since 30m 992adf083c14
檢視某時間之後的日志
docker logs -t --since="2021-06-30T13:23:37" CONTAINER_ID
檢視某時間段日志
docker logs -t --since="2021-06-30T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID
檢視指定時間後的日志,隻顯示最後100行
docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID
17* docker鏡像遷移,将本地docker容器遷移到服務端
從docker容器生成鏡像
docker commit -a "zhaoolee" -m “完成uwsgi的配置” qs zhaoolee-qs:1.0
将docker鏡像導出為靜态檔案
docker save zhaoolee-qs:1.0 > qs01.tar
通過将scp将靜态檔案發送到服務端
scp ./qs01.tar [email protected]:/qs01.tar
将靜态檔案還原為鏡像, 并導入docker
docker load < qs01.tar
從剛剛導入的鏡像建立容器
docker run --net host -v /data/redis/redis6379:/data -v /data/config/redis6379/redis.conf:/usr/local/etc/redis/redis.conf --name redis10 -d zhaoolee-qs:1.0 redis-server /usr/local/etc/redis/redis.conf
18* 複制容器内檔案夾到宿主
docker cp 容器名:要拷貝的檔案在容器裡面的路徑 要拷貝到主控端的相應路徑
示例
docker cp hadoop3a:/opt/hadoop-3.2.1 /tmp/hadoop3a
Docker-----五種網絡模式
我們在使用docker run建立Docker容器時,可以用–net選項指定容器的網絡模式,Docker有以下4種網絡模式:
· host模式,使用–net=host指定。
· container模式,使用–net=container:NAME_or_ID指定。
· none模式,使用–net=none指定。
· bridge模式,使用–net=bridge指定,預設設定。
· overlay模式,使用–net=overlay指定
1 host模式
Docker使用的網絡實際上和主控端一樣,在容器内看到的網卡ip是主控端上的ip。
衆所周知,Docker使用了Linux的Namespaces技術來進行資源隔離,如PID Namespace隔離程序,Mount Namespace隔離檔案系統,Network Namespace隔離網絡等。一個Network Namespace提供了一份獨立的網絡環境,包括網卡、路由、Iptable規則等都與其他的Network Namespace隔離。一個Docker容器一般會配置設定一個獨立的Network Namespace。但如果啟動容器的時候使用host模式,那麼這個容器将不會獲得一個獨立的Network Namespace,而是和主控端共用一個Network Namespace。容器将不會虛拟出自己的網卡,配置自己的IP等,而是使用主控端的IP和端口。
2 container模式
多個容器使用共同的網絡看到的ip是一樣的。
在了解了host模式後,這個模式也就好了解了。這個模式指定新建立的容器和已經存在的一個容器共享一個Network Namespace,而不是和主控端共享。新建立的容器不會建立自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口範圍等。同樣,兩個容器除了網絡方面,其他的如檔案系統、程序清單等還是隔離的。兩個容器的程序可以通過lo網卡裝置通信。
3 none模式
這種模式下不會配置任何網絡。
這個模式和前兩個不同。在這種模式下,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等資訊。需要我們自己為Docker容器添加網卡、配置IP等。
4 bridge模式
bridge模式是Docker預設的網絡設定,此模式會為每一個容器配置設定Network Namespace、設定IP等,并将一個主機上的Docker容器連接配接到一個虛拟網橋上。
類似于Vmware的nat網絡模式。同一個主控端上的所有容器會在同一個網段下,互相之間是可以通信的。
5 overlay模式
容器在兩個跨主機進行通信的時候,是使用overlay network這個網絡模式進行通信,如果使用host也可以實作跨主機進行通信,直接使用這個實體的ip位址就可以進行通信。overlay它會虛拟出一個網絡比如10.0.9.3這個ip位址,在這個overlay網絡模式裡面,有一個類似于服務網關的位址,然後把這個包轉發到實體伺服器這個位址,最終通過路由和交換,到達另一個伺服器的ip位址。