Docker概述
Docke為何出現?
問題:
一款產品,從開發到上線,兩套環境![應用環境,應用配置]
從開發到運維。在開發的電腦可以運行,到運維那出問題!后續版本更新,導致服務不可用等等!對運維來說,考驗十分大。
環境配置是十分麻煩的,每一個機器都要部署環境(集群Redis、ES、Hadoop等等)費時費力。
所以發布一個項目(jar+[環境 Redis、Mysql、jdk、ES]),項目能不能都帶上環境安裝打包!
之前在服務器配置一個環境Redis、MySql、jdk、Es、Hadoop,配置超麻煩了,而且不能夠跨平台。
從Windows,最后發布到Linux!
傳統:原來開發的一個應用打包jar丟過來,其他部署運維來做!
現在:Docker給以上問題,提出了解決方案!開發打包部署上線,一套流程做完!
java --- jar(環境)---打包項目帶上環境(鏡像)---(放到Docker倉庫)---下載發布的鏡像---直接運行
Jre---多個應用(存在端口沖突)---原來的都是交叉的。
Docker核心思想!打包裝箱!每個箱子是互相隔離的。通過隔離機制,可以將服務器利用到極致!
在容器技術出現之前,都是使用虛擬機技術!
在Windows中安裝一個Vmware,通過這個軟件可以虛擬出來一天或者多台電腦!(缺點:笨重!)
虛擬機也是屬於虛擬化技術,Docker容器技術,也是一種虛擬化技術!
vm: linux centos原生鏡像(相當於一個電腦),隔離操作,需要開啟多個虛擬機!容量幾個G,而且啟動要好幾分鍾。
docker: 隔離,鏡像(最核心的環境,比如說centos最核心只要4M就夠了,然后需要什么加什么:+jdk+mysql),十分小巧,運行鏡像即可!只需幾個M、KB即可,秒級啟動。
Docker是基於Go語言開發的!開源項目
虛擬化技術:
- 資源占用十分多
- 冗余步驟多
- 啟動很慢
容器化技術:
不是模擬的一個完整的操作系統(比如安裝一個centos只需要安裝它的一個核心!)
比較Docker和虛擬機技術的不同:
- 傳統虛擬機,虛擬出一個硬件,運行一個完整的操作系統,然后在這個系統上安裝和運行軟件
- 容器內得應用直接運行在 宿主機的內核中,容器是沒有自己的內核的,也沒有虛擬硬件,所以就輕便了
- 每個容器時互相隔離,每個容器都有一個屬於自己的文件系統,互不影響。
DevOps(開發、運維)
應用更快捷的交付和部署
傳統:一堆幫助文檔,安裝程序
Docker:打包鏡像發布測試,一鍵運行
更快捷的升級和擴縮容
項目打包為一個鏡像,擴展 比如服務器A出現問題性能瓶頸了,現在水平擴展負載均衡 在服務器B直接一鍵運行這個鏡像。
更簡單的系統運行
在容器化后,開發、測試環境都是高度一致的。
更高效的計算資源利用
Docker是 內核級別的虛擬化,可以在一個物理機運行很多的容器實例!服務器的性能可以被壓榨到極致。
Docker基本組成
鏡像(image):
Docker鏡像就好比是一個模板,可以通過這個模板來創建容器服務,tomcat鏡像>run>tomcat01容器(提供服務器),通過這個鏡像可以創建多個容器(最終服務運行或者項目運行就是在容器中的)
容器(conrainer):
Docker利用容器技術,獨立運行一個或者一個組應用,通過鏡像來創建的。
啟動,停止,刪除,基本命令!
目前就可以把這個容器理解為就是一個簡易的linux系統
倉庫(repository):
倉庫就是存放鏡像的地方!
倉庫分為公有倉庫和私有倉庫!
Docker Hub(默認是國外的)
阿里雲...都有容器服務器(可配置鏡像加速!)
Docker安裝
環境准備
- 需要linux基礎
- CentOS 7
- 使用Xshell連接遠程進行服務器操作
環境查看
#系統內核是 3.10 以上的
[root@localhost ~]# uname -r
3.10.0-229.el7.x86_64
#系統版本
[root@localhost ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安裝
幫助文檔:https://docs.docker.com/engine/install/centos/
#1、卸載舊的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#2、需要的安裝包
yum install -y yum-utils
#3、設置鏡像的倉庫
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #默認是從國外的
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #推薦使用阿里雲的
#更新yum軟件包索引
yum makecache fast
#4、安裝docker相關的 docker-ce 社區 ee 企業版
yum install docker-ce docker-ce-cli containerd.io
#5、啟動docker
systemctl start docker
#6、使用doeker version 測試是否安裝成功
doeker version
測試運行 hello-world
執行命令:docker run hello-world
,有如下圖表示已成功安裝
PS:Docker run運行流程圖
Docker常用命令
幫助命令
docker version #顯示docker的版本信息
docker info #顯示docker的系統信息,包括鏡像和容器的數量
docker 命令 --help #幫助命令
幫助文檔地址:https://docs.docker.com/engine/reference/
鏡像命令
docker images 查看所有本地的主機上的鏡像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 4 months ago 13.3kB
#解釋
REPOSITORY 鏡像的倉庫源
TAG 鏡像的標簽
IMAGE ID 鏡像的id
CREATED 鏡像的創建時間
SIZE 鏡像的大小
[root@localhost ~]# docker images --help
#可選項:
-a, --all #列出所有鏡像
-q, --quiet #只顯示鏡像的id
docker search搜索鏡像
[root@localhost ~]# docker search --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
#可選項:
-f, --filter filter Filter output based on conditions provided
-f=stars=3000 #搜索出來的鏡像就是stars大於3000的
[root@localhost ~]# docker search mysql -f=stars=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9529 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3458 [OK]
docker pull 下載鏡像
#下載鏡像語法 docker pull 鏡像名[:tag]
[root@localhost ~]# docker pull mysql
Using default tag: latest #如果不寫tag,默認就是latest
latest: Pulling from library/mysql
afb6ec6fdc1c: Pull complete #分層下載,docker image的核心 聯合文件系統
0bdc5971ba40: Pull complete
97ae94a2c729: Pull complete
f777521d340e: Pull complete
1393ff7fc871: Pull complete
a499b89994d9: Pull complete
7ebe8eefbafe: Pull complete
597069368ef1: Pull complete
ce39a5501878: Pull complete
7d545bca14bf: Pull complete
211e5bb2ae7b: Pull complete
5914e537c077: Pull complete
Digest: sha256:a31a277d8d39450220c722c1302a345c84206e7fd4cdb619e7face046e89031d #簽名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真實地址
#docker pull mysql
#等價於
#docker pull docker.io/library/mysql:latest
#指定版本下載
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
afb6ec6fdc1c: Already exists
0bdc5971ba40: Already exists
97ae94a2c729: Already exists
f777521d340e: Already exists
1393ff7fc871: Already exists
a499b89994d9: Already exists
7ebe8eefbafe: Already exists
4eec965ae405: Pull complete
a531a782d709: Pull complete
270aeddb45e3: Pull complete
b25569b61008: Pull complete
Digest: sha256:d16d9ef7a4ecb29efcd1ba46d5a82bda3c28bd18c0f1e3b86ba54816211e1ac4
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 刪除鏡像
docker rmi -f 鏡像id #刪除指定鏡像
docker rmi -f 鏡像id 鏡像id 鏡像id 鏡像id #刪除多個鏡像
docker rmi -f $(docker images -aq) #刪除全部的鏡像
容器命令
...