虛擬容器化學習----Docker學習
安裝前準備
yum install -y yum-utils device-mapper-persistent-data lvm2
安裝資料儲存驅動包 , 安裝yum工具yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
設定安裝源yum makecache fast
yum自動檢測最快安裝源
安裝
yum -y install docker-ce
安裝docker開源社群版本
service docker start
啟動docker服務
檢測
docker version
docker pull hello-world
下載docker hello-word
docker run hello-world
更換阿里雲的映象加速
- 登入阿里雲
- 搜尋映象加速器
- 根據相關操作文件操作即可
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [加速器地址]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker是什麼
Docker 是一種CS架構的軟體, Docker 是提供應用打包,部署於執行引用的容器平臺
docker 引擎包裹:
- docker 引擎
- docker REST API
- docker CLI
Docker 使用了HTTP 協議,docker的兼容於拓展很好
docker 結構
- 客戶端:docker CLI
- 通訊層:REST API
- 引擎:docker daemon
容器與映象
映象: 映象是檔案,是隻讀的,提供了執行程式完整的軟硬體資源,是應用程式的集裝箱
容器: 映象的例項,由Docker負責建立,容器之間彼此隔離
docker 容器與映象在宿主機上的安裝路徑 /var/lib/docker
Docker 常用命令
- docker pull 映象名<:tags> - 從遠端倉庫抽取映象
- tags:指定版本型別
- docker images - 檢視本地映象
- docker run 映象名 <:tags> - 建立容器,啟動應用
- 如果在執行run的時候,映象在沒有pull到本地的話docker會先去pull latest 版本的映象 latest 版本為使用最多的版本
- tags:指定版本型別
- docker ps - 檢視正在執行中的映象
- docker rm <-f> 容器id - 刪除容器
- 如果容器在執行的情況下 <-f> 強制刪除
- docker rmi <-f> 映象名<:tags> - 刪除映象
- 如果映象存在且有容器在執行的情況下 <-f> 強制刪除
- tags:指定版本型別
- docker stop 容器id - 停止容器
- docker exec [-it ] 容器id linux 命令...[bash || /bin/bash]
- exec 在容器內部執行命令
- -it 使用互動的方式執行命令
PS
-
hub.docker.com
docker 遠端中央倉庫 -
在開發中可以使用 -f 強制移除,但是在開發環境中不能這麼做,-f 相當於強制關機。
-
docker hub 一般有圖片或者映象名為需要的軟體名一般是官方提供的。其他的通常是有第三方或個人提供的。第三方的一般不推薦,除非你對它非常瞭解
Docker 宿主機與容器通訊
docker run -p 宿主機埠:容器內部埠 -d 容器名
- -p 埠對映
- -d 後臺執行
檢視
容器生命週期
DockerFile 構建映象
什麼是Dockerfile
- DockerFile 是一個包含用於組合映象的命令的文字文件
- Docker通過讀取Dockerfile中的指定命令按步自動生成映象
- docker build -t 機構/映象名<:tags> Dockerfile 目錄
Docker 的分層(Docker layer)
docker file 在構建的過程中,每一步都會建立一個臨時容器,這個臨時容器是隻讀的,好處:臨時容器在使用的時候的好處在於可以共用。
列如
-
構建一個普通的Dockerfile
-
對Dockerfile重新進行編輯
修改完之後重新build,之後輸出如下
它使用了快取,這裡看到沒有使用快取的是由輸出的。使用快取的是沒有輸出的
Dockerfile 基礎命令
-
FROM 容器版本
基於基準映象- 儘量使用官方提供的BASE Image
FROM scratch
不依賴任何基準映象
-
MAINTAINER 作者
沒有執行含義,只是說明名作者 -
LABEL XXX="XXX"
描述性資訊 -
WORKDIR 容器目錄
切換工作目錄 , 如果當前目錄不存在的時候,會自動建立這個目錄- 這個目錄是通過我們的
docker exec -it 程序號 bash
進入來的
- 這個目錄是通過我們的
-
儘量使用絕對路徑
-
ADD 宿主機目錄 容器目錄
將宿主機的目錄全部複製到容器目錄中ADD xxx.gz /
新增根目錄並解壓縮- ADD 除了複製,還具備新增遠端檔案功能
-
ENV XXX /XXX/XXX
設定環境常量- ENV JAVA_HOME /usr/local/openjdk8
- RUN ${JAVA_HOME}/bin/java -jar XXX.jar
- 儘量使用環境常量,可提高程式的維護性
-
RUN&&CMD&&ENTRYPOINT
RUN
在構建映象時執行命令(修改映象內部的檔案)CMD|ENTRYPOINT
在容器建立時執行命令(對容器中的檔案進行操作)
RUN 構建時執行
- 命令格式 RUN yum install -y vim # Shell
- 命令格式 RUN ["yum","install","-y","vim"] #Exec
- 在分不清的情況下推薦使用
Shell 執行方式
- 使用Shell執行時,當前shell 時父程序,生成一個子shell程序
- 在子shell中執行指令碼,指令碼執行完畢,退出子shell程序,回到當前shell
Exec 執行方式
- 使用Exec方式,會用Exec程序替換當前程序,並保持PID不變
- 執行完畢,直接退出,並不會退回之前的程序環境
ENTRYPOINT 啟動命令
- ENTRYPOINT (入口點) 用於在容器啟動時執行命令
- Dockerfile中只有最後一個ENTRYPOINT會被執行
- 推薦使用Exec格式
CMD 預設命令
- CMD 用於設定預設執行的命令
- 如Dockerfile中出現多個CMD,則只有最後一個被執行
- 如容器啟動時附加指令,則CMD被忽略
- 推薦使用Exec命令格式
- 若容器啟動時有其他的引數,CMD 將不會執行
當我們使用下面這種情況啟動容器時CMD將不會被執行,這裡可以配合ENTRYPOINT一起使用。
Dockerfile 使用例子
使用Dockerfile 構建redis
FROM centos
# 安裝C編譯元件
RUN ["yum","install","-y","gcc","gcc-c++","net-tools","make"]
WORKDIR /usr/local
ADD redis-5.0.5.tar.gz .
WORKDIR /usr/local/redis-5.0.5/src
RUN make && make install
WORKDIR /usr/local/redis-5.0.5
ADD redis.conf .
EXPOSE 6379
CMD ["redis-server","redis.conf"]
- 構建映象
docker build -t xxx/xxx:1.0 .
- 啟動容器
docker run -p 7000:6379 xxx/xxx:1.0
容器間的單向訪問
docker 內部每個容器都會有一個虛擬ip
docker inspect id
顯示容器的原資料
ip放再netSetting中。
在容器間通訊的時候不能使用ip進行通訊,這個虛擬ip會變動的。
這時我們可以通過對容器取個名字
docker run -d --name xxx 映象
在沒有配置的情況下,ip預設時互通的,但是別名時無法訪問得
若要能使用別名訪問需要在啟動的時候新增額外的引數
docker run -d --name xxx --link 別名 映象名
Bridge 網橋雙向通訊
docker 環境下的網橋能夠直接連結到宿主機的物理網絡卡上,配置了網橋後,容器內部可以直接訪問到公網上的資料了。
網橋還可以實現docker容器網路上的分組,只要繫結在同一個網橋上,這是容器在網路層面進行了分組。在同一個網橋上,天然互通。
docker network ls
:列出docker網路服務docker network create -d bridge 網橋名稱
建立網橋docker network connect 網橋名稱 容器名稱
容器與網橋繫結
Volume 容器間資料共享
在宿主機上開個空間,所有容器可以讀取這個空間上的檔案
通過設定-v掛在宿主機目錄
docker run --name 容器名 —v 宿主機路徑:容器內掛在路徑 映象名
通過--volumes-from 共享容器內掛載點
- 建立共享容器
docker create --name 共享容器名 -v /xx/xx:/xx/xx 鏡映象名 /bin/true
- 共享容器掛載點
docker run --volumes-from 共享容器名 --name xxx -d 映象名
DockerCompose容器編排
docker 官方為我們提供的容器編排工具時docker compose
我們可以使用docker compose對一組容器進行編排,讓他們有順序的建立。有順序的啟動。
- Docker Compose 單機多容器部署工具
- 通過yml檔案定義多容器如何部署
- WIN/MAC 預設提供Docker Compose, Linux 需要安裝
安裝
由於是github 所以下載會比較慢
https://docs.docker.com/compose/install/
安裝後若出現
Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/doc
這種情況的問題則是版本不對,需要去官網下載對應版本的docker-compose然後手動替換掉
docker-compose官網:https://github.com/docker/compose/releases/
將/usr/local/bin/
路徑下的docker-compose 刪除
重新上傳正確版本的docker-compose
授權chmod +x /usr/local/bin/docker-compose