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