Docker 官方安裝說明地址linux
解釋一下上圖的幾個關鍵詞:redis
Client
:這就是你所看到的 docker 控制終端.DOCKER_HOST
:這是 docker 運行的總體運行時上下文Docker daemon
:這是 Docker 的守護程序,由他來和 Client 進行通訊,獲取 Client 的命令,並對 Image Container 等組件進行統一管理.Images
:這是一切容器運行的模板或者是基礎,容器都是經過 image 來建立的.Containers
:由 Image 所建立的運行實例,程序都運行在容器中,一個 Image 能夠擴展出 N 個 ContainerDocker Registry
: Docker Image 的存放庫,通常狀況下都是使用官方的 DockerHub.com.不過,你也能夠搭建本身的 Docker Registry 將 Image 管理私有化.Docker 安裝成功後,請你在命令行中使用docker info
來確認 Docker 是否正確的安裝在本地環境中.docker
docker run -t -i ubuntu /bin/bash
shell
若是,啓動成功的話,你會看到你的命令行變成ubuntu
root@c8fabbcb9f8a:/#
vim
@
符號後面的這串字符可能和個人不太同樣,他們都是隨機生成的容器 IDbash
你能夠嘗試在 Container 終端中使用 ps aux
,hostname
,ip a
等命令,來體會容器的便利性.網絡
你還能夠在 Container 中安裝你所須要的工具,你可使用 apt-get update && apt-get install vim
來給他安裝 vim.架構
請你記住,只要不是在 Image 中所包含的,當 Container 被 Remove 後,這一切都將不復存在.微服務
接着,咱們來一個個解釋命令是什麼意思:
docker run
:讓 docker 啓動一個容器的命令.-t
:建立一個虛擬的 TTY 終端.-i
:表明咱們建立的 Container 是會被捕獲 STDIN
的.ubuntu
:這是咱們啓動 Container 所對應的 Image,若是須要指定版本的話能夠經過 ubuntu:18.04
這種方式./bin/bash
:這是當 Container 啓動完成後,就會執行這個命令.最後,輸入exit
接上回車來中止這個終端.這時候你會退回到你本身的操做系統終端中,那咱們怎麼去看剛剛建立的容器去哪裏了呢.
輸入docker ps -a
你會看到下面這樣的內容
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8fabbcb9f8a ubuntu "/bin/bash" 7 seconds ago Exited (0) 4 seconds ago elated_banzai
複製代碼
咱們能夠經過這些發現不少有用的信息:
CONTAINER ID
:咱們以前 tty 裏面看到的容器 ID.IMAGE
: Container 所使用的容器.COMMAND
: Container 啓動後所使用的命令.CREATED
: Container 建立的時間.STATUS
: Container 目前的狀態.PORTS
: Container 所暴露出內部的端口,不過咱們這個實例沒有,後面的實例中咱們會看到的具體的操做和概念.NAMES
:Container 的名字,咱們能夠在 container run 的時候經過--name
指定名字,若是沒有指定,那麼 docker 會自動生成一個名字.docker ps
,docker container ls
這 2 個命令有一樣的結果,就是查看當前正在運行的 Containers.若是,須要查看全部的容器,須要在命令後面加上-a
docker start elated_banzai
或者docker start c8fabbcb9f8a
在 docker start
命令後面跟上 container 的 name 或者 id 均可以從新啓動它.
可是,咱們會發現此次啓動之後,咱們沒有進入終端,可是查看最新的狀態,他倒是 UP 的狀態.這是爲何呢
由於,咱們此次只是重啓了 Container,可是並無經過 tty
鏈接到這個容器上去.
那咱們還想鏈接回去怎麼辦呢,下面咱們會講到
docker exec -i -t elated_banzai /bin/bash
固然,上面使用 Container name
的地方也能夠互換爲 Container id
.在 docker 命令中,全部指定 Container 的地方,都是 name
和 id
能夠互換的.
這個命令比較簡單,與 docker run
基本上是相似的,這裏就不作展開講解了.
首先,咱們下面的命令,來建立一個叫 log_container
的 Container
docker run -d --name log_container ubuntu /bin/sh -c "while true;do echo hello world; sleep 3; done"
這時,可能你會發現,這條命令裏面多了一個 -d
的配置,他是用來指定使用 daemon 的模式來運行這個 Container.
咱們在最後寫了一個死循環的 shell 腳本,讓他每 3 秒輸出一個 hello world.
回車之後,他只是輸出了這個 container 的 id
,咱們能夠經過下面的命令結合 id
或者 name
來看輸出的內容.
docker logs log_container
添加-f
來持續查看他的輸出,這個和 linux 中的 tail
命令是相似的.
咱們還能夠添加-t
來查看輸出的時間戳.
docker top name/id
docker stats
,docker stats ContainerName1 ContainerName2...
docker stop name/id
docker rm name/id
這個命令若是不添加-f
,那咱們只能刪除已經中止的容器.
docker inspect name/id
這個命令顯示的內容比較多,不過大部分都能經過keyname
看懂,若是有不清楚的部分請自行查閱相關文檔.
docker images
,docker image ls
docker images
Dockerfile
是一個使用基本的 Docker DSL 語法的指令來構建 Docker Image 的文件. 經過,Dockerfile
來構建 Image ,更具有重複性,透明性和冪等性.
基礎理論基本上介紹的差很少了,那麼咱們直接上乾貨.
首先,咱們建立 Redis 的主鏡像
$ mkdir redis-replica
$ cd redis-replica
$ touch Dockerfile
複製代碼
Dockerfile:
#使用的母鏡像
FROM redis
#維護者信息,這裏填的是我本身的郵箱
MAINTAINER crowhyc@163.com
#環境變量,添加之後能夠在容器和接下來的命令裏面均可以使用
#這個環境變量是用於定義這個鏡像的版本和日期
ENV REFESHED_AT 2020-04-01
#用來向基於Image建立的 Container 添加捲
#一個卷是能夠存在於一個或多個 Container 內特定的目錄,這個目錄能夠共享數據或對數據進行持久化功能
#下面這個 VOLUME 會在 Container 裏面建立這 2 個目錄
VOLUME ["/var/lib/redis","/var/log/redis/"] #基於此 Image 建立的 Container 會對外暴露 6379 接口
#能夠經過 docker ports name/id 來查詢 Container 暴露接口與本地接口所映射的關係
#也能夠在 Container docker run 的時候經過-p 6379:6379 把他綁定到指定的 port 上
EXPOSE 6379
#用於指定一個 Container 啓動時要運行的命令,相似於後面會遇到的 RUN 命令
#只是 RUN 指令是指定 Image 被構建時須要運行的命令
#docker run 命令能夠覆蓋 CMD 命令,這裏留空的目的是讓 docker run 的時候能夠自定義須要執行的命令
#後面介紹到的 ENTRYPOINT 命令則不能夠被覆蓋
CMD [] 複製代碼
保存文件後,咱們運行下面的這條命令
docker build -t crowhyc/redis-replica:1.0 .
咱們來解釋一下這條命令
docker build
是用來建立鏡像的.
-t
和crowhyc/redis-replica:1.0
是用來代表後面咱們會用這種格式的方式來指定 Image 的名稱和版本.
最後,還有一個不起眼的.
這個是用來指定 Dockerfile 的地址..
是說明 Dockerfile 就在當前目錄下
咱們不會 run 這個 Image.它是接下來咱們 redis-primary 和 redis-slave 的母鏡像
$ mkdir redis-primary
$ cd redis-primary
$ touch Dockerfile
複製代碼
FROM crowhyc/redis-primary:1.0
MAINTAINER crowhyc "crowhyc@163.com"
ENV REFRESHED_AT 2020-04-01
#是 Container 啓動之後執行的命令,與 CMD 不一樣,Container 啓動的命令不能覆蓋它
ENTRYPOINT ["redis-server","--logfile /var/log/redis/redis-server.log"] 複製代碼
緊接着,咱們建立 redis 的主鏡像
docker build -t crowhyc/redis-primary:1.0 .
$ mkdir redis-slave
$ cd redis-slave
$ touch Dockerfile
複製代碼
FROM crowhyc/redis-replica:1.0
MAINTAINER crowhyc "crowhyc@163.com"
ENV REFRESHED_AT 2020-04-01
#這裏有一點須要注意的是,咱們第三個參數使用的是 redis-primary 當咱們啓動 primary Container 的時候須要與這個名字相同
ENTRYPOINT ["redis-server","--logfile /var/log/redis/redis-server.log","--slaveof redis-primary 6379"] 複製代碼
docker network create redis-cluster
首先,咱們使用上面的命令建立一個新的 network.
docker network
是 docker Container 之間用來通訊的網絡,用戶能夠本身建立網絡,用來組件本身的集羣網絡.
docker network ls
一樣,咱們也能夠用上面的命令來查看全部的網絡
接着,咱們使用下面的docker run
來啓動咱們的 primary redis server.
docker run -d -h redis-primary --net redis-cluster --name reids-primary crowhyc/redis-primary:1.0
-h
是一個以前沒有出現過的新標誌,他用來設置 Container 的 hostname,這會覆蓋默認的行爲即將 Container 主機名設置爲 ContainerId.
使用這個標誌能夠保證redis-primary
被做爲 Container 的 hostname,並被本地的 DNS 服務正確解析.
--net
是用來設定這個 Container 所使用的 Network
咱們輸入 docker logs 命令去查看日誌
docker logs -f redis-primary
稍做等待,你會發現--根本什麼都沒有...那這是爲何呢?
這是由於咱們在作 redis-primary
的時候,讓日誌記錄到了/var/log/redis/redis-server.log 這個文件裏面.
接着,咱們用更加巧妙的方式去觀察相似這種狀況下的日誌輸出.
docker run -it --rm --volumes-from redis-primary ubuntu cat /var/log/redis/redis-server.log
這下咱們就能看到對應的 redis-primary
的日誌了,若是出現了Ready to accept connections
說明 redis-primary
已經啓動成功.
接着咱們來爲他啓動 2 個 redis-slave
吧
docker run -d -h redis-slave01 --net redis-cluster crowhyc/redis-slave:1.0
docker run -d -h redis-slave02 --net redis-cluster crowhyc/redis-slave:1.0
接着咱們用上面剛剛學的 docker run 來觀察 slave 是否和 primary 創建了聯繫 docker run -it --rm --volumes-from redis-slave01 ubuntu cat /var/log/redis/redis-server.log
docker run -it --rm --volumes-from redis-slave02 ubuntu cat /var/log/redis/redis-server.log
若是,咱們能看到相似於MASTER <-> REPLICA sync: Finished with success
這樣的日誌,說明咱們 slave 與 primary 已經鏈接成功了 接下來,咱們用 docker 的方式來測試 redis 吧
docker run -it --rm --net redis-cluster redis /bin/bash
緊接着咱們鏈接到 redis-primary
redis-cli -h redis-primary
而後,咱們 SET 一個值
redis-primary:6379> set "test" 1234
接着,咱們再進入 redis-slave01
docker exec -it redis-slave01 /bin/bash
redis-cli -h localhost
get "test"
若是,咱們在執行完get
命令後看到了"1234"說明咱們的 redis 集羣已經完成搭建了.