Docker介紹及經常使用操做演示(一)

Docker簡介

 

Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的Linux機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。php

一個完整的Docker有如下幾個部分組成:node

  1. dockerClient客戶端
  2. Docker Daemon守護進程
  3. Docker Image鏡像
  4. 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

 

補充:一次性刪除所有已經退出的容器

[root@ken1 ~]# docker rm $(docker ps -aq)

 

 

docker stop 與 docker kill 都可以將容器停掉,但兩者究竟有什麼區別呢?首先,摘錄一下官網對這兩個功能的描述:

  • docker stopStop a running container (send SIGTERM, and then SIGKILL after grace period) […] The main process inside the container will receive SIGTERM, and after a grace period, SIGKILL. [emphasis mine]
  • docker killKill a running container (send SIGKILL, or specified signal) […] The main process inside the container will be sent SIGKILL, or any signal specified with option –signal. [emphasis mine]

docker stop,支持「優雅退出」。先發送SIGTERM信號,在一段時間以後(10s)再發送SIGKILL信號。Docker內部的應用程序能夠接收SIGTERM信號,而後作一些「退出前工做」,好比保存狀態、處理當前請求等。

docker kill,發送SIGKILL信號,應用程序直接退出。

 

按用途容器大體可分爲兩類:服務類容器和工具類的容器。

1. 服務類容器以 daemon 的形式運行,對外提供服務。好比 web server,數據庫等。經過 -d 之後臺方式啓動這類容器是很是合適的。若是要排查問題,能夠經過 exec -it 進入容器。

2. 工具類容器一般給能咱們提供一個臨時的工做環境,一般以 run -it 方式運行,好比:

 

運行 busybox,run -it 的做用是在容器啓動後就直接進入。執行 exit 退出終端,同時容器中止。

工具類容器多使用基礎鏡像,例如 busybox、debian、ubuntu 等。

  1. 當 CMD 或 Entrypoint 或 docker run 命令行指定的命令運行結束時,容器中止。以下圖
  2. 經過 -d 參數在後臺啓動容器。
  3. 經過 exec -it 可進入容器並執行命令。

 

指定容器的三種方法:

  1. 短ID。
  2. 長ID。
  3. 容器名稱。 可經過 --name 爲容器命名。重命名容器可執行docker rename

容器按用途可分爲兩類:

  1. 服務類的容器。
  2. 工具類的容器。

 

 

 

無效的 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沒有自動垃圾回收處理機制,將來可能會有這方面的改進,可是目前咱們只能這樣手動清理(寫個腳本就好)。

相關文章
相關標籤/搜索