1. 程式人生 > >Docker容器學習--1

Docker容器學習--1

標識 esp not 發揮 虛擬機 文件目錄 sha cfa init.d

Docker是PaaS 提供商 dotCloud 開源的一個基於 LXC 的高級容器引擎,源代碼托管在 Github 上, 基於go語言並遵從Apache2.0協議開源。
Docker是通過內核虛擬化技術(namespace以及cgroups等)來提供容器的資源隔離與安全保障。由於Docker通過操作系統層的虛擬化實現隔離,所以Docker容器在運行時,不需要類似虛擬機( VM)額外的操作系統開銷,提高資源利用率。

特點

1.更高效的利用系統資源
2.更快速的啟動時間
3.一致的運行環境
4.更輕松的遷移
5.更輕松的維護和擴展

對比傳統虛擬機總結

特性 容器 虛擬機
啟動
秒級 分鐘級
硬盤使用 一般為 MB 一般為 GB
性能 接近原生 弱於
系統支持量 單機支持上千個容器 一般幾十個


部署Docker環境:

環境準備:(centos7)

yum install -y docker         --安裝
systemctl start docker        --啟動Docker
systemctl enable docker       --加入開機自動啟動  

docker 指令用法

直接敲入docker ,會有很多Command選項,執行docker 【Command】 -h,如: docker ps -h 查看各個命令的詳細用法

下載獲取一個鏡像

Docker 鏡像倉庫獲取鏡像的命令是 docker pull 。默認從Docker的鏡像倉庫下載

docker pull centos      
將鏡像保存到本地,可以上傳到其他主機使用
[root@localhost www]# docker save centos > /docker/centos.tar.gz
[root@localhost www]# ls /docker/
centos.tar.gz

上傳本地的鏡像:
[root@localhost www]# docker load < /docker/centos.tar.gz

 查看鏡像(查看鏡像信息包括:鏡像倉庫、標簽、鏡像ID、創建時間、鏡像大小)

[root@localhost ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx     latest              73acd1f0cfad        5 hours ago         109 MB
docker.io/centos    latest              2d194b392dd1        8 days ago          195 MB

其他一些查看鏡像的指令:
查看所有鏡像
[root@localhost ~]# docker image ls -a

查看在某個鏡像之前的鏡像
[root@localhost ~]# docker image ls -f before=nginx

REPOSITORY TAG IMAGE ID CREATED SIZE

docker.io/centos latest 2d194b392dd1 8 days ago 195 MB
查看在某個鏡像之後的鏡像
[root@localhost ~]# docker image ls -f since=centos

REPOSITORY TAG IMAGE ID CREATED SIZE

docker.io/nginx latest 73acd1f0cfad 5 hours ago 109 MB

  刪除鏡像(要刪除的鏡像不能被在用的容器調用,先停掉用該鏡像的容器,再刪除鏡像)

[root@localhost ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx     latest              73acd1f0cfad        5 hours ago         109 MB
docker.io/centos    latest              2d194b392dd1        8 days ago          195 MB
[root@localhost ~]# docker image rm 73a        --ID不重復,只要前幾位可以標識該鏡像就可以

  啟動一個容器:docker run

[root@localhost ~]# docker run --name host -i -t -d  centos /bin/bash
c0d1bedfd1d08559f6e98a24a4bdfe6b7e90c59e9e852436c93ebdb68936eb48
--name:指定容器名稱
-t :分配一個tty終端
-i :容器的標準輸保持打開的狀態
-d:後臺運行
-p: 指令端口,啟動應用容器時用到
-v:表示需要將本地哪個目錄掛載到容器中,格式:-v <宿主機目錄>:<容器目錄>

進入一個容器內部

[root@localhost ~]# docker exec -i -t host bash      --可以指定別名
[root@4117832e3e82 /]# exit    --退出容器
exit
[root@localhost ~]# docker exec -i -t 411 bash       --也可以指定 ID編號
[root@4117832e3e82 /]# hostname
4117832e3e82

  docker attach 指令進入容器,但是在容器中執行 exit 也會停止容器,所以最好使用 docker exec 進入


下面使用nginx的鏡像創建一個容器,記錄一下nginx容器的使用過程

查看鏡像:
[root@localhost ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx     latest              73acd1f0cfad        21 hours ago        109 MB
docker.io/centos    latest              2d194b392dd1        9 days ago          195 MB
啟動一個名為 mynginx 的容器:
[root@localhost ~]# docker run --name mynginx -i -t -d -p 80:80 nginx
2e98d20483b61879cf611b970e9fe15af2ca69049e6d6a6a1b7f44f318d1db07
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
2e98d20483b6        nginx               "nginx -g ‘daemon ..."   13 seconds ago      Up 12 seconds       0.0.0.0:80->80/tcp   mynginx
[root@localhost ~]# 
進入mynginx容器:
[root@localhost ~]# docker exec -i -t mynginx bash
root@2e98d20483b6:/#
啟動nginx服務:
root@2e98d20483b6:/# /etc/init.d/nginx start
root@2e98d20483b6:/# /etc/init.d/nginx status
[ ok ] nginx is running.

退出容器,並查看nginx狀態:
[root@localhost ~]# ps -ef | grep nginx
root      2257  2242  0 01:29 pts/1    00:00:00 nginx: master process nginx -g daemon off;
101       2280  2257  0 01:29 pts/1    00:00:00 nginx: worker process
root      2375  2124  0 01:33 pts/2    00:00:00 grep --color=auto nginx

打開訪問測試頁
技術分享圖片


  2.還可以在docker host創建nginx的所需網頁目錄,這樣就可以保存數據

在docker host創建網頁文件目錄,將容器中的目錄掛載到docker host中
[root@localhost ~]# docker run --name webserver -d -i -t -p 80:80 -v /usr/share/nginx/html/:/usr/share/nginx/html/ nginx
88e92079d46ab17c0809401d153de1487f9d2c41093bd65057ce490b1c382b4a
[root@localhost ~]#
在docker host中寫一個測試頁
[root@localhost ~]# echo ‘<h2>nginx test page for docker</h2>‘ > /usr/share/nginx/html/index.html

訪問測試頁
技術分享圖片


  

停止、啟動容器

[root@localhost ~]# docker ps -a     --查看所有已經創建的容器
[root@localhost ~]# docker stop ID
[root@localhost ~]# docker start ID

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e4ce0f90cdfb        nginx               "nginx -g ‘daemon ..."   2 minutes ago       Up 2 minutes        80/tcp              nginx
[root@localhost ~]# docker stop e4ce   
e4ce
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# 

  刪除容器 (要刪除的容器必須是出於關閉狀態)

[root@localhost ~]# docker rm ID     --刪除容器

  

容器在運行時刪除該容器會提示如下錯誤
[root@localhost ~]# docker rm e4c
Error response from daemon: You cannot remove a running container e4ce0f90cdfbe9013059cb48a6767c4a54e5347a5c184f61f562f4717a9b9f21. Stop the container before attempting removal or use -f

可以使用  -f  選項強制刪除,在運行的容器也會刪除

 

 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以下內容參考大神博客:http://www.cnblogs.com/kevingrace/p/5252929.html

Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的Linux機器上,也可以實現虛擬化。當你真正投入容器Docker的懷抱,不但可以發現它能解決很多問題,而且還具有眾多的優點:

1)它是不可變的-操作系統,庫版本,配置,文件夾和應用都是一樣的。您可以使用通過相同QA測試的鏡像,使產品具有相同的表現。  
2)它是輕量級的-容器的內存占用非常小。不需要幾百幾千MB,它只要對主進程分配內存再加上幾十MB。  
3)它很快速-啟動一個容器與啟動一個單進程一樣快。不需要幾分鐘,您可以在幾秒鐘內啟動一個全新的容器。  

  但是,許多用戶依然像對待典型的虛擬機那樣對待容器,似乎都忘記了除了與虛擬機相似的部分,容器還有一個很大的優點:它是一次性的。  
這個“特性”本身促使用戶改變他們關於使用和管理容器的習慣;下面將會說明下在容器中不應該做這些事,以確保最大地發揮容器的作用。

1)不要在容器中存儲數據 – 容器可能被停止,銷毀,或替換。一個運行在容器中的程序版本1.0,應該很容易被1.1的版本替換且不影響或損失數據。
有鑒於此,如果你需要存儲數據,請存在卷中,並且註意如果兩個容器在同一個卷上寫數據會導致崩潰。確保你的應用被設計成在共享數據存儲上寫入。 2)不要將你的應用發布兩份 – 一些人將容器視為虛擬機。他們中的大多數傾向於認為他們應該在現有的運行容器裏發布自己的應用。
在開發階段這樣是對的,此時你需要不斷地部署與調試;但對於質量保證與生產中的一個連續部署的管道,你的應用本該成為鏡像的一部分。記住:容器應該保持不變。 3)不要創建超大鏡像 – 一個超大鏡像只會難以分發。確保你僅有運行你應用/進程的必需的文件和庫。不要安裝不必要的包或在創建中運行更新(yum更新)。 4)不要使用單層鏡像 – 要對分層文件系統有更合理的使用,始終為你的操作系統創建你自己的基礎鏡像層,另外一層為安全和用戶定義,
一層為庫的安裝,一層為配置,最後一層為應用。這將易於重建和管理一個鏡像,也易於分發。 5)不要為運行中的容器創建鏡像 – 換言之,不要使用“docker commit”命令來創建鏡像。這種創建鏡像的方法是不可重現的也不能版本化,應該徹底避免。
始終使用Dockerfile或任何其他的可完全重現的S2I(源至鏡像)方法。 6)不要只使用“最新”標簽 – 最新標簽就像Maven用戶的“快照”。標簽是被鼓勵使用的,尤其是當你有一個分層的文件系統。
你總不希望當你2個月之後創建鏡像時,驚訝地發現你的應用無法運行,因為最頂的分層被非向後兼容的新版本替換,
或者創建緩存中有一個錯誤的“最新”版本。在生產中部署容器時應避免使用最新。 7)不要在單一容器中運行超過一個進程-容器能完美地運行單個進程(http守護進程,應用服務器,數據庫),
但是如果你不止有一個進程,管理、獲取日誌、獨立更新都會遇到麻煩。 8)不要在鏡像中存儲憑據。使用環境變量 –不要將鏡像中的任何用戶名/密碼寫死。使用環境變量來從容器外部獲取此信息。 9)使用非root用戶運行進程 – “docker容器默認以root運行。(…)隨著docker的成熟,更多的安全默認選項變得可用。
現如今,請求root對於其他人是危險的,可能無法在所有環境中可用。你的鏡像應該使用USER指令來指令容器的一個非root用戶來運行。” 10)不要依賴IP地址 – 每個容器都有自己的內部IP地址,如果你啟動並停止它地址可能會變化。如果你的應用或微服務需要與其他容器通訊,
使用任何命名與(或者)環境變量來從一個容器傳遞合適信息到另一個。

  

Docker容器學習--1