一、docker簡介
1.docker是什么?
Docker是一款容器軟件。
Docker 是一個開源項目,誕生於2013年初,最初是 dotCloud 公司內部的一個業余項目。它基於Goole公司推出的 Go 語言實現。項目后來加入了Linux基金會,遵從了 Apache2.0協議,項目代碼在GitHub上進行維護。
Docker 是一個開源的引擎,可以輕松地為任何應用創建一個輕量級的、可移植的、自給自足的容器。開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然后發布到任何支持docker的機器上運行。容器是完全使用沙盒機制,相互之間不會有任何接口調用。
Docker 的思想來自於集裝箱,集裝箱解決了什么問題?在一艘大船上,可以把貨物規整地擺放起來。並且各種各樣的貨物被裝在集裝箱里,集裝箱和集裝箱之間不會互相影響。那么我就不需要專門運送熟菜的船和專門運送貨物的船了。只要這些貨物在集裝箱里封裝得好好的就行。那我就可以用一艘大船把他們都運走。
docker 就是類似的理念。雲計算就好比大貨輪。docker 就是集裝箱。
2、docker的優點
在雲時代,開發者創建的應用必須要能很方便地在網絡上傳播,也就是說應用必須脫離底層物理硬件的限制;同時必須滿足“任何時間任何地點”可獲取可使用的特點。因此,開發者們需要一種新型的創建分布式應用程序的方式,快速分發部署,而這正是Docker所能夠提供的最大優勢。Docker提供了一種更為聰明的方式,通過容器來打包應用、解耦應用和運行平台。這意味着遷移的時候,只需要在新的服務器上啟動需要的容器就可以了,無務論新舊服器是否是同一類別的平台。這無疑幫助我們節約了大量的寶貴時間,並降低部署過程出現問題的風險。
(1)快
運行時的性能快,管理操作(啟動、停止、開始、重啟等等)都是以秒或毫秒為單位的。
(2)敏捷
像虛擬機一樣敏捷,而且會更便宜,在bare metal (裸機)上部署像點一個按鈕一樣簡單。
(3)靈活
將應用和系統“容器化”,不添加額外的操作系統。
(4)輕量
在一台服務器上可以部署100-1000個Containers容器。
(5)便宜
開源的,免費的,低成本的。
docker-ce:社區版
docker-ee:商業版
3、docker的缺點
所有容器共用 linux kernel 資源,資源能否實現最大限度利用,所以在安全上也會存在漏洞。
4、Docker與虛擬機的比較
在雲時代,開發者創建的應用必須要能很方便地在網絡上傳播,也就是說應用必須脫離底層物理硬件的限制;同時必須滿足“任何時間任何地點”可獲取可使用的特點。因此,開發者們需要一種新型的創建分布式應用程序的方式,快速分發部署,而這正是Docker所能夠提供的最大優勢。Docker提供了一種更為聰明的方式,通過容器來打包應用、解耦應用和運行平台。這意味着遷移的時候,只需要在新的服務器上啟動需要的容器就可以了,無務論新舊服器是否是同一類別的平台。這無疑幫助我們節約了大量的寶貴時間,並降低部署過程出現問題的風險。

5.docker與虛擬化
Docker以及其他容器技術,都屬於操作系統虛擬化范疇,操作系統細膩化最大的特點就是不需要額外的supervisor支持。Docker虛擬化方式之所以有眾多優勢,跟操作系統虛擬化技術自身的設計和實現分不開。

傳統方式是在硬件層面實現虛擬化,需要有額外的虛擬機管理應用和虛擬機操作系統層。Docker容器時在操
作系統層面實現虛擬化,直接復用本地主機的操作系統,因此更加輕量級。
二、安裝部署docker
下載鏈接:https://www.docker.com/products/docker-desktop
windows :
mac
linux
docker分為兩個版本:
docker-ce : 社區版
docker-ee :企業版
linux 3.10的內核 有BUG
1、升級系統內核
[root@localhost ~]# wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-5.4.167-1.el7.elrepo.x86_64.rpm #下載內核 [root@localhost ~]# wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.167-1.el7.elrepo.x86_64.rpm #下載內核拓展包 # 安裝 [root@localhost ~]# yum localinstall -y kernel-lt* # 啟動時自動選擇最新的系統版本 [root@localhost ~]# grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg # 查看最新的系統內核啟動版本 [root@localhost ~]# grubby --default-kernel # 重啟生效 [root@localhost ~]# reboot # 檢測 [root@localhost ~]# uname -a
2、安裝依賴包
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
3、添加軟件源信息
[root@localhost ~]# sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、更新並安裝Docker-CE
[root@localhost ~]# sudo yum makecache fast [root@localhost ~]# sudo yum -y install docker-ce-19.03.9 k8s支持的最新的版本,也是最穩定的版本是19
5、啟動Docker
[root@localhost ~]# systemctl start docker
6、檢測docker
[root@localhost ~]# docker info
7、加速docker(登錄阿里雲——產品——容器與中間件——容器鏡像服務ACR--管理控制台——鏡像工具——鏡像加速器——選centos的鏡像加速器)
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://8mh75mhz.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 檢測是否成功加速:執行docker info 看下是否有aliyun的鏡像


三、docker的概念和基本使用
1.docker三大核心概念

(1)鏡像 :鏡像是啟動容器的模板
(2)容器 :是對外提供服務的實例
(3)倉庫(Harbor) :存放鏡像的地方
官方倉庫:hub.docker.com
第三方:阿里雲、華為雲
docker login [URL]
docker login registry.cn-hangzhou.aliyuncs.com
2.鏡像
鏡像是啟動容器的模板,同一個鏡像啟動的所有的容器完全相同
2.1下載鏡像
docker pull [倉庫的URL]/[命名空間]/[鏡像名稱]:[版本號] 例:docker pull nginx docker info查看: 默認的倉庫URL:https://index.docker.io/v1/ 默認的命名空間:library 默認的版本號:latest index.docker.io/library/nginx:latest等同於下載nginx,因為有默認值
2.2、查看本機鏡像列表
[root@localhost ~]# docker images [root@localhost ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest f6987c8d6ed5 6 days ago 141MB 倉庫名 版本 鏡像ID 創建距離現在的時間 大小
2.3 查看鏡像的詳情
docker inspect [鏡像名稱|ID]
例:docker inspect nginx
2.4 鏡像tag(別名)
docker tag [鏡像ID] [新的名稱]
例:docker tag f6987c8d6ed5 xiaodocker
2.5 登錄倉庫(鏡像上傳到倉庫需要先登錄倉庫)
docker login [倉庫的URL地址] 默認的倉庫地址:hub.docker.com 例:[root@localhost ~]# docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. 輸入用戶名,密碼(需要https://hub.docker.com/注冊才可以登錄哦) vim /root/.docker/config.json #里面保存了用戶登錄的地址和密碼TOKEN值,第二次來不需要登錄
2.6、上傳鏡像
第一步:打tag(要寫全了,不寫全了使用默認的) [root@localhost ~]# docker tag f6987c8d6ed5 alvinos/nginx:v2 查看docker images 多一條數據
第二步:上傳 [root@localhost ~]# docker push alvinos/nginx:v2

2.7 刪除鏡像(rmi是rm image的縮寫)
docker rmi [鏡像的名稱|ID] [root@localhost ~]# docker rmi alvinos/nginx:v2 注:docker鏡像只能創建和刪除,不能修改。 docker的ID全宇宙唯一

3.容器
對外提供服務的實例。
3.1.容器生命周期
容器內的進程至少有一個進程運行在前台。
3.2、啟動一個容器(鏡像是啟動容器的模板,所以啟動鏡像的時候要加上鏡像的名稱或者id)
docker run [參數] [鏡像名稱|ID] [啟動命令] 例:docker run centos(沒有的話會下載) docker run nginx #啟動容器最簡單的命令 參數:(docker run --help) -d : 以守護進程方式運行 --rm : 當容器生命周期結束時,立即刪除該鏡像 --name : 指定容器名稱 -e : 指定容器內部的環境變量 -h : 指定容器的主機名 -p : 端口映射(固定) #要在互聯網訪問,需要端口映射 -P : 端口映射(隨機) -i : 打開標准輸出(將容器內部的標准輸出接入到命令行中,正常與-t組合使用) -t : 創建一個命令行(偽終端) -v : 添加一個目錄映射 --link --network
例:[root@localhost ~]# docker run -d nginx #后台運行容器 [root@localhost ~]# docker run --rm nginx 當容器生命周期結束時,立即刪除該鏡像 [root@localhost ~]# docker run -d --name nginx nginx # --name 指定容器名稱 [root@localhost ~]# docker run -d --name nginxv1 -e NGINX_NAME=nginx nginx #-e 指定容器內部的環境變量 [root@localhost ~]# docker run -d --name nginxv2 -e NGINX_NAME=nginx -h hostnames nginx # -h 指定容器的主機名 [root@localhost ~]# docker run -d --rm --name nginxv3 -p 30000:80 nginx #,要在互聯網訪問,需要-p端口映射,此時可訪問192.168.15.105:30000 64064393f87b5f2018142e014bdd020890c4310605c0c0cd97ce6c29a54b2b4d [root@localhost ~]# docker run -d --rm --name nginxv4 -P nginx 3a86c4d34bdf8a2f1f3a2e8948c831c3c58c22443690fa2132fdbbdbf6599cbd [root@localhost ~]# docker run -it --rm centos #將容器內部的標准輸出接入到命令行 [root@localhost ~]# ll /tmp total 0 [root@localhost ~]# docker run --rm -d --name nginxv6 -P -v /tmp/:/usr/share/nginx/html nginx [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 510f2a49b418 nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:4001->80/tcp nginxv6 [root@localhost ~]# echo "Hello word" >> /tmp/index.html [root@localhost ~]# docker exec nginxv6 cat /usr/share/nginx/html/index.html Hello word [root@localhost ~]# yum install pip3 [root@localhost ~]# pip install django [root@localhost ~]# django-admin startproject linux [root@localhost ~]# cd linux/ [root@localhost linux]# django-admin startapp application [root@localhost linux]# python3 manage.py runserver 0.0.0.0:8000 此時訪問http://192.168.15.105:8000/ 會出現django 界面 那么,如何在容器里面做呢,首頁映射到容器里 [root@localhost linux]# cd .. [root@localhost ~]# docker run --name django -it --rm -p 8000:8000 -v /root/linux/:/opt/ python:3.6 bash root@379a06657ab0:/# cd /opt root@379a06657ab0:/opt# ls application linux manage.py root@379a06657ab0:/opt# pip install django root@379a06657ab0:/opt# python3 manage.py runserver 0.0.0.0:8000 此時訪問http://192.168.15.105:8000/ 會出現django 界面 [root@localhost ~]#cd linux/ [root@localhost linux]# cd application/ [root@localhost application]# ll [root@localhost application]# vim views.py def index(request): return HttpResponse("hello world") [root@localhost application]# cd .. [root@localhost linux]#cd linux/ [root@localhost linux]#vim urls.py path("",views.index) root@379a06657ab0:/opt# python3 manage.py runserver 0.0.0.0:8000 此時訪問192.168.15.105:8000,出現hello world
docker start : 啟動一個容器
docker stop :停止一個容器
docker create :創建一個容器
docker run 和 docker create 之間有兩個區別
1、docker run創建容器並立即啟動,而docker create 只是創建
2、docker run創建的容器時up狀態,而docker create創建的容器是create
3.3、查看本機運行的容器列表
docker ps -a : 顯示本機上的所有的容器 -q : 只顯示ID 例: docker ps #查看本機上運行的容器 docker ps -a #顯示機器上的所有容器 docker ps -a -q #顯示機器上所有容器的id
3.4在容器內部執行命令
docker exec [容器名稱] [命令] [root@localhost ~]# docker exec nginxv1 printenv #打印nginxv1的環境變量 進入容器: docker exec -it [容器名稱] bash [root@localhost ~]# docker exec -it hungry_wright bash
3.5 刪除容器
docker rm [容器ID或名稱] -f : 強制刪除 [root@localhost ~]# docker rm -f 379a06657ab0 #刪除某個容器 [root@localhost ~]# docker rm -f $(docker ps -a -q) #刪除所有容器
















3.6 保存容器和鏡像
3.61 直接將容器保存成本地鏡像
docker commit docker commit --help Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 參數: -a : 作者 -m : 提交時解釋信息 -p : 保存容器時,是否暫停運行容器 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7390f1d18977 nginx "/docker-entrypoint.…" 9 minutes ago Up 9 minutes 80/tcp hungry_wright [root@localhost ~]# docker commit -a "Linux" -m 'init' -p hungry_wright test:v1

3.62 、將本地的容器保存成鏡像壓縮包
1、保存容器為鏡像壓縮包
docker export -o, --output string Write to a file, instead of STDOUT [root@localhost ~]# docker export -o nginx.tar hungry_wright
2、解壓容器壓縮包成鏡像
docker import [root@localhost ~]# docker import nginx.tar test:v2 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test v2 152d9c19a28f 8 seconds ago 140MB
3.63、將本地的鏡像保存成鏡像壓縮包
1.保存鏡像為鏡像壓縮包
docker save Options: -o, --output string Write to a file, instead of STDOUT [root@localhost ~]# docker save -o nginxv1.tar python:3.6 nginx:latest
2.解壓鏡像壓縮包為鏡像
docker load Options: -i, --input string Read from tar archive file, instead of STDIN -q, --quiet Suppress the load output [root@localhost ~]# docker load -i nginxv1.tar
3.64 save 和 export之間的區別
1、針對的對象不一樣
2、save保存的鏡像更加完善



虛懸鏡像是倉庫名和標簽為none



