天天看點

docker的安裝以及基本應用

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位址。