docker停止容器后配置_Docker 自学笔记 - april_aaa
Docker為什么會出現?
一款產品從開發到上線,從操作系統,到運行環境,再到應用部署。作為開發+運維之間的協作我們需要關心很多東西,這也是很多互聯網公司都不得不面對的問題,特別是各個版本的迭代之后,不同版本環境的兼容,對運維人員都是考驗
Docker 之所以發展如此迅速,也是因為它對此給出了一個標準化的解決方案。
環境配置如此麻煩,換一臺機器,就要重來一次,費時費力,很多人想到,能不能從根本上解決問題?軟件可以帶環境安裝?也就是說,安裝的時候,把原始環境一摸一樣地復制過來。開發人員利用 Docker 可以消除協作編碼時“在我的機器上可以正常工作”的問題。
Docker 是什么?
Docker 打破代碼即應用的觀念;從系統環境開始,自下而上的打包。
一句話總結 Docker:解決了運行環境和配置問題的軟件容器,方便做持續集成并有助于整體發布的容器虛擬化技術。
Docker 能干嘛
之前的虛擬機技術
虛擬機就是帶環境安裝的一種解決方案。
它可以在操作系統里面運行另一種操作系統。應用程序對此毫無感知,因為虛擬機看上去跟真實系統一模一樣,而對于底層系統來說,虛擬機就是一個普通文件,不需要了就刪除,對其他部分毫無影響。這類虛擬機完美的運行了另一套系統,能夠使用程序,操作系統和硬件三者之間的邏輯不變
? ? ? ? ? ?虛擬機的缺點:
? ? ? ? ? ?1. 資源占用多; 2. 冗余步驟多; 3. 啟動慢
? ? ? ? ? ?由于前面虛擬機存在這些缺點,Linux發展出了另一種虛擬化技術:Linux容器。
? ? ? ? ? ? Linux容器不是模擬一個完整的操作系統,而是對進程進行隔離。有了容器,就可以將軟件運行所需的所有資源打包到一個隔離的容器中。容器與虛擬機不同,不需要捆綁一整套操作系統,只需要軟件工作所需的庫資源和設置。系統因此而變得高效輕量并保證部署在任何環境中的軟件都能始終如一地運行。
- 比較 Docker 和傳統虛擬化方式的不同之處:
- 傳統虛擬機技術是虛擬出一套硬件后,在其上運行一個完整操作系統,在該系統上再運行所需要的應用程序;
- 而容器內的應用進程直接運行于宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。幾乎沒有性能損耗,性能優于通過 hypervisor 層與內核層的虛擬化。
- 每個容器之間互相隔離,每個容器有自己的系統文件,容器之間進程不會互相影響,能區分計算資源。
| Hypervisor,又稱虛擬機監視器(英語:virtual machine monitor,縮寫為 VMM),是用來建立與執行虛擬機器的軟件、固件或硬件。 被Hypervisor用來執行一個或多個虛擬機器的電腦稱為主體機器(host machine),這些虛擬機器則稱為客體機器(guest machine)。hypervisor提供虛擬的作業平臺來執行客體操作系統(guest operating systems),負責管理其他客體操作系統的執行階段;這些客體操作系統,共同分享虛擬化后的硬件資源。 |
- 通過下面這幅圖,我們可以很直觀的反映出這兩者的區別所在:
圖片----------
- 跟多注解
- Docker 屬于 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。
每個容器都是相互隔離的、保證安全的平臺。可以把容器看作是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
- 總體來說,Docker 的接口相當簡單,用戶可以方便地創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、復制、分享、修改,就像管理普通代碼一樣。
Docker 的三大特征:鏡像、容器和倉庫
Docker安裝和運行
參考官網 |?踩坑參考博客
安裝和配置
由于 Docker Hub 是國外倉庫,可以配置阿里云、網易云鏡像,拉鏡像會快。
以阿里云為例,可用淘寶賬號登錄阿里云開發者平臺,
1、獲取鏡像加速器地址
2、配置本機 Docker 運行鏡像加速器(平臺有寫如何在本機配置)
3、重新啟動 Docker 后臺服務:service docker restart
4、檢查配置是否生效:ps -ef| grep docker
永遠的 Hello World
都配置好后,我們可以測試運行 hello world:docker run hello-world(一張圖解釋 run 時都干了什么)
底層原理
Docker 是怎么工作的
Docker是一個Client-Server結構的系統,Docker守護進程運行在主機上,然后通過Socket連接從客戶端訪問,守護進程從客戶端接受命令并管理運行在主機上的容器。容器,是一個運行時環境,就是我們前面說到的集裝箱。
為什么Docker比VM快
1、Docker有著比虛擬機更少的抽象層。由于docker不需要Hypervisor實現硬件資源虛擬化,運行在docker容器上的程序直接使用的都是實際物理機的硬件資源。因此在CPU、內存利用率上docker將會在效率上有明顯優勢。
2、docker利用的是宿主機的內核,不需要Guest OS。因此,當新建一個容器時,docker不需要和虛擬機一樣重新加載一個操作系統內核。因而避免引尋、加載操作熊內核比較費時費資源的過程,當新疆一個虛擬機時,虛擬機軟件需要加載Guest OS,這個新建過程是分鐘級別的。而docker由于直接利用宿主機的操作系統,則省略了這個過程,因此新建一個docker容器只需要幾秒鐘。
Docker 常用命令
幫助命令
docker version? |? ?docker info? |? ?docker --help
鏡像命令
docker images?
列出本地鏡像名稱
說明:
- -a:列出本地所有的鏡像(含中間映像層)
- -q:只顯示鏡像ID
- --digests:顯示鏡像的摘要信息
- --no-trunc:顯示完整的鏡像信息
docker search xx(某個鏡像名字)
網站:
說明:
- --no-trunc:顯示完整的鏡像描述
- -s:列出收藏數不小于指定值的鏡像。eg: docker search -s 1000 tomcat
- --automated:只列出 automated build 類型的鏡像
docker pull xx
docker pull?[鏡像名稱]:[TAG](拉指定版本的鏡像),例如:docker pull redis:;不寫 tag 則默認 latest
docker rmi xx
刪除鏡像的操作
- 刪除單個:docker rmi -f 鏡像ID/唯一鏡像名
- 刪除多個:docker rmi -f 鏡像名1:ag 鏡像名2:tag
- 刪除全部:docker rmi -f $(docker images -qa)
容器命令
有鏡像才能創建容器,這是根本前提(宿主機 win10,虛擬機 centos,centos 裝了docker,docker 拉 centos 鏡像。centos 才200多M,輕量)
新建并啟動容器:docker run [OPTIONS] IMAGE [COMMAND][ARG...]
列出當前所有正在運行的容器
docker ps?[OPTIONS]
- -a:列出當前所有正在運行的容器+歷史上運行過的
- -l:顯示最近創建過的容器
- -n:顯示最近 n 格創建的容器
- -q:靜默模式,只顯示容器編號
- --no-trunc:不截斷輸出
退出容器
兩種方式:
- exit —— 停止容器退出
- Ctrl + P + Q ——容器不停止退出
啟動容器:docker start 容器id/容器名
重啟容器:docker restart?容器id/容器名
停止容器:docker stop?容器id/容器名
強制停止容器:docker kill 容器id/容器名
刪除已停止的容器
- 刪除單個容器:docker rm 容器id
- 刪除多個容器:docker rm -f $(docker ps -a -q)
重要
啟動守護式容器:docker run -d 容器名
使用鏡像centos:latest 以后臺模式啟動一個容器:docker run -d centos
問題:docker ps -a 進行查看,會發現容器已經退出
很重要的一點:Docker容器后臺運行,就必須有一個前臺進程
容器運行的命令如果不是那些一直掛起的命令(比如運行top,tail),就是會自動退出的。
這個是docker的機制問題,比如你的web容器,我們以NGINX 為例,正常情況下,我們配置啟動服務只需要啟動相應的service即可,例如:service nginx start
但是,這樣做 nginx 為后臺進程模式運行,就導致docker前臺沒有運行的應用,這樣的容器后臺啟動后,會立即自殺因為覺得沒事可做
所以,最佳的解決方案是,將你要運行的程序以前臺進程的形式運行
查看容器日志:docker logs -f -t --tail 容器id
- -t 是加入時間戳
- -f 跟隨最新的日志打印
- --tail 數字:顯示最后多少條
查看容器內運行的進程:docker top 容器id
查看容器內部細節:docker inspect 容器id(查看掛載容器卷用到)
進入正在運行的容器并以命令行交互:docker inspect 容器id(docker exec -it 容器id /bin/bash #也可以進入容器)
docker exec -it 容器id ls -l /tmp
從容器內拷貝文件到主機上:docker cp 容器id:容器中路徑 宿主機路徑
小總結
Docker 常用命令
Docker 鏡像
是什么
UnionFS(聯合文件系統)
UnionFS(聯合文件系統):Union文件系統(UnionFS)是一種分層、輕量級并且高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下(unite several directories into a single virtual filesystem)。Union 文件系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。
特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄
Docker 鏡像加速原理
docker 的鏡像實際上是由一層一層的文件系統組成,這種層級的文件系統 UnionFS。
bootfs(boot file system)主要包含 BootLoader 和 kernel,BootLoader主要是引導加載 kernel,Linux剛啟動時會加載 bootfs 文件系統,在 Docker 鏡像的最底層是 bootfs。這一層與我們典型的 Linux/Unix 系統是一樣的,包含 boot 加載器和內核。當 boot 加載完成之后整個內核就都在內存中了,此時內存的使用權已由 bootfs 轉交給內核,此時系統也會卸載 bootfs。
rootfs(root file system),在 bootfs 之上,包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和文件。rootfs 就是各種不同的操作系統發行版,比如 Ubuntu,centos等
分層的鏡像
pull 的時候可以看到一層層下載,以tomcat為例,一層層可能包含 tomcat、jdk8、centos、kernel
為什么Docker鏡像要采用分層結構呢
最大的一個好處是共享資源。比如:有多個鏡像都從相同的 base 鏡像構建而來,那么宿主機只需在磁盤上保存一份 base 鏡像,同時內存中也只需加載一份 base 鏡像,就可以為所有容器服務了。而且鏡像的每一層都可以被共享。
特點
Docker 鏡像都是只讀的
當容器啟動時,一個新的可寫層被加載到鏡像的頂部。
這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。
(自己的理解,容器相當于類,模型,自己不去修改,實例化的對象是可讀可寫的,有可塑性)
Docker 鏡像 commit 操作補充
docker commit 提交容器副本使之成為一個新的鏡像
docker commit -m="提交的描述信息" -a="作者" 容器id 要創建的目標鏡像名:[標簽名]
案例演示:
Docker 容器數據卷
是什么
一句話:有點類似我們Redis 里面的rdb和 aof 文件
能干嘛
容器的持久化
容器間繼承+共享數據
數據卷
容器內添加
- 直接命令添加:docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名:docker run -it -v /myDatavolume:/dataVolumeContainer 鏡像名
- 查看數據卷是否掛載成功:路徑可以創建成功
- 容器和宿主機之間數據共享
- 容器停止退出后,主機修改后數據是否同步
- DockerFile(MySQL為例看下 DockerFile) 添加
- 根目錄下新建 mydocker 文件夾并進入
- 可在 Dockerfile 中使用 VOLUME 指令來給鏡像添加一個或多個數據卷(出于可移植和分享的考慮,用 -v 主機目錄:容器目錄這種方法不能直接在Dockerfile中實現。由于宿主機目錄是依賴于特定宿主機的,并不能保證在所有哦的宿主機上都存在這樣的特定目錄)
- File 構建
#volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,------------success"
CMD /bin/bash
意思為,每次生成容器,都會帶有兩個容器數據卷,可以使用 docker inspect 容器id?查看對應的宿主機數據存儲地址
- build 后生成鏡像:docker build -f /mydocker/Dockerfile -t jiaolf/centos .
- run 容器
- 通過上述步驟,容器內的卷目錄地址已經知道對應的主機目錄地址在哪?——可以使用 docker inspect 容器id?查看對應的宿主機數據存儲地址
主機對應默認地址
備注:Docker 掛載主機目錄 Docker 訪問出現 "cannot open directory .Permission denied" 解決辦法:在掛載目錄后面加參數 --privileged=true 即可
數據卷容器
是什么:命名的容器掛載數據卷,其他容器通過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之為數據卷容器
總體介紹
以上一步新建的鏡像 jiaolf/centos 為模板并運行容器 dc01、dc02、dc03
他們已經具有容器卷(VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"])
容器間傳遞共享(--volumes-form)
1、先啟動 dc01:docker run -it --name dc01 jiaolf/centos
2、進入 /dataVolumeContainer2 隨意編寫東西
3、創建 dc02 掛載在 dc01:docker run -it --name dc02 --volumes-from dc01 jiaolf/centos
- 結果:dc02中/dataVolumeContainer2 有 dc01_add.txt
4、創建 dc03 掛載在 dc01:docker run -it --name dc03 --volumes-from dc01 jiaolf/centos
5、刪除 dc01,進入dc02,不受影響,并且在dc02中新建文件,可以同步到dc03
總結:容器之間配置信息的傳遞,數據卷的生命周期直到沒有容器使用它為止
DockerFile 解析
是什么
1、Dockerfile 是用來構建 Docker 鏡像的構建文件,是由一系列命令和參數構成的腳本
2、寫容器卷的主流步驟:
- 手動編寫一個 dockerfile 文件(必須要符合file的規范)
- 有這個文件后,直接 docker build 執行,獲得一個自定義的鏡像
- Run
centos 為例再次查看 Dockerfile
Dockerfile 構建過程解析
Dockerfile 內容基礎知識
- 每條保留字指令都必須為大寫字母且后面要跟隨至少一個參數
- 指令按照從上到下,順序執行
- 每條指令都會創建一個新的鏡像層,并對鏡像進行提交
Docker 執行 Dockerfile 的大致流程
- docker 從基礎鏡像運行一個容器
- 執行一條指令并對容器作出修改
- 執行類似 docker commit 的操作提交一個新的鏡像層
- docker 再基于剛提交的鏡像運行一個新容器
- 執行 dockerfile 中的下一條指令直到所有指令都執行完成
小總結
Dockerfile 體系結構(保留字指令)
CMD ["/bin/bash"] -------干嘛的
每個容器都會有一個pid為1的進程,如果這個進程執行結束了,容器也就close了;
COMMAND為/bin/bash,說明這個容器的初始進程就是bash進程;
默認情況下,dockerlogs也只會打印pid為1進程的輸出
- FROM centos? ——?基礎鏡像
- MAINTAINER jiaolf
- WORKDIR? ? ——指定在創建容器后,終端默認登錄進來的工作目錄,一個落腳點
- ENV? —— 用來在構建鏡像中設置環境變量
- RUN? ?—— 容器構建時需要執行的命令
- ADD —— 將宿主機目錄下的文件拷貝進鏡像且 ADD 命令會自動處理 URL 和解壓 tar 壓縮包
- COPY —— 類似 ADD,拷貝文件和目錄到景象中
- VOLUME —— 容器數據卷,用于數據保存和持久化工作
- EXPOSE —— 當前容器對外暴露的端口
- CMD —— 指定一個容器啟動時要運行的命令(Dockerfile中可以有多個 CMD 命令,但只有最后一個生效,CMD 會被 docker run 之后的參數替換)
- ENTRYPOINT ——?指定一個容器啟動時要運行的命令(ENTRYPOINT 的目的和 CMD 一樣,不同的是指令是追加的,CMD 是覆蓋的)
- ONBUILD —— 當構建一個被繼承的 Dockerfile 時運行命令,父鏡像在被子鏡像繼承后父鏡像的 onbuild 被觸發
案例
Base鏡像(scratch)
Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構建出來的
自定義鏡像 mycentos
1、編寫 Dockerfile
FROM centos
MAINTAINER jiaolf
ENV MYPATH /tmp
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------ok"
CMD /bin/bash
2、構建:docker build -t 新鏡像名字:tag
3、運行
4、列出鏡像的變更歷史
CMD/ENTRYPOINT 鏡像案例
CMD
tomcat 為例,Dockerfile 中最后有 CMD 內容,docker 啟動 tomcat 正常情況下會有一些信息打印(Ctrl+c 退出)
嘗試在 docker run 時增加參數,如:docker run -it -p 7777:8080 tomcat ls -l (執行后 docker ps 發現 tomcat 并沒有啟起來)
ENTRYPOINT(制作CMD版可以查詢IP信息的容器)
關于 curl
初始文件內容:
FROM centos
RUN yum install -y curl
CMD ["curl","-s",""]
修改后:
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s",""]
ONBUILD RUN echo "father images onbuild -------success"
ONBUILD
驗證 ONBUILD 功能,在 Dockerfile4 中增加上面的一行,生成新的鏡像 myip_father;創建 Dockerfile5,繼承 myip_father 這個鏡像,期望在構建 Dockerfile5 時,會執行 Dockerfile4 中 ONBUILD 后面的內容
ADD & COPY(自定義鏡像 tomcat9)
1、mkdir -p /jiaolf/mydockerfile/tomcat9
2、進入上述路徑,touch c.txt
3、將 jdk 和 tomcat 安裝的壓縮包拷貝進上一步目錄
- apache-tomcat-9.0.8.tar.gz
- jdk-8u171-linux-x64.tar.gz
4、在上述目錄下新建 Dockerfile 文件
5、構建
6、run(截圖)
7、驗證(訪問tomcat)
8、結合前述的容器卷將測試的 web 服務 test 發布
? ? ? 效果:使用容器數據卷,本地改內容,可以直接在容器內訪問到
小總結
Docker 常用安裝
總體步驟
搜索、拉取、查看、啟動、停止、移除
安裝tomcat
安裝mysql
docker run -p 3306:3306 --name mysql
-v /jiaolf/mysql/conf:/etc/mysql/conf.d
-v /jiaolf/mysql/logs:/logs
-v /jiaolf/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
-d mysql
docker exec -it containerid /bin/bash
mysql -uroot -p 123456
數據庫常用操作:建庫、建表、插入數據
外部電腦能訪問docker上的數據庫
安裝redis
docker run -p 6379:6379
-v /jiaolf/myredis/data:/data
-v /jiaolf/myredis/conf/
-d redis redis-server /usr/local/etc/redis/redis.conf
--appendonly yes
本地鏡像發布到阿里云
docker commit -a='author' -m='commit message'? containerid 鏡像名
$ sudo docker login --username=1052595200@qq.com registry.cn-hangzhou.aliyuncs.com$ sudo docker tag [ImageId] :[鏡像版本號]
$ sudo docker push :[鏡像版本號]
(阿里云)
docker run -p 6379:6379 -v /jiaolf/myredis/data:/data?-v /jiaolf/myredis/conf/?-d redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes
總結
以上是生活随笔為你收集整理的docker停止容器后配置_Docker 自学笔记 - april_aaa的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 请先设置tkk_物联卡apn设置机型大全
- 下一篇: 矢量合成和分解的法则_重点解析丨抛体运动