Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的Linux機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。php
一個完整的Docker有如下幾個部分組成:node
- dockerClient客戶端
- Docker Daemon守護進程
- Docker Image鏡像
- DockerContainer容器
容器:
存儲、運輸工具linux
實現對容器內部的物品實現包含(實現了一個相對隔離的環境)nginx
容器:模擬(虛擬)出一個相對隔離的空間web
鏡像:
用來建立容器的模版,放在鏡像倉庫中,例如nginx,redis,httpd等redis
Docker與Kvm的對比
kvm:
1. 虛擬機docker
2. 使用複雜數據庫
3. 啓動過程相對慢(分鐘)json
4. 模版文件較大ubuntu
5. 和物理徹底隔離
6. 模擬的是一個完整系統,能夠登陸並實現管理
docker:
1. 直接虛擬出來一個用戶空間
2. 使用簡單
3. 啓動很是塊(秒級)
4. 模版文件很小
5. 在必定程度上和物理機隔離
6. 僅僅是模擬一部分用戶空間,不方便管理
Docker使用理由
1. 快速部署服務
2. 實現隔離
3. 讓一個主機運行多個容器
4. 提升開發效率
5. 簡化配置過程
6. 實現軟件的跨平臺
Docker鏡像加速配置
第一步:打開阿里雲網站
https://www.aliyun.com/?utm_content=se_1000301910
第二步:進行阿里雲註冊
略
第三步:點擊控制檯
第四步:點擊產品與服務>鏡像與服務
第五步:點擊鏡像加速器,記住本身的加速器地址
Docker的安裝與配置
安裝docker須要配置網絡yum源,centos7自帶的版本過低了
第一步:下載阿里雲的docker安裝包
在yum倉庫的目錄之下
[root@localhost yum.repos.d]# wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
還須要使用到extra和epel源
[extra]
name=centos extra
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
[epel]
name=epel
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/epel/7Server/x86_64/
第二步:使用yum便可進行安裝
docker-ce是社區版,是免費的
docker-ee是企業版,是收費的
這裏咱們下載社區版的
[root@ken ~]# yum install docker-ce -y
第三步:添加加速器地址
把剛纔註冊獲得的鏡像加速地址以下步驟填寫進去
[root@ken ~]# mkdir /etc/docker
[root@ken ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://XXX.mirror.aliyuncs.com"]
}
第四步:重啓docker
[root@ken ~]# systemctl restart docker
Docker有關鏡像的操做命令詳解
第一步:獲取鏡像的使用幫助
[root@ken ~]# docker image --help
Usage: docker image COMMAND
Manage images
第二步:docker鏡像的使用命令詳解
build 從docker文件裏面建立鏡像
history 顯示一個鏡像的歷史
import 從歸檔文件中建立鏡像
inspect 顯示一個一個或多個鏡像的詳細信息
load 加載一個鏡像從tar壓縮包或者標準輸入
ls 列出鏡像
prune 移除沒有被使用的鏡像
pull 從註冊處拉取一個鏡像或者鏡像庫
push 把一個鏡像或者鏡像庫推送至註冊處
rm 移除一個或多個鏡像
save 保存一個或者多個鏡像到tar壓縮包,默認狀況下流式傳輸到
tag 建立一個引用SOURCE_IMAGE的標記TARGET_IMAGE
Docker鏡像的操做命令演示
一. 查看註冊表中是否有nginx鏡像
[root@ken ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 10326 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con?? 1471 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of?? 650 [OK]
jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p?? 441 [OK]
kong Open-source Microservice & API Management la?? 249 [OK]
webdevops/php-nginx Nginx with PHP-FPM 117 [OK]
kitematic/hello-world-nginx A light-weight nginx container that demonstr?? 112
...
二.下載nginx鏡像
[root@ken ~]# docker image pull nginx
三:查看本地鏡像
[root@ken ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest e81eb098537d 10 days ago 109MB
四:導入鏡像
這裏我準備了一個redis的鏡像壓縮包
這樣就獲取到了redis的鏡像
壓縮包不須要解壓
[root@ken ~]# docker image load < redis_img.tar.gz
d626a8ad97a1: Loading layer [==================================================>] 58.46MB/58.46MB
fd0ff4158c63: Loading layer [==================================================>] 338.4kB/338.4kB
f1e69ab74fb6: Loading layer [==================================================>] 3.034MB/3.034MB
5935063a73de: Loading layer [==================================================>] 24.83MB/24.83MB
72ebea29957d: Loading layer [==================================================>] 1.536kB/1.536kB
56631ad86187: Loading layer [==================================================>] 3.584kB/3.584kB
Loaded image: redis:latest
[root@ken ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest e81eb098537d 10 days ago 109MB
redis latest 55cb7014c24f 5 months ago 83.4MB
[root@ken ~]#
五:鏡像導出
寫成壓縮包的形式
[root@ken ~]# docker image save nginx > /tmp/nginx.tar.gz
[root@ken ~]# ls /tmp/nginx.tar.gz
/tmp/nginx.tar.gz
六:顯示nginx鏡像的詳細信息
[root@ken ~]# docker inspect nginx
[
{
"Id": "sha256:e81eb098537d6c4a75438eacc6a2ed94af74ca168076f719f3a0558bd24d646a",
"RepoTags": [
"nginx:latest"
],
"RepoDigests": [
"nginx@sha256:31b8e90a349d1fce7621f5a5a08e4fc519b634f7d3feb09d53fac9b12aa4d991"
],
"Parent": "",
"Comment": "",
"Created": "2018-11-16T13:32:10.147294787Z",
"Container": "d4fa15093ad8ad3df60d7403c1752a379503686e32a76b70771b3ea268ec5d66",
"ContainerConfig": {
"Hostname": "d4fa15093ad8",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
...
七:刪除nginx的鏡像
[root@ken ~]# docker image rm nginx
Untagged: nginx:latest
Untagged: nginx@sha256:31b8e90a349d1fce7621f5a5a08e4fc519b634f7d3feb09d53fac9b12aa4d991
Deleted: sha256:e81eb098537d6c4a75438eacc6a2ed94af74ca168076f719f3a0558bd24d646a
Deleted: sha256:7055505a92c39c6f943403d54a1cda020bfeb523b55d9d78bfe1dad0dd32bb2d
Deleted: sha256:378a8fcc106dc4d3a9f2dc0b642b164e25de3aab98a829e72b2d8c0cf0bad8ee
Deleted: sha256:ef68f6734aa485edf13a8509fe60e4272428deaf63f446a441b79d47fc5d17d3
[root@ken ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 55cb7014c24f 5 months ago 83.4MB
Docker有關容器的操做命令詳解
第一步:獲取容器的命令的使用幫助
[root@ken ~]# docker container --help
Usage: docker container COMMAND
Manage containers
第二步:docker容器的使用命令詳解
attach 將本地標準輸入,輸出和錯誤流附加到正在運行的容器
commit 根據容器的更改建立新鏡像
cp 在容器和本地文件系統之間複製文件/文件夾
create 建立一個新的容器
diff 檢查容器文件系統上的文件或目錄的更改
exec 在正在運行的容器中運行命令
export 將容器的文件系統導出爲tar存檔
inspect 顯示一個或多個容器的詳細信息
kill 殺死一個或多個正在運行的容器
logs 獲取容器的日誌
ls 列出容器
pause 暫停一個或多個容器中的全部進程
port 列出端口映射或容器的特定映射
prune 刪除全部已中止的容器
rename 重命名容器
restart 重啓一個或多個容器
rm 刪除一個或多個容器
run 在新容器中運行命令
start 啓動一個或多個已中止的容器
stats 顯示容器資源使用狀況統計信息的實時流
stop 中止一個或多個正在運行的容器
top 顯示容器的運行進程
unpause 取消暫停一個或多個容器中的全部進程
update 更新一個或多個容器的配置
wait 等待,直到一個或多個容器中止,而後打印退出代碼
Docker容器的操做命令演示
一.啓動redis容器
–name:指定容器名字
-d:表示後臺運行
[root@ken ~]# docker container run --name redis1 -d redis
4cd31fa09d483ed87c8fe390a49c13fdba0652df33e2ae1cb44a1f8426578afd
二.查看容器
使用ls
[root@ken ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4cd31fa09d48 redis "docker-entrypoint.s?? 39 seconds ago Up 38 seconds 6379/tcp redis1
三.查看全部的容器
ps -a: 列出全部的容器包括運行和中止的
ps: 僅僅列出正在運行的
[root@ken ~]# docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4cd31fa09d48 redis "docker-entrypoint.s?? About a minute ago Up About a minute 6379/tcp redis1
054bc8b8aab7 redis "docker-entrypoint.s?? 2 minutes ago Exited (0) 2 minutes ago confident_goldstine
四.查看容器的詳細信息
inspect後面加上容器名字便可獲取有關容器的詳細信息
[root@ken ~]# docker container inspect redis1
[
{
"Id": "4cd31fa09d483ed87c8fe390a49c13fdba0652df33e2ae1cb44a1f8426578afd",
"Created": "2018-11-26T20:22:23.099937767Z",
"Path": "docker-entrypoint.sh",
"Args": [
"redis-server"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
...
五.中止容器
使用stop
[root@ken ~]# docker container stop redis1
redis1
[root@ken ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
六.啓動容器
使用start
[root@ken ~]# docker container start redis1
redis1
[root@ken ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4cd31fa09d48 redis "docker-entrypoint.s?? 8 minutes ago Up 1 second 6379/tcp redis1
七.登陸容器
第一種方法:
exec -it 容器名 /bin/sh
-i: 表示啓動爲交互模式
-t:表示分配一個終端
登陸進去以後發現咱們能夠執行有掛redis的命令了
[root@ken ~]# docker container exec -i -t redis1 /bin/sh
#
#
# redis-cli
127.0.0.1:6379> set ken 520
OK
127.0.0.1:6379> get ken
"520"
退出以後容器沒有中止
[root@ken ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4cd31fa09d48 redis "docker-entrypoint.s?? 13 minutes ago Up 4 minutes 6379/tcp redis1
第二種方法:
attach:會致使當退出的時候,自動中止容器
不建議使用
[root@ken ~]# docker container attach redis1
^C1:signal-handler (1543264604) Received SIGINT scheduling shutdown...
1:M 26 Nov 20:36:44.315 # User requested shutdown...
1:M 26 Nov 20:36:44.315 * Saving the final RDB snapshot before exiting.
1:M 26 Nov 20:36:44.327 * DB saved on disk
1:M 26 Nov 20:36:44.327 # Redis is now ready to exit, bye bye...
[root@ken ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
第三種方法:
基於nsenter進入
第一步:啓動容器
[root@ken ~]# docker container start redis1
redis1
[root@ken ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4cd31fa09d48 redis "docker-entrypoint.s?? 16 minutes ago Up 6 seconds 6379/tcp redis1
第二步:獲取容器的pid
[root@ken ~]# docker container inspect -f '{{.State.Pid}}' redis1
6036
第三步:登陸容器
-t: 從中獲取名稱空間的目標進程
-u: 輸入UTS名稱空間(主機名等)
-i: 進入System V IPC命名空間
-n: 輸入網絡命名空間
-p:輸入pid命名空間
[root@ken ~]# nsenter -t 6036 -u -i -n -p
[root@4cd31fa09d48 ~]# ps
PID TTY TIME CMD
2595 pts/0 00:00:01 bash
6216 pts/0 00:00:00 nsenter
6217 pts/0 00:00:00 bash
6250 pts/0 00:00:00 ps
退出時不會中止容器
[root@4cd31fa09d48 ~]# exit
logout
[root@ken ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4cd31fa09d48 redis "docker-entrypoint.s?? 23 minutes ago Up 6 minutes 6379/tcp redis1
八.刪除容器
第一步:須要中止容器
[root@ken ~]# docker container stop redis1
redis1
[root@ken ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
第二步:刪掉容器
[root@ken ~]# docker container rm redis1
redis1
[root@ken ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
補充:一次性刪除所有已經退出的容器
docker stop,支持「優雅退出」。先發送SIGTERM信號,在一段時間以後(10s)再發送SIGKILL信號。Docker內部的應用程序能夠接收SIGTERM信號,而後作一些「退出前工做」,好比保存狀態、處理當前請求等。
1. 服務類容器以 daemon 的形式運行,對外提供服務。好比 web server,數據庫等。經過 -d
之後臺方式啓動這類容器是很是合適的。若是要排查問題,能夠經過 exec -it
進入容器。
2. 工具類容器一般給能咱們提供一個臨時的工做環境,一般以 run -it
方式運行,好比:
無效的 none 鏡像
另外一種類型的 < none>:< none> 鏡像是dangling images ,這種類型會形成磁盤空間佔用問題。
像這些 dangling鏡像主要是咱們觸發 docker build 和 docker pull命令產生的。
用一個例子來說解:
假設咱們要構建一個新的鏡像,Dockerfile 文件以下
1
2
|
FORM Ubuntu:latest
RUN echo ‘hello world’
|
當咱們構建 docker build -t hello-world ./ 的時候,會生成一個新的鏡像。
但是過了一個月以後,Ubuntu發佈了新的鏡像,這個時候咱們再次構建一個 hello world鏡像,會依賴於最新的 Ubuntu
問題來了,咱們引用舊的Ubuntu的hello-world鏡像,這個時候就會成爲沒有標籤的 dangling鏡像!使用下面的命令能夠清理
[root@ken-node3 ~]# docker rmi $(docker images -f "dangling=true" -q)
docker沒有自動垃圾回收處理機制,將來可能會有這方面的改進,可是目前咱們只能這樣手動清理(寫個腳本就好)。