Docker
Build,Ship and Anywhere
1.基本概念
- Docker Client:Docker提供給用戶的客戶端,功能就是提供給用戶一個終端,用戶輸入docker提供的命令來管理本地或者遠程的服務器。
- Docker Server:Docker Daemon是主要組成部分,Docker服務的守護進程,功能-接受Docker Client發過來的指令請求,並按照相應的路由規則實現路由分發。
- Docker Images:Docker鏡像,類比電腦裝系統的CD盤,只讀的CD
- Docker Registry:Docker Images的倉庫,類比git,有私人的,有公共的,如github,docker提供了官方的Registry,Dock Hub
- Docker Container:Docker 容器,在容器里,跑項目程序、消耗機器資源、提供服務的地方;容器(Docker Container)通過鏡像(Docker Images)啟動,在鏡像的基礎上運行程序。可以理解為容器提供了硬件環境,然后使用了鏡像這些制作好的系統盤,再加上項目程序,跑起來就可以提供服務。
理解上圖:搭載Docker的主機,通過Docker Client使用
docker build
docker pull
docker run
讓Docker Daemon從Docker Registry拉取Ubuntu,redis,nginx等鏡像,然后通過這些鏡像創建不同的容器
2.安裝Docker
以CentOs為例:可以參考https://docs.docker.com/install/linux/docker-ce/centos/
https://yq.aliyun.com/articles/110806?spm=5176.8351553.0.0.2206199170TjX9
-
安裝輔助工具:
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-utils:管理repository及擴展包的工具 (主要是針對repository)
device-mapper-persistent-data:Device Mapper支持Linux上的許多高級卷管理技術;
lvm2:邏輯卷管理工具;
-
添加軟件源信息,這里使用Docker CE版本
從2017年3月開始docker在原來的基礎上分為兩個分支版本: Docker CE 和 Docker EE。Docker CE 即社區免費版,Docker EE 即企業版,強調安全,但需付費使用。
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum緩存:
yum makecache fast
-
移除舊的版本
yum remove docker
-
安裝
yum -y install docker-ce
-
啟動
systemctl start docker
或者
#服務方式啟動 service docker start #設置開機啟動 chkconfig docker on
-
測試運行hello-world
docker run hello-world
-
卸載:
yum remove docker-ce
rm -rf /var/lib/docker
-
問題:
解決方案
yum clean all
yum install docker-ce
3.docker基本操作
查看版本
docker version
查看鏡像
docker images
docker image ls
查看容器
docker ps
拉取鏡像
docker pull image-name
鏡像放到容器中跑
docker run image-name
查看容器運行情況
docker ps -a
docker container ps
docker container ps -a
4.docker原理
4.1docker優勢
-
docker image的體積小,ubuntu-100M+,小就意味着傳輸與分享方便
-
docker run 啟動的耗時為0.
-
docker 占用資源少
想象一下如下場景把一個項目build成一個image,然后方便分發出去,別人拿到后也不用關心你的項目需要什么環境或者依賴,只要docker run一下就能運行。。而且速度很快,甚至在一台開發機都可以管理成百上千的container,沒有業務處理的時候也不會占用你的系統資源。。。
4.2原理
4.2.1虛擬機 vs Docker容器
4.2.2Docker核心組件
- AUFS(chroot) – 用來建立不同的操作系統和隔離運行時的硬盤空間
- Namespace – 用來隔離Container的執行空間
- Cgroup – 分配不同的硬件資源
- SELinux – 用來保護linux的網絡安全
- Netlink – 用來讓不同的Container之間的進程保持通信,話說docker是golang開發的,還記得golang中goroutine如何通信?
- Netfilter – 建立Container埠為基礎的網路防火牆封包過濾
- AppArmor – 保護Container的網路及執行安全
- Linux Bridge – 讓不同Container或不同主機上的Container能溝通
- 等等·等等等等~
4.2.3術業有專攻
docker運用linux的技術走了捷徑,不虛擬化任何硬件,而是對硬件資源在不同的容器中做了隔離,隔離使米格容器之間擁有了不同的環境(硬盤空間-網路-系統工具包),然后又可以共享需要的硬件資源(cpu-內存-系統內核),dokcer用的技術很多(如上),一項一項研究基本不可能,這也不是我們學習docker的目的,我們是讓docker用於實際生產過程中,至於原理,了解即可,所以我們應該docker是怎么就能辦到?
AUFS -> Another Union File System
:AUFS的技術可以讓多個文件目錄union成一個新的目錄,並且可以對這個新的目錄進行讀寫操作。
如果你有一張只讀的cd數據盤,但是你卻想編輯里面的內容,你通常的做法是不是把內容拷貝到本地硬盤,然后再編輯。
但如果你可以利用AUFS技術,你就可以將硬盤中的一個空目錄和你的cd數據盤進行union形成一個新的目錄,接着你對這個目錄讀取,會得到的cd盤內的數據,當你對這個目錄的內容進行編輯,編輯的內容AUFS會自動講修改內容保存在你union的那個空目錄內,當你再次讀取的時候,AUFS也會將你硬盤中記錄的改動內容優先於CD數據盤中的內容讀取出來,這樣對用戶而言,這就完全是一個可編輯的目錄內容了。——docker要的就是這個效果
- 想象一下docker的Image,其實也就是一個事先制作好的只讀的文件目錄,當我們要使用這個系統功能的時候,docker為我們開辟了一個新的文件夾和這個image做了union,提供給docker container做為系統運行的存儲;
- 這個image里面已經包含了系統程序、工具軟件、以及程序,當系統啟動后產生的運行時文件(如logs、臨時目錄等)或新安裝的軟件都在這個新的文件夾內。
- 這樣我們在啟動一個container的時候,其實並沒有加載鏡像的過程,也不會像虛擬機一樣需要安裝一個系統這么負責,只是做了一次unoin,一切就和安裝過系統的虛擬機同樣使用了。
- 另外docker還提供了一個
docker commit
命令,這個命令可以隨時將你現在的運行中的cantainer構建成一個新的image。
4.3docker命令補充
查看當前的container列表
docker ps -a
通過一個image生成一個新的image,包含container中的改動
docker commit container-id
5.docker加速鏡像為阿里雲
由於眾所周知的原因,使用docker pull
,命令下載鏡像太慢了,默認是從國外的。
https://help.aliyun.com/document_detail/60743.html?spm=a2c4g.11186623.6.550.764e11be5adPKN
#阿里雲鏡像服務
https://help.aliyun.com/document_detail/60743.html?spm=a2c4g.11186623.6.550.764e11be5adPKN
#密碼
在阿里雲容器鏡像服務控制台-默認實例-訪問憑證取 修改即可
#鏡像加速器可以提升docker官方鏡像的速度
在阿里雲容器鏡像服務控制台-鏡像中心-鏡像加速器
6.docker實戰-萬物皆鏡像
以nginx官方鏡像為例https://hub.docker.com/_/nginx
6.1獲取官方鏡像:docker pull
docker pull nginx
6.2查看已有鏡像:docker image ls
docker image ls
6.3查看鏡像詳情:docker image inspect
docker image inspect nginx
6.4運行容器:docker run
一個鏡像可以跑多個容器
docker run --name nginx-test -d -p 8082:80 nginx
nginx-test
容器名稱,獨一無二,不能重復
-d
后台運行
-p
指定端口,宿主端口:容器內部端口
-p 80
隨機映射一個宿主機端口,通過docker port nginx-test
-p ip::containerport
容器端口映射主機指定ip動態端口
-p ip:hostport:containerport
-P
暴露所有(容器開發的所有)端口
nginx
鏡像名稱,nginx:tag
,其中nginx
默認nginx:latest
,是簡寫,其他版本,就需要nginx:版本號
宿主機ip:192.168.1.105
6.5查看運行中的容器:docker container ps
docker container ps
docker ps
6.6查看所有的容器:docker container ps -a
docker container ps -a
docker ps -a
6.7查看容器詳情:docker container inspect
docker container inspect nginx-test
6.8進入容器:docker container exec
容器中必須運行有運行的程序,否則docker會把容器進程殺死,nginx是運行,如果只是一個linux系統的容器,會執行失敗
docker container exec -it nginx-test /bin/bash
來吧,你可以在容器,為所欲為之為所欲為。
6.9退出容器:exit
exit
6.10刪除容器
#停止容器
docker stop nginx-test
#刪除容器
docker rm nginx-test
#強制刪除容器
docker rm -f nginx-test
6.11掛載容器文件
#Mounts節點
docker container inspect nginx-test
#容器中無Mounts節點,mysql有,nginx沒有
#自主掛載
#1.創建一個文件
mkdir -p /docker-mount/nginx/conf
#2.查看容器文件的路徑
cd /etc/nginx/conf.d/
more default.conf
#沒錯!,文件路徑/etc/nginx/conf.d/default.conf
#2.把docker的文件掛載到宿主機上
docker cp nginx-test:/etc/nginx/conf.d/default.conf /docker-mount/nginx/conf
#3.宿主機查看文件
more docker-mount/nginx/conf/default.conf
#4.編輯文件
vim docker-mount/nginx/conf/default.conf
#5.掛載至容器
docker run --name nginx-test -d -p 8080:80 -v docker-mount/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf
6.12容器日志
docker logs nginx-test
6.13容器生命周期圖
Docker的四種網絡模式
1.Bridge 橋接模式,docker默認
#配置容器的主機名
docker run --name t1 --network bridge -h [自定義主機名] -it --rm busybox
#自定義DNS
docker run --name t1 --network bridge --dns 114.114 -it --rm busybox
#給host文件添加一條
docker run --name t1 --network bridge --add-host [hostname]:[ip] -it --rm busybox
2.Host
與宿主機一模一樣 不需要端口映射
3.None
不使用網絡
4.Container
一個容器共享另外一個容器的network namespace,與host模式差不多,只是這里不是使用宿主機網絡,而是使用的容器網絡
配置docker0網絡屬性信息
vim /etc/docker/daemon.json
核心選項為bip,即bridge ip,用於指定docker0橋自身的ip地址;其他選項可以通過此地址計算出
7.生成鏡像
方法一:更新
創建容器
docker run ..
修改容器
為所欲為
commit
docker commit -a="作者" 容器名稱 新鏡像名稱
方法二:dockerfile構建
-
構建docker鏡像的源碼
-
文本文檔
-
docker build 自動執行命令行,自動構建docker鏡像
-
注釋
-
指令(不區分大小寫),約定大寫,參數小寫
-
順序執行
-
start
#FROM 基礎鏡像 FROM image-name:tag LABEL author=carfield #ADD 可以從網絡上下載 ADD source-file dest-file ADD URL 容器目錄 #COPY 可以不用 與 ADD類似 COPY 宿主機文件 容器文件 #EXPOSE 暴露端口 EXPOSE 80/tcp #ENTRYPOINT 容器內部生效 ENTRYPOINT ["<executable>","<param1>","<param2>"] #ENV 環境變量 key=value ENV PATH #ARG 同ENV #RUN 指定docker build過程中運行命令 RUN <command> #WORKDIR 工作目錄 執行目錄 WORKDIR $ #ONBUILD 觸發器:被作為基礎鏡像觸發 ONBUILD #CMD 容器啟動生效 CMD [""]
- 構建鏡像
docker build -t image-name:tags .
點.
當前目錄
#test FROM centos #鏡像作者 元數據標簽 LABEL author=carfield #復制文件到鏡像 ADD ... ... ADD ... ... #配置環境變量 ENV DOTNET 路徑 #WORKDIR WORKDIR ... RUN yum -y install vim VOLUME ["/data1"] EXPOSE 8080 CMD ls ENTRYPOINT ....
- 構建鏡像
8.發布鏡像
8.1登錄阿里雲容器鏡像服務
8.2推送至阿里雲
# 登錄docker倉庫
sudo docker login --username=[用戶名] registry.cn-hangzhou.aliyuncs.com
# 創建指定鏡像的tag,歸入某個倉庫
sudo docker tag [鏡像id] registry.cn-hangzhou.aliyuncs.com/xxxx/xxx:[鏡像版本號]
# 鏡像推送至倉庫
sudo docker push registry.cn-hangzhou.aliyuncs.com/xxxx/xxx:[鏡像版本號]
8.3拉取鏡像
docker pull registry.cn-hangzhou.aliyuncs.com/xxxx/xxx:v1
參考資料
- https://www.cnblogs.com/edisonchou/p/dockerfile_inside_introduction.html 你必須知道的Dockerfile
- https://yq.aliyun.com/articles/110806 Docker CE 鏡像源站
- https://blog.csdn.net/TMDUODUO/article/details/101094677 將docker下載鏡像改為阿里雲下載鏡像
- https://www.cnblogs.com/cac2020/p/11359412.html 【Docker學習之二】Docker部署安裝
- https://yq.aliyun.com/articles/63035 大白話Docker入門(一)
- https://yq.aliyun.com/articles/63517 大白話Docker入門(二)