文章目錄
一、Docker容器學習目標:
- 掌握Docker基礎知識,能夠理解Docker鏡像和容器之間的概念
- 完成Docker的安裝與啓動掌握Docker鏡像與容器相關命令
- 掌握Tomcat、Nginx等軟件的常用應用的安裝
- 掌握Docker遷移與備份相關命令
- 能夠運用Dockerfifile編寫創建容器的腳本
- 能夠搭建與使用Docker私有倉庫
二、Docker簡介
1. 什麼是虛擬化
- 在計算機中,虛擬化(英文: Virtualization)是一種資源管理技術,是將計算機的各種實體資源(如: 服務器、網絡、內存及存儲等)予以抽象、轉化後呈現出來, 打破實體間不可切割的障礙,使用戶可以通過更好的方式來應用這些資源。
- 在實際的生產環境中,虛擬化技術主要用來解決高性能的物理硬件產能過剩和老的舊的硬件產能過低的重組重用,透明化底層物理硬件,從而最大化的利用物理硬件,對資源充分利用。
- 虛擬化的種類有很多,例如:
1.軟件虛擬化:Vmware軟件、KVM軟件、VirtualBox軟件等
2.硬件虛擬化: 磁盤陣列RAID、邏輯卷LVM、
3.內存虛擬化、網絡虛擬化、桌面虛擬化、服務虛擬化、虛擬機等。
2 .什麼是Docker
Docker是一個開源的應用容器引擎,Docker項目的目標是實現輕量級的操作系統虛擬化解決方案。Docker的基礎是Linux容器(LXC)等技術。在2018年之前是不支持在Windows系統部署Docker的。用戶操作Docker的容器就像操作一個快速輕量級的虛擬機一樣簡單。
個人理解:Docker: 集裝箱 把東西封裝到集裝箱中,別人需要就直接給集裝箱。
3.爲什麼選擇Docker?
1)上手快
- Docker依賴於"寫時複製"(copy-onwrite)模型,使修改應用程序也非常迅速,可以說達到"隨心所欲,代碼即改"的境界。
隨後,就可以創建容器來運行應用程序了。大多數Docker容器只需要不到1秒即可啓動。 - 由於去除了管理程序的開銷,Docker容器擁有很高的性能,同時同一臺宿主機中也可以運行更 多的容器,使用戶儘可能的充分利用系統資源。
2)職責的邏輯分類 - 使用Docker,開發人員只需要關心容器中優秀的應用程序,而運維人員只需要關心如何管理容器。
- Docker設計的目的就是要加強開發人員寫代碼的開發環境與應用程序要部署的生產環境一致性。
- 從而降低那種"開發時一切正常,肯定時運維的問題(測試環境都是正常的, 上線後出了問題就歸結爲肯定是運維的問題)"。
3) 快速高效的開發生命週期 - Docker的目標之一就是縮短代碼從開發、測試到部署、上線運行的週期,讓你的應用程序具備可移植性,易於構建,並易於協作。
- (通俗一點說,Docker就像一個盒子,裏面可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從盒子裏一件一件的取)。
4. 容器與虛擬化的比較
下面的圖片比較了Docker和傳統的虛擬化方式的不同之處,可見容器在操作系統層面上實現虛擬化,直接複用本地主機的操作系統,而傳統的虛擬化則是在硬件層面實現。
總結一下就是: Docker沒有獨立的操作系統,使用真機的內存與操作系統。與傳統的虛擬機相比,Docker的優勢體現爲啓動速度快、佔用體積小。
借用知乎上一個很形象的例子就是:
-
物理機
-
虛擬機
- 容器
5.Docker組件
-
Docker服務器與客戶端
Docker是一個客戶端/服務器(C/S)架構的程序。Docker客戶端只需向Docker服務器或守護進程發出請求,服務器或守護進程將完成所有工作並返回結果。 -
Docker提供了一個命令行工具docker以及一整套RESTful API來與守護進程交互。
-
用戶可以在同一臺宿主機上運行Docker守護進程和客戶端。
-
Docker鏡像與容器
倉庫:每個倉庫存放某一類鏡像。
鏡像:類似虛擬機鏡像(eg:xxx.iso)。 eg: MySQL鏡像、Redis鏡像、2048鏡像。
容器:從官方倉庫中拿取鏡像,進行操作使鏡像可以運行之後稱爲容器。類似linux系統環境,運行和隔離應用。容器從鏡像啓動的時候,docker會在鏡像的最上一層創建一個可寫層,鏡像本身是隻讀的,保持不變。對鏡像改變時相當於做快照,刪除容器,相當於刪除鏡像修改的部分,鏡像不變。 -
Registry(註冊中心)
Docker用Registry來保存用戶構建的鏡像。Registry分爲公有和私有兩種。公有倉庫 :所有人可以訪問下載鏡像的倉庫。Docker公司運營公共的Registry叫做Docker Hub。
私有倉庫: 規定範圍內可以訪使用的庫。用戶可以構建私有的Registry。
三、 Docker的安裝與啓動
最簡便的方法:
阿里雲安裝docker(yum倉庫使用阿里雲的倉庫很方便)
- git bash中:ssh @47.92.233.236 輸入密碼
- yum install docker
- systemctl start docker
方法一: 直接使用docker光盤鏡像源安裝docker最新版本
(1) yum包更新到最新
# 阿里安裝軟件鏡像源下載
$ wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ yum makecache # 生成緩存
$ yum update # yum包更新
(2) 配置yum倉庫安裝Docker
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker- ce.repo
(3) 安裝Docker
$ yum install docker-ce -y
(4) 安裝後查看Docker版本
$ docker -v
方法二: 官網下載軟件包, 自行安裝
$ yum install * -y
$ docker version
四、Docker的基本操作
Docker基礎命令
-
啓動Docker:
$ systemctl start docker
-
停止Docker:
systemctl stop docker
-
重啓Docker:
systemctl restart docker
-
查看Docker狀態:
systemctl status docker
-
開機啓動Docker:
systemctl enable docker
-
查看Docker概要信息:
docker info
-
查看Docker幫助文檔:
docker --help
鏡像相關命令
- 查看鏡像
docker images
REPOSITORY: 鏡像名稱
TAG: 鏡像標籤
IMAGE ID: 鏡像ID
CREATED: 鏡像創建的時間(不是獲取該鏡像的日期)
SIZE: 鏡像大小
這些鏡像都是存儲在Docker宿主機的/var/lib/docker目錄下。
- 搜索鏡像
docker search 鏡像名稱
- 拉取鏡像
docker pull 鏡像名稱
拉取倉庫就是從鏡像倉庫中下載鏡像到本地。 - 刪除鏡像
按ID刪除鏡像
docker rmi 鏡像ID
刪除所有鏡像(注意:是反向單引號)
docker rmi `docker images -q`
容器相關命令
-
查看所有正在運行的容器
docker ps
-
查看所有容器(即無論是否運行中)
docker ps -a
-
查看最後一次運行的容器
docker ps -l
-
查看停止的容器
docker ps -f status=exited
創建與啓動容器
創建容器常用參數說明: docker run -
-i, --interactive : 表示運行容器
-
-t, --tty : 表示容器啓動後進入其命令行(分配一個僞終端)
-
–name : 指定容器名稱
-
-v, --volume list : 表示一個/多個目錄映射關係(前者是宿主機目錄,後者是映射到宿主機上的目錄)
-
-d, --detach : 創建一個守護進程在後臺運行
-
-p, --publish list : 表示一個/多個端口映射,前者是宿主機端口,後者是容器內的映射端口。
(1) 交互式創建容器
$ docker load -i ubuntu.tar # 加載鏡像
$ docker run -it --name=myubuntu ubuntu /bin/bash # 創建容器, exit退出當前容器
$ docker ps -a
(2) 守護方式創建容器
$ docker run -di --name=容器名稱 鏡像名稱:標籤 # 創建容器
$ docker exec -it 容器名稱/容器ID /bin/bash # 登錄守護容器交互環境的方式
(3) 刪除容器
刪除指定的容器,如果刪除容器時,容器正在運行中,則先停止容器。
docker stop myubuntu1
docker rm myubuntu1
(4)停止與啓動容器
- 停止容器:
$ docker stop 容器名稱(或者容器ID)
- 啓動容器:
$ docker start 容器名稱(或者容器ID)
(5)查看容器IP地址
- 我們可以通過以下命令查看容器運行的各種數據,myubuntu1是容器的名稱。
docker inspect myubuntu1
- 也可以執行下面的命令直接輸出IP地址,myubuntu1是容器的名稱。
docker inspect --format='{{.NetworkSettings.IPAddress}}' myubuntu1
文件拷貝
- 容器的文件拷貝到真機上
docker cp 容器名稱:容器目錄 需要拷貝的文件或者目錄
- docker --help | less 查看容器命令
- docker exec -it 2048 /bin/bash 交互環境進入2048項目
- hostname > hostname.txt 容器內產生一個文件
- cat hostname.txt
- ctrl + p +q 退出交互式環境不關閉容器
- docker cp 2048容器id:/hostname.txt /mnt/ 將容器的文件拷貝到真機/mnt/
- cat /mnt/hostname.txt
- 如果我們需要將文件拷貝到容器內可以使用cp命令
$ docker cp 需要拷貝的文件或者目錄 容器名稱:容器目錄
- docker cp /etc/passwd 容器id:/tmp/ 將真機/etc/passwd 拷貝到容器/tmp下
- docker exec -it 2048 /bin/bash 重新進入交互式環境
- head -3 /tmp/passwd 查看從真機拷貝到容器下的文件
目錄掛載
我們可以在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以通過修改宿主主機某個目錄的文件從而影響容器。也就是通過修改真機目錄來修改容器內的目錄。
創建容器 添加-v參數 後面爲 宿主機目錄: 容器目錄
例如:
-
docker run -di -v /usr/share/Project1: /usr/share/Project1 --name my_2048 docker.io/blackicebird/2048
對鏡像創建一個容器,容器中/usr/share/Project1映射到真機下 /usr/share/Project1 (目錄可以不相同) -
docker exec -it my_2048 /bin/bash
進入這個容器的交互式環境 -
cd /usr/share/Project1
進入容器下的目錄創建文件 -
touch file{1..10}
-
ctrl +p +q 退出容器
-
ls /usr/share/Project1
真機下查看在虛擬機下創建的文件
遷移與備份
1.1 容器保存爲鏡像
如果把設置好的容器封裝成鏡像,每次使用這個容器時就把這個鏡像啓動成新的容器而無需設置。對於一個每次使用都需設置的容器,可以進行封裝保存爲一個鏡像。commit會把所有指令都集成爲一個文件,啓動容器的時候就執行這個文件。
小例子: 對mysql設置登陸密碼、指定用戶遠程連接和授權的操作,將設置好的mysql封裝爲鏡像:
docker commit 要封裝的容器名稱 新的鏡像名稱例如mysql:remote_login
docker images
查看鏡像docker run -d -p 0.0.0.0:3306:3306 6 --name test_mysql mysql:remote_login
鏡像創建容器docker ps
查看運行的容器
注意:由於版本導致密碼加密的問題在封裝後的鏡像仍需要再次設置
1.2 鏡像備份
如果pull鏡像很慢的話可以將容器打包鏡像,每次load即可
步驟如下:
docker save -o mysqlRemoteLogin.tar 要打包的鏡像mysql:remote_login
docker load -i mysqlRemoteLogin.tar
鏡像恢復docker images
查看鏡像
Dockerfile
- 什麼是Dockerfifile
Dockerfifile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終創建一個新的鏡像。
對於開發人員:可以爲開發團隊提供一個完全一致的開發環境。
對於測試人員: 可以直接拿開發時所構建的鏡像或者通過Dockerfifile文件構建一個新的鏡像開始工作了。
對於運維人員: 在部署時,可以實現應用的無縫移植。
- 常用命令
- Dkckerflie應用:將 hell0.txt 文件拷貝到容器中
- vim docjer_file
- mkdir dockertest
- mv docker_file dockertest/dockerfile
- cd dockertest
- touch hell0.txt 將這個文件拷貝到容器中
- docker build --no-cache -t “ubantu:test” .
執行寫好的dockerfile,. 表示對當前執行操作 -t加入標籤- docker run -id --name ubantu_test -p 82:80 ubantu:test 對封裝的鏡像創建容器
- docker exec -it ubantu_test /bin/bash
- cd /mnt
- ls
可以看到hello.txt
vim docjer_file後內容如下:
五、案例實戰:Docker的2048部署
背景:
- 雲服務器47.92.233.236
- git bash
步驟:
docker search 2048
docker pull docker.io/blackicebird/2048
docker images
查看鏡像docker run -d --name 2048 -p 0.0.0.0:80:80 docker.io/blackicebird/2048
對docker.io/blackicebird/2048 鏡像創建容器,-d在後臺運行 -p映射:將2048遊戲放到容器的80端口,真機80端口映射到容器80端口,用戶訪問雲服務器80端口時就會訪問容器的80端口來訪問2048這個遊戲docker ps
查看運行的容器docker ps -a
查看所有的容器
部署遇到的問題:
-
問題一: 如果通過雲服務器:80無法訪問,則需要設置端口號對應的安全組。
-
問題二:有時候阿里雲版本下的鏡像與操作系統配置版本不兼容,可以提升操作系統配置:yum update 更新所有軟件包括系統內核版本。
六、案例實戰:Docker的MySQL部署
背景:
- 項目端裝mysql:yum install mysql
- 理解:數據庫 主機一部署 ,項目 主機二部署
知識擴展:
hub.docker.com: 搜索關於鏡像設置拉取的信息
操作步驟:
項目所在的主機二遠程連接主機一的數據庫,數據庫所在的主機一需要設置用戶可以遠程連接
- 拉取MySQL鏡像
- docker search mysql
- docker pull docker.io/mysql
- docker images
- 創建容器
- docker run -d -p 0.0.0.0:3306:3306 6 -e MYSQL_ROOT_PASSWORD=‘123’ --name remote_mysql docker.io/mysql
- docker inspect --format=’{{.NetworkSettings.IPAddress}}’ mysql
查看容器IP,IP: 172.17.0.3- docker ps 查看開啓的容器
-p 代表端口映射,格式爲 宿主機映射端口:容器運行端口。
-e 代表添加環境變量 MYSQL_ROOT_PASSWORD是root用戶的登錄密碼。
- 進入MySQL容器並登錄MySQL
- docker exec -it remote_mysql /bin/bash
進入docker的remote_sql 容器命令行 對數據庫需要設置用戶可以遠程連接- mysql -uroot -p123
- create user lvah@’%’ identified by ‘123’;
創建用戶lvah,允許任意主機(%)遠程登陸,登陸密碼爲123.- grant all privileges on . to ‘lvah’@’%’;
授權lvah@%用戶, 允許操作任意數據庫和任意數據表(.).
此時退出容器外部登錄MySQL會報錯是因爲版本加密方式不一致
- 修改賬戶密碼加密規則並更新用戶密碼。
- alter user ‘lvah’@’%’ identified with mysql_native_password by ‘123’;
flush privileges;
重新加載用戶授權表。- ctrl +p +q
- 退出容器測試:mysql -ulavh -p123 -h172.17.0.3
報錯處理:
用戶在連接MySQL數據庫時會出現Authentication plugin ‘caching_sha2_password’ cannot be loaded的錯誤。
mysql -ulvah -p123 -h172.17.0.2 -p3307
ERROR 2059 (HY000): Authentication plugin ‘caching_sha2_password’ cannot be
loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared
object file: No such file or directory
報錯原因:
mysql8 之前的版本中加密規則是 mysql_native_password,
而在mysql8之後,加密規則是 caching_sha2_password
解決方法: 修改賬戶密碼加密規則並更新用戶密碼
修改加密規則
ALTER USER ‘user’@‘localhost’ IDENTIFIED BY ‘password’ PASSWORD EXPIRE
NEVER;
# 更新一下用戶的密碼
ALTER USER ‘user’@‘localhost’ IDENTIFIED WITH mysql_native_password BY
‘password’;
項目部署總結
docker部署基本流程:
- search
- pull
- run
- commit 容器變爲鏡像
- save 鏡像打包
- load