文章目錄
Docker基礎學習
虛擬化技術
- 多道程序與多用戶
- 分時操作系統,把一臺大型機變成每個用戶擁有“虛擬機器”
- 模擬器(Emulator),仿真器
- 在 PC 上玩遊戲機的遊戲
- 用模擬器實現跨系統交叉開發
- 沙箱(SandBox)
- 受控的、安全的程序執行環境。如微信小程序運行在微信的沙箱上訪問手機的資源。通常需要特定的編譯和解釋程序
- 虛擬機(Virtual Machine)
- 通過軟件模擬的具有完整硬件系統功能的、運行在一個完全隔離環境中的完整計算機系統
- 容器(Container)
- Linux 容器(Linux Containers,縮寫爲 LXC)
- docker container
容器化技術
- 容器技術 與 LXC
- Unix 系統爲了實現多用戶的隔離,建立了豐富的 OS 級別虛擬化機制
- LXC 是 Linux® Containers 簡稱,是 OS 虛擬化的集成與發展
- Docker引擎隔離技術(進程級別隔離技術)
Docker uses a technology called namespaces to provide the isolated workspace called the container.- namespace
- pid namespace: 進程隔離 (PID: Process ID).
- net namespace: 管理網絡接口(NET: Networking).
- ipc namespace: 管理IPC資源訪問(IPC: InterProcess Communication).
- mnt namespace: 管理文件系統掛載點 (MNT: Mount).
- uts namespace: 隔離內核與版本識別 (UTS: Unix Timesharing System).
- Control Groups: 限定容器內存等資源
- Union FS 聯合文件系統
- Container format 容器文件格式(OCF)
- namespace
- The use of Linux containers to deploy applications is called containerization.
Docker的優勢
- 容器化爲什麼會流行
- 靈活:即使是最複雜的應用也可以容器化。
- 輕量級:容器利用並共享主機操作系統內核。
- 可互換:您可以即時部署更新和升級。
- 便攜式:您可以在本地構建,部署到雲,在任何地方運行。
- 可擴展:您可以增加並自動分發容器副本。
- 可組合:您可以自由地組合(stack)服務。
Docker核心概念
- 鏡像(image) – 類比執行程序
an executable package that includes everything needed to run an application–the code, a runtime, libraries, environment variables, and configuration files. - 容器(Container) – 類比進程
a runtime instance of an image–what the image becomes in memory when executed (that is, an image with state, or a user process). - 倉庫(Registry)– 類比 repository
存放不同版本鏡像的地方 - 主機(Host / Node)
運行容器的服務器 - 服務(Service)
一個鏡像之上運行的一組可伸縮的容器集合,運行在一個容器集羣中提供同一功能服務 - 棧(Stack)/ 命名空間(Namaspace) / 應用(Application)
被編排的、可伸縮的一組相互依賴的服務,構成的一個應用
實驗過程
本實驗在CentOS 7環境下進行
準備Docker環境
安裝下載
# 移除舊版本 Docekr
sudo yum remove docker*
# 設置 repository
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 使用阿里雲鏡像
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 不指定版本號 默認安裝最新版
sudo yum install docker-ce
檢查docker安裝
檢查是否啓動
運行第一個鏡像
在瀏覽器中打開localhost查看
Docker基本操作
運行鏡像
-it參數,使得我們可以通過終端與進程(容器)交互,stdin,stdout,stderr定向到 TTY
顯示本地鏡像庫內容
可以看到本地鏡像庫有最開始創建的httpd
獲得幫助
- Options基本選項,-D(debug)、-H(host list)等
- Management Commands用於管理的命令,docker、images、volumes等
- Commands常用命令, attach(連接指定運行鏡像)、create(創建一個新的容器但不啓動)等
顯示運行中容器
)
顯示所有容器(包含已終止)
繼續進行原容器並進入
MYSQL與容器化
拉取MYSQL鏡像
查看images是否包含MYSQL鏡像
MYSQL容器構建文件Dockfile
FROM ubuntu
ENTRYPOINT [“top”, “-b”]
CMD ["-c"]
構建鏡像
運行鏡像
啓動服務器
啓動MYSQL客戶端
使用MySQL容器(掛載卷保存db)
數據庫文件在哪裏?
# docker exec -it mysql2 bash
(我忘了截圖了這裏)
Dockerfile 的 VOLUME /var/lib/mysql 的含義
每次啓動 mysql 容器,docker 創建一個文件卷掛載在容器內/var/lib/mysql位置,這個卷在主機(host)的 /var/lib/docker/volumes/ 目錄下
創建卷並掛載
這裏沒有暴露端口到主機,將自己定義的數據卷掛載在/var/lib/mysql
啓動客戶端容器鏈接服務器
這裏使用了–link鏈接兩個容器,客戶端容器內可以使用mysql這個別名訪問服務器
- 掛載現有數據庫官網案例:
docker run -v "$PWD/data":/var/lib/mysql --user 1000:1000 --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
- 修改容器配置官網案例
docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
Docker compose 與多容器應用自動化部署
從github上下載docker-compose二進制文件安裝
- 下載最新版的docker-compose文件
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-
uname -s-
uname -m-o /usr/local/bin/docker-compose
- 添加可執行權限
sudo chmod +x /usr/local/bin/docker-compose
測試安裝結果
docker-compose --version
編寫:stack.yml
version: '3.1'
services:
db:
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
adminer:
image: adminer
restart: always
ports:
- 8080:8080
啓動服務
Docker網絡
管理容器網絡
備制支持 ifconfig 和 ping 命令的 ubuntu 容器
照着課件指令做就可以
~]# docker run --name unet -it --rm ubuntu bash
root@48a255a95c37:/# apt-get update
…
root@48a255a95c37:/# apt-get install net-tools
root@48a255a95c37:/# apt-get install iputils-ping -y
root@48a255a95c37:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0
…
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
…
root@48a255a95c37:/# ping <your host ip>
可以看到本機ip爲172.17.0.3
可以ping通
啓動另一個命令窗口,由容器製作鏡像
創建自定義網絡
在兩個窗口創建 u1,u2 容器網絡,並使用以下命令
~]# docker run --name u1 -it -p 8080:80 --net mynet --rm ubuntu:net bash
~]# docker run --name u2 --net mynet -it --rm ubuntu:net bash
~]# docker info u1
~]# docker network connect bridge u1
~]# docker network disconnect mynet u1
Docker 倉庫(Registry)
- 訪問 阿里雲容器鏡像服務
- 用淘寶或註冊一個賬號
- 選擇“容器鏡像服務”
- 常用倉庫操作:如上傳 hello-world 鏡像
- 登陸
docker login --username=<your account> registry.cn-shenzhen.aliyuncs.com
- 標籤
docker tag hello-world registry.cn-shenzhen.aliyuncs.com/pmlpml/repo:hello-world
- 上傳
docker push registry.cn-shenzhen.aliyuncs.com/pmlpml/repo:hello-world
- 下載
docker push registry.cn-shenzhen.aliyuncs.com/pmlpml/repo:hello-world
- 標籤
docker tag registry.cn-shenzhen.aliyuncs.com/pmlpml/repo:hello-world hello-world
- 刪除
docker rmi registry.cn-shenzhen.aliyuncs.com/pmlpml/repo:hello-world
- 運行
docker run --rm hello-world
- 退出
docker logout registry.cn-shenzhen.aliyuncs.com
- 登陸
docker登陸
標籤、上傳、下載、刪除、運行、退出
容器監控與與日誌
檢查docker的狀態
容器詳細信息
容器日誌查看
實驗思考
Docker 技術與傳統的 Linux 容器:
就輕量級
虛擬化
這一功能來看,LXC(Docker基於此構建) 非常有用,但它無法提供出色的開發人員或用戶體驗。除了運行容器之外,Docker 技術還具備其他多項功能,包括簡化用於構建容器、傳輸鏡像以及控制鏡像版本的流程。
傳統的 Linux 容器使用 init 系統來管理多種進程。這意味着,所有應用都作爲一個整體運行。與此相反,Docker 技術力爭讓應用各自獨立運行其進程,並提供相應工具,幫助實現這一功能。這種精細化運作模式自有其優勢
Docker與Docker-compose:
dockerfile可以配置運行一個容器,但是docker-compose可以一條命令運行多個配置的容器