Before Docker
爲什麼Docker技術會產生併成爲熱點?先看看Docker之前出現的若干工具。
虛擬機
步驟多 啓動慢
Linux容器
Linux 容器技術能夠讓您對應用及其整個運行時環境(包括全部所需文件)一起進行打包或隔離。從而讓您可以在不同環境(如開發、測試和生產等環境)之間輕鬆遷移應用,同時還可保留應用的全部功能。
相比上面的兩種工具,Docker更加輕便、實用。
Docker架構
鏡像(Image):Docker 鏡像(Image),就相當於是一個 root 文件系統。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 文件系統。
容器(Container):鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啓動、停止、刪除、暫停等。
倉庫(Repository):倉庫可看着一個代碼控制中心,用來保存鏡像。
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。
Docker 容器通過 Docker 鏡像來創建。
容器與鏡像的關係類似於面向對象編程中的對象與類。
容器和鏡像的區別:容器最上面一層可讀寫,鏡像只讀
Docker的運行原理
如圖,Docker容器通過後臺守護進程和客戶端通信。
爲什麼Docker比VM快?
啓動容器
交互模式
runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash
root@0123ce188bd8:/#
–name: 命名
-t: 在新容器內指定一個僞終端或終端。
-i: 交互模式運行。
it選項經常一起使用。
-P:將容器內部使用的網絡端口映射到我們使用的主機上。
-p 設置端口
我們可以通過運行 exit 命令或者使用 CTRL+D 來退出容器。
後臺模式
使用以下命令創建一個以進程方式運行的容器
加了 -d 參數默認不會進入容器
runoob@runoob:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
使用以下方式可以避免這個問題:
$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
常用命令
1. 幫助命令
docker version
docker info
docker --help
2.鏡像命令
查看本地鏡像
$ docker images
tag 是鏡像版本,鏡像名字是 image_name:tag ,默認tag是latest
查找鏡像
$ docker search image_name[:tag]
在docker hub上查詢對應鏡像
–filter=star=?:限制star數量的下限
拉取鏡像
$ docker pull image_name[:tag]
刪除鏡像
$ docker rmi image_name[:tag]
$ docker rmi -f $(docker images .....)
3. 容器命令
新建並啓動容器
$ docker run
啓動/重啓/停止容器
$ docker start/stop/restart
強制停止容器
$ docker kill
查找容器
$ docker ps
查看正在運行的容器。
後臺模式進入容器
在使用 -d 參數時,容器啓動後會進入後臺。此時想要進入容器,可以通過以下指令進入:
- docker attach:直接進入容器啓動命令的終端,不啓動新進程
- docker exec (-it):直接在對應容器運行命令,沒有進入容器,啓動了一個新進程
退出容器
- exit:容器停止退出
- ctrl+P+Q:容器不停止退出
導出和導入容器
如果要導出本地某個容器,可以使用 docker export 命令。
$ docker export 1e560fca3906 > ubuntu.tar
導出容器 1e560fca3906 快照到本地文件 ubuntu.tar。
這樣將導出容器快照到本地文件。
可以使用 docker import 從容器快照文件中再導入爲鏡像。
$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1 ;將快照文件 ubuntu.tar 導入到鏡像 test/ubuntu:v1
$ docker import http://example.com/exampleimage.tgz example/imagerepo ;根據URL導入
刪除已經停止的容器
刪除容器使用 docker rm 命令:
$ docker rm -f 1e560fca3906
$ docker rm $(docker ps....)
下面的命令可以清理掉所有處於終止狀態的容器。
$ docker container prune
4. 容器高級命令
後臺模式運行容器
$ docker run -d
查看容器日誌
$ docker logs -f -t --tail container_id
查看容器內進程
$ docker top container_id
查看容器內細節
$ docker inspect container_id
從容器copy數據到主機
$ docker cp container_id:conatiner_path/file host_path
從容器創建鏡像
$ docker commit
數據卷(Data Volume)
Docker數據卷用來將容器中的數據持久化,保存容器的數據。
- 數據卷可以在容器間共享數據
- 卷中更改可立即生效
- 數據卷的更新不包含在鏡像的更新中
- 當沒有容器使用它時,數據卷的生命週期結束
- 容器停止退出後,主機修改的數據依然可以同步
在用docker run命令的時候,使用-v標記可以在容器內創建一個數據卷。多次重複使用-v標記可以創建多個數據卷。
$ docker run -it -v /host_path:/container_path container_id
可用docker inspect 查看數據卷(volumes)的設置。
可以設置在容器內的數據卷只讀,只可在宿主機修改。
$ docker run -it -v /host_path:/container_path:ro container_id
容器數據卷
容器之間可以互相掛載,實現數據的傳遞依賴。
容器需要命名。
掛載是雙向的,父容器和子容器之間的數據可以雙向共享。
$ docker run -it --volume-from father_container_name container_id
父容器的消失不會導致數據卷丟失數據,直到沒有容器使用它時,數據卷的生命週期才結束。
Dockerfile
什麼是 Dockerfile?
Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。
可以用docker build+DockerFile生成鏡像。
在Dockerfile中添加數據卷
利用VOLUME關鍵字,可添加多個數據卷。用docker inspect可以查看run容器之後的宿主機對應路徑。