浅谈Docker:DockerLinux安装,镜像管理命令,镜像制作命令,容器管理命令,数据卷,DockerFile,Docker-compose
什么是Docker?
Docker 概念
? Docker 是一個開源的應用容器引擎
? 誕生于 2013 年初,基于 Go 語言實現, dotCloud 公司出品(后改名為Docker Inc)
? Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的Linux 機器上。
? 容器是完全使用沙箱機制,相互隔離
? 容器性能開銷極低。
? Docker 從 17.03 版本之后分為 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版)
Docker架構
? 鏡像(Image):Docker 鏡像(Image),就相當于是
一個 root 文件系統。比如官方鏡像 ubuntu:16.04 就包
含了完整的一套 Ubuntu16.04 最小系統的 root 文件系
統。
? 容器(Container):鏡像(Image)和容器(Contain
er)的關系,就像是面向對象程序設計中的類和對象一
樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容
器可以被創建、啟動、停止、刪除、暫停等。
? 倉庫(Repository):倉庫可看成一個代碼控制中心,
用來保存鏡像。
原理
- daemon守護進程,監控docker容器運行狀態【了解】
- docker客戶端:用于數據docker指令操作docker的客戶端
- image(鏡像):是docker容器運行的程序包(類似被人寫的jar)
- repository(鏡像倉庫):用于存放鏡像程序包
- container(容器):docker鏡像運行后的轉態
docker容器虛擬化 與 傳統虛擬機比較
容器就是將軟件打包成標準化單元,以用于開發、交付和部署。
? 容器鏡像是輕量的、可執行的獨立軟件包 ,包含軟件運行所需的所有內容:代碼、運行時環境、系統工具、系統庫和設置。
? 容器化軟件在任何環境中都能夠始終如一地運行。
? 容器賦予了軟件獨立性,使其免受外在環境差異的影響,從而有助于減少團隊間在相同基礎設施上運行不同軟件時的沖突。
安裝Docker
Docker可以運行在MAC、Windows、CentOS、UBUNTU等操作系統上,本課程基于CentOS 7 安裝
Docker。官網:https://www.docker.com
Docker阿里鏡像
在阿里云中搜索"容器鏡像服務",然后,點擊鏡像加速
1. 安裝/升級Docker客戶端 推薦安裝1.10.0以上版本的Docker客戶端,參考文檔 docker-ce2. 配置鏡像加速器 針對Docker客戶端版本大于 1.10.0 的用戶您可以通過修改daemon配置文件/etc/docker/daemon.json來使用加速器 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://38q0nfx5.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart dockerdocker命令
docker服務管理命令
? 啟動docker服務:
systemctl start docker
? 停止docker服務:
systemctl stop docker
? 重啟docker服務:
systemctl restart docker
? 查看docker服務狀態:
systemctl status docker
? 設置開機啟動docker服務:
systemctl enable docker
docker鏡像管理命令
? 查看鏡像: 查看本地所有的鏡像
docker images
docker images –q # 查看所用鏡像的id
? 搜索鏡像:從網絡中查找需要的鏡像
docker search 鏡像名稱
? 拉取鏡像:從Docker倉庫下載鏡像到本地,鏡像名稱格式為 名稱:版本號,如果版本號不指定則是最新的版本。
如果不知道鏡像版本,可以去docker hub 搜索對應鏡像查看。
docker pull 鏡像名稱
docker pull 鏡像名稱:版本
? 刪除鏡像: 刪除本地鏡像
docker rmi 鏡像id # 刪除指定本地鏡像(刪除前一定要確保改鏡像沒有被容器運行)
docker rmi docker images -q # 刪除所有本地鏡像
docker鏡像制作命令
Docker 鏡像如何制作?
docker commit 容器id 鏡像名稱:版本號
docker save -o 壓縮文件名稱 鏡像名稱:版本號
docker load –i 壓縮文件名稱
Dockerfile 案例
案例:需求
案例:實現步驟
① 定義父鏡像:FROM centos:7
② 定義作者信息:MAINTAINER xiaofuxiaofu@qq.com
③ 執行安裝vim命令: RUN yum install -y vim
④ 定義默認的工作目錄:WORKDIR /usr
⑤ 定義容器啟動執行的命令:CMD /bin/bash
⑥ 通過dockerfile構建鏡像:docker bulid –f dockerfile文件路徑 –t 鏡像名稱:版本
docker容器命令管理
? 查看容器
docker ps # 查看正在運行的容器
docker ps –a # 查看歷史所有運行過的容器
? 創建并啟動容器
docker run 參數
參數說明:
? -i:保持容器運行。通常與 -t 同時使用。加入it這兩個參數后,容器創建后自動進入容器中,退出容器后,容器自動關閉。
? -t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用。
? -d:以守護(后臺)模式運行容器。創建一個容器在后臺運行,需要使用docker exec 進入容器。退出后,容器不會關閉。
? -it 創建的容器一般稱為交互式容器,-id 創建的容器一般稱為守護式容器
? --name:為創建的容器命名。
docker exec 命令
docker exec 進入守護式容器
docker exec -it 容器名稱 /bin/bash容器啟動重啟停止命令
? 停止容器
docker stop 容器名稱
? 啟動容器
docker start 容器名稱
? 刪除容器:如果容器是運行狀態則刪除失敗,需要停止容器才能刪除
docker rm 容器名稱
? 查看容器信息
docker inspect 容器名稱,很強大,可以查看容器運行的詳細信息,包括ip 端口 和掛載目錄地址等等
數據卷概念
思考
? Docker 容器刪除后,在容器中產生的數據還在嗎?
? Docker 容器刪除后,在容器中產生的數據還在嗎?
? Docker 容器和外部機器可以直接交換文件嗎?
數據卷
? 數據卷是宿主機中的一個目錄或文件
? 當容器目錄和數據卷目錄綁定后,對方的修改會立即同步
? 一個數據卷可以被多個容器同時掛載
? 一個容器也可以被掛載多個數據卷
數據卷作用
? 容器數據持久化
? 外部機器和容器間接通信
? 容器之間數據交換
配置數據卷
-v 掛載本地文件夾到容器中
? 創建啟動容器時,使用 –v 參數 設置數據卷
docker run … –v 宿主機目錄(文件):容器內目錄(文件) …
? 注意事項:
docker安裝軟件:以mysql為列子
- 參數說明:
-
- -p 3307:3306**:將容器的 3306 端口映射到宿主機的 3307 端口。
- -v $PWD/conf:/etc/mysql/conf.d:將主機當前目錄下的 conf/my.cnf 掛載到容器的 /etc/mysql/my.cnf。配置目錄
- -v $PWD/logs:/logs:將主機當前目錄下的 logs 目錄掛載到容器的 /logs。日志目錄
- -v $PWD/data:/var/lib/mysql :將主機當前目錄下的data目錄掛載到容器的 /var/lib/mysql 。數據目錄
- **-e MYSQL_ROOT_PASSWORD=123456:**初始化 root 用戶的密碼。
tomcat部署war包注意2點
啟動tomcat輸出日志:docker start -i 容器名稱
查看tomcat 日志docker logs -f c_tomcat
查看docker容器ip: ip addr show docker0
-p 端口暴露
? 容器內的網絡服務和外部機器不能直接通信
? 外部機器和宿主機可以直接通信
? 宿主機和容器可以直接通信
? 當容器中的網絡服務需要被外部機器訪問時,可以將容器中提供服務的端口映射到宿主機的端口上。外部機
器訪問宿主機的該端口,從而間接訪問容器的服務。
? 這種操作稱為:端口映射
docker鏡像原理
操作系統組成:? 文件管理子系統
Linux文件系統由bootfs和rootfs兩部分組成
? bootfs:包含bootloader(引導加載程序)和 kernel(內核)
? rootfs: root文件系統,包含的就是典型 Linux 系統中的/dev,/proc,/bin,/etc等標準目錄和文件
? 不同的linux發行版,bootfs基本一樣,而rootfs不同,如ubuntu,centos等
Docker 鏡像原理
? Docker鏡像是由特殊的文件系統疊加而成
? 最底端是 bootfs,并使用宿主機的bootfs
? 第二層是 root文件系統rootfs,稱為base image
? 然后再往上可以疊加其他的鏡像文件
? 統一文件系統(Union File System)技術能夠將不同的層整合成一個文件系統,為這些層提了一個統一的視角,這樣就隱藏了多層的存在,在用的角度看來,只存在一個文件系統。
? 一個鏡像可以放在另一個鏡像的上面。位于下面的鏡像稱為父鏡像,最底部的鏡像成為基礎鏡像。
? 當從一個鏡像啟動容器時,Docker會在最頂層加載一個讀寫文件系統作為容器
? 是一個分層文件系統
? Centos的iso鏡像文件包含bootfs和rootfs,而docker的centos鏡像復用操作系統的bootfs,只有rootfs和其他鏡像層
? 由于docker中鏡像是分層的,tomcat雖然只有70多MB,但他需要依賴于父鏡像和基礎鏡像,所有整個對外暴露的
tomcat鏡像大小500多MB
Dockerfile 概念
? Dockerfile 是一個文本文件
? 包含了一條條的指令
? 每一條指令構建一層,基于基礎鏡像,最終構建出一個新的鏡像
? 對于開發人員:可以為開發團隊提供一個完全一致的開發環境
? 對于測試人員:可以直接拿開發時所構建的鏡像或者通過Dockerfile文件
構建一個新的鏡像開始工作了
? 對于運維人員:在部署時,可以實現應用的無縫移植
Dockerfile 關鍵字
| FROM | 指定父鏡像 | 必要 | 指定dockerfile基于那個image構建 |
| MAINTAINER | 作者信息 | 要 | 用來標明這個dockerfile誰寫的 |
| LABEL | 標簽 | 用來標明dockerfile的標簽 可以使用Label代替Maintainer 最終都是在docker image基本信息中可以查看 | |
| RUN | 執行命令 | 要 | 執行一段命令 默認是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”] |
| CMD | 容器啟動命令 | 要 | 提供啟動容器時候的默認命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”] |
| ENTRYPOINT | 入口 | 一般在制作一些執行就關閉的容器中會使用 | |
| COPY | 復制文件 | 要 | build的時候復制文件到image中 |
| ADD | 添加文件 | 要 | build的時候添加文件到image中 不僅僅局限于當前build上下文 可以來源于遠程服務 |
| ENV | 環境變量 | 要 | 指定build時候的環境變量 可以在啟動的容器的時候 通過-e覆蓋 格式ENV name=value |
| ARG | 構建參數 | 構建參數 只在構建的時候使用的參數 如果有ENV 那么ENV的相同名字的值始終覆蓋arg的參數 | |
| VOLUME | 定義外部可以掛載的數據卷 | 指定build的image那些目錄可以啟動的時候掛載到文件系統中 啟動容器的時候使用 -v 綁定 格式 VOLUME [“目錄”] | |
| EXPOSE | 暴露端口 | 要 | 定義容器運行的時候監聽的端口 啟動容器的使用-p來綁定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
| WORKDIR | 工作目錄 | 要 | 指定容器內部的工作目錄 如果沒有創建則自動創建 如果指定/ 使用的是絕對地址 如果不是/開頭那么是在上一條workdir的路徑的相對路徑 |
| USER | 指定執行用戶 | 指定build或者啟動的時候 用戶 在RUN CMD ENTRYPONT執行的時候的用戶 | |
| HEALTHCHECK | 健康檢查 | 指定監測當前容器的健康監測的命令 基本上沒用 因為很多時候 應用本身有健康監測機制 | |
| ONBUILD | 觸發器 | 當存在ONBUILD關鍵字的鏡像作為基礎鏡像的時候 當執行FROM完成之后 會執行 ONBUILD的命令 但是不影響當前鏡像 用處也不怎么大 | |
| STOPSIGNAL | 發送信號量到宿主機 | 該STOPSIGNAL指令設置將發送到容器的系統調用信號以退出。 | |
| SHELL | 指定執行腳本的shell | 指定RUN CMD ENTRYPOINT 執行命令的時候 使用的shell |
Docker-compose容器編排工具
服務編排
微服務架構的應用系統中一般包含若干個微服務,每個微服務一般都會部署多個實例,如果每個微服務都要手動啟停,維護的工作量會很大。
? 要從Dockerfile build image 或者去dockerhub拉取image
? 要創建多個container
? 要管理這些container(啟動停止刪除)
服務編排: 按照一定的業務規則批量管理容器
Docker Compose是一個編排多容器分布式部署的工具,提供命令集管理容器化應用的完整開發周期,包括服務構建
,啟動和停止。使用步驟:
Docker 私有倉庫
Docker官方的Docker hub(https://hub.docker.com)是一個用于管理公共鏡像的倉庫,我們可以從上面拉取鏡像
到本地,也可以把我們自己的鏡像推送上去。但是,有時候我們的服務器無法訪問互聯網,或者你不希望將自己的鏡
像放到公網當中,那么我們就需要搭建自己的私有倉庫來存儲和管理自己的鏡像。
一、私有倉庫搭建
# 1、拉取私有倉庫鏡像 docker pull registry # 2、啟動私有倉庫容器 docker run -id --name=registry -p 5000:5000 registry # 3、打開瀏覽器 輸入地址http://私有倉庫服務器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有倉庫 搭建成功 # 4、修改daemon.json vim /etc/docker/daemon.json # 在上述文件中添加一個key,保存退出。此步用于讓 docker 信任私有倉庫地址;注意將私有倉庫服務器ip修改為自己私有倉庫服務器真實ip {"insecure-registries":["私有倉庫服務器ip:5000"]} # 5、重啟docker 服務 systemctl restart docker docker start registry二、將鏡像上傳至私有倉庫
# 1、標記鏡像為私有倉庫的鏡像 docker tag centos:7 私有倉庫服務器IP:5000/centos:7# 2、上傳標記的鏡像 docker push 私有倉庫服務器IP:5000/centos:7三、 從私有倉庫拉取鏡像
#拉取鏡像 docker pull 私有倉庫服務器ip:5000/centos:7總結
以上是生活随笔為你收集整理的浅谈Docker:DockerLinux安装,镜像管理命令,镜像制作命令,容器管理命令,数据卷,DockerFile,Docker-compose的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈Java锁,与JUC的常用类,集合安
- 下一篇: 系列(六)—Linux命令