84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
Docker中镜像和容器的关系是什么? 看了几个版本,有点不太清晰。 是容器里面放置镜像? 还是镜像本身就是一个容器?
业精于勤,荒于嬉;行成于思,毁于随。
容器是鏡像運作的一個實例!
玩過虛擬機器嗎?相對來說就是Ios檔案和虛擬出來的系統。
鏡像是檔案, 容器是進程。 容器是基於鏡像創建的, 即容器中的進程依賴於鏡像中的文件, 這裡的文件包括進程運行所需的可執行文件, 依賴軟體,庫文件, 配置文件等等...
不妨透過一個實例來獲得更直覺的認識。
假設你需要把nginx(網頁伺服器)運行在Docker容器中,則第一步需要下載nginx映像:
sudo docker pull nginx
下載nginx映像之後可以查看Docker映像:
sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 0d409d33b27e 2 weeks ago 182.7 MB
可知, nginx鏡像的大小為182.7MB。
事實上, nginx鏡像並非一個單獨的文件,而是具有層級結構:
sudo docker history nginx IMAGE CREATED CREATED BY SIZE COMMENT 0d409d33b27e 2 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon o 0 B <missing> 2 weeks ago /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp 0 B <missing> 2 weeks ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx/ 0 B <missing> 2 weeks ago /bin/sh -c apt-key adv --keyserver hkp://pgp. 57.67 MB <missing> 2 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.11.1-1~ 0 B <missing> 3 weeks ago /bin/sh -c #(nop) MAINTAINER NGINX Docker Mai 0 B <missing> 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B <missing> 3 weeks ago /bin/sh -c #(nop) ADD file:5d8521419ad6cfb695 125.1 MB
可知, nginix鏡像一共有8層, 其中, 第1層為125.1MB, 第5層為57.67MB, 其他層的大小可以忽略。
將nginx運行在Docker容器中:
sudo docker run -itd \ -p 80:80 \ --name=nginx \ nginx
查看nginx容器
sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 263e88fc53d3 nginx "nginx -g 'daemon off" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, 443/tcp nginx
可知, nginx容器運作成功。
查看nginx容器中的流程
sudo docker exec nginx ps aux | grep -v ps USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 31680 2872 ? Ss+ 05:18 0:00 nginx: master process nginx -g daemon off; nginx 5 0.0 0.0 32072 1696 ? S+ 05:18 0:00 nginx: worker process
可知, nginx容器中一共運行了兩個進程, 分別是nginx的master和worker進程。
容器中進程的COMMAND為"nginx -g daemon off", 但是, 主機上並未安裝nginx, nginx安裝在Docker映像中。
不妨再查看nginx鏡像的各層,這時使用"--no-trunc"顯示詳細內容:
docker history --no-trunc nginx IMAGE CREATED CREATED BY SIZE COMMENT sha256:0d409d33b27e47423b049f7f863faa08655a8c901749c2b25b93ca67d01a470d 2 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon off;"] 0 B <missing> 2 weeks ago /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp 0 B <missing> 2 weeks ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log 0 B <missing> 2 weeks ago /bin/sh -c apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 && echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.list && apt-get update && apt-get install --no-install-recommends --no-install-suggests -y ca-certificates nginx=${NGINX_VERSION} nginx-module-xslt nginx-module-geoip nginx-module-image-filter nginx-module-perl nginx-module-njs gettext-base && rm -rf /var/lib/apt/lists/* 57.67 MB <missing> 2 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.11.1-1~jessie 0 B <missing> 3 weeks ago /bin/sh -c #(nop) MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com" 0 B <missing> 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B <missing> 3 weeks ago /bin/sh -c #(nop) ADD file:5d8521419ad6cfb6956ed26ab70a44422d512f82462046ba8e68b7dcb8283f7e in / 125.1 MB
其中, 第5層為57.67MB, 它的CREATED BY是這樣的(把連接符號&&換為換行符):
apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.list apt-get update apt-get install --no-install-recommends --no-install-suggests -y ca-certificates nginx=${NGINX_VERSION} nginx-module-xslt nginx-module-geoip nginx-module-image-filter nginx-module-perl nginx-module-njs gettext-base rm -rf /var/lib/apt/lists/*
可知, nginx鏡像的第5層安裝了nginx。
可以類比為 檔案--進程 的關係
鏡像可以理解為一個ios的系統光碟文件容器是裝好後可運作的系統
就像墙壁與壁纸的關係
墙壁
壁纸
container = image + docker run
container
image
docker run
如类和实例。
类
实例
docker run 就是把類別實例化。
鏡像就是容器的系統檔案
鏡像相當於一個標準化的模板,啟動容器相當於實例化一個鏡像來用,銷毀容器後只是這個實例被銷毀了,鏡像還是在的
容器是鏡像運作的一個實例!
玩過虛擬機器嗎?相對來說就是Ios檔案和虛擬出來的系統。
鏡像是檔案, 容器是進程。 容器是基於鏡像創建的, 即容器中的進程依賴於鏡像中的文件, 這裡的文件包括進程運行所需的可執行文件, 依賴軟體,庫文件, 配置文件等等...
不妨透過一個實例來獲得更直覺的認識。
假設你需要把nginx(網頁伺服器)運行在Docker容器中,則第一步需要下載nginx映像:
下載nginx映像之後可以查看Docker映像:
可知, nginx鏡像的大小為182.7MB。
事實上, nginx鏡像並非一個單獨的文件,而是具有層級結構:
可知, nginix鏡像一共有8層, 其中, 第1層為125.1MB, 第5層為57.67MB, 其他層的大小可以忽略。
將nginx運行在Docker容器中:
查看nginx容器
可知, nginx容器運作成功。
查看nginx容器中的流程
可知, nginx容器中一共運行了兩個進程, 分別是nginx的master和worker進程。
容器中進程的COMMAND為"nginx -g daemon off", 但是, 主機上並未安裝nginx, nginx安裝在Docker映像中。
不妨再查看nginx鏡像的各層,這時使用"--no-trunc"顯示詳細內容:
其中, 第5層為57.67MB, 它的CREATED BY是這樣的(把連接符號&&換為換行符):
可知, nginx鏡像的第5層安裝了nginx。
可以類比為 檔案--進程 的關係
鏡像可以理解為一個ios的系統光碟文件
容器是裝好後可運作的系統
就像
墙壁
與壁纸
的關係container
=image
+docker run
如
类
和实例
。docker run 就是把類別實例化。
鏡像就是容器的系統檔案
鏡像相當於一個標準化的模板,啟動容器相當於實例化一個鏡像來用,銷毀容器後只是這個實例被銷毀了,鏡像還是在的