1. 程式人生 > >Docker小記

Docker小記

一:Docker容器的安裝

1、獲取最新版本的 Docker 安裝包

[email protected]:~$ wget -qO- https://get.docker.com/ | sh

2、啟動docker 後臺服務!

[email protected]:~$ sudo service docker start

映象加速

鑑於國內網路問題,後續拉取 Docker 映象十分緩慢,我們可以需要配置加速器來解決,我使用的是網易的映象地址:http://hub-mirror.c.163.com。

新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 來配置 Daemon。

請在該配置檔案中加入(沒有該檔案的話,請先建一個):

{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

 二.docker 的基本使用

docker run 命令來在容器中執行一個應用程式

[email protected]:~$ docker run ubuntu:15.10 /bin/echo "Hello world"

各個引數解析:

  • docker: Docker 的二進位制執行檔案。

  • run:與前面的 docker 組合來執行一個容器。

  • ubuntu:15.10

    指定要執行的映象,Docker首先從本地主機上查詢映象是否存在,如果不存在,Docker 就會從映象倉庫 Docker Hub 下載公共映象。

  • /bin/echo "Hello world": 在啟動的容器裡執行的命令

執行互動式的容器

我們通過docker的兩個引數 -i -t,讓docker執行的容器實現"對話"的能力

[email protected]:~$ docker run -i -t ubuntu:15.10 /bin/bash
[email protected]:/#

各個引數解析:

  • -t:在新容器內指定一個偽終端或終端。

  • -i:允許你對容器內的標準輸入 (STDIN) 進行互動。

此時我們已進入一個 ubuntu15.10系統的容器

我們嘗試在容器中執行命令 cat /proc/versionls分別檢視當前系統的版本資訊和當前目錄下的檔案列表

我們可以通過執行exit命令或者使用CTRL+D來退出容器。

啟動容器(後臺模式)!

使用以下命令建立一個以程序方式執行的容器

[email protected]:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

引數說明:

    -d讓容器在後臺執行

在容器內使用docker logs命令,檢視容器內的標準輸出

[email protected]:~$ docker logs 2b1b7a428627

通過 docker ps 來檢視執行中的容器

停止容器

docker stop 2b1b7a428627

三、Docker容器的使用

執行一個web應用

前面我們執行的容器並沒有一些什麼特別的用處。

接下來讓我們嘗試使用 docker 構建一個 web 應用程式。

我們將在docker容器中執行一個 Python Flask 應用來執行一個web應用。!

[email protected]:~# docker pull training/webapp  # 載入映象
[email protected]:~# docker run -d -P training/webapp python app.py

引數說明:

  • -d:讓容器在後臺執行。

  • -P:將容器內部使用的網路埠對映到我們使用的主機上。

 

網路埠的快捷方式

通過 docker ps 命令可以檢視到容器的埠對映,docker 還提供了另一個快捷方式 docker port,使用 docker port 可以檢視指定 (ID 或者名字)容器的某個確定埠對映到宿主機的埠號。

上面我們建立的 web 應用容器 ID 為 bf08b7f2cd89 名字為 wizardly_chandrasekhar

我可以使用 docker port bf08b7f2cd89 或 docker port wizardly_chandrasekhar 來檢視容器埠的對映情況。

[email protected]:~$ docker port bf08b7f2cd89
5000/tcp -> 0.0.0.0:5000

我們還可以使用 docker top 來檢視容器內部執行的程序

[email protected]:~$ docker top wizardly_chandrasekhar

停止 WEB 應用容器

[email protected]:~$ docker stop wizardly_chandrasekhar   
wizardly_chandrasekhar

我們可以使用 docker rm 命令來刪除不需要的容器

[email protected]:~$ docker rm wizardly_chandrasekhar  
wizardly_chandrasekhar

四.docker 映象的使用

列出映象列表

我們可以使用 docker images 來列出本地主機上的映象。

同一倉庫源可以有多個 TAG,代表這個倉庫源的不同個版本,如ubuntu倉庫源裡,有15.10、14.04等多個不同的版本,我們使用 REPOSITORY:TAG 來定義不同的映象。

建立映象

當我們從docker映象倉庫中下載的映象不能滿足我們的需求時,我們可以通過以下兩種方式對映象進行更改。

  • 1.從已經建立的容器中更新映象,並且提交這個映象
  • 2.使用 Dockerfile 指令來建立一個新的映象

更新映象

更新映象之前,我們需要使用映象來建立一個容器。

[email protected]:~$ docker run -t -i ubuntu:15.10 /bin/bash
[email protected]:/# 

在執行的容器內使用 apt-get update 命令進行更新。

在完成操作之後,輸入 exit命令來退出這個容器。

此時ID為e218edb10161的容器,是按我們的需求更改的容器。我們可以通過命令 docker commit來提交容器副本。

[email protected]:~$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8

各個引數說明:

  • -m:提交的描述資訊

  • -a:指定映象作者

  • e218edb10161:容器ID

  • runoob/ubuntu:v2:指定要建立的目標映象名

使用我們的新映象 runoob/ubuntu 來啟動一個容器

[email protected]:~$ docker run -t -i runoob/ubuntu:v2 /bin/bash                            
[email protected]:/#

 

構建映象

我們使用命令 docker build , 從零開始來建立一個新的映象。為此,我們需要建立一個 Dockerfile 檔案,其中包含一組指令來告訴 Docker 如何構建我們的映象。

[email protected]:~$ cat Dockerfile 
FROM    centos:6.7
MAINTAINER      Fisher "[email protected]"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

每一個指令都會在映象上建立一個新的層,每一個指令的字首都必須是大寫的。

第一條FROM,指定使用哪個映象源

RUN 指令告訴docker 在映象內執行命令,安裝了什麼。。。

然後,我們使用 Dockerfile 檔案,通過 docker build 命令來構建一個映象。

[email protected]:~$ docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
 ---> d95b5ca17cc3
Step 2 : MAINTAINER Fisher "[email protected]"
 ---> Using cache
 ---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
 ---> Using cache
 ---> 0397ce2fbd0a
Step 4 : RUN useradd runoob
......

引數說明:

  • -t :指定要建立的目標映象名

  • . :Dockerfile 檔案所在目錄,可以指定Dockerfile 的絕對路徑

我們可以使用新的映象來建立容器

[email protected]:~$ docker run -t -i runoob/centos:6.7  /bin/bash
[[email protected] /]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)

設定映象標籤

[email protected]:~$ docker tag 860c279d2fec runoob/centos:dev

docker tag 映象ID(這裡是 860c279d2fec)  使用者名稱稱/映象源名(repository name):新的標籤名(tag)

Docker 容器連線

下面我們來實現通過埠連線到一個 docker 容器

網路埠對映

我們建立了一個 python 應用的容器。

[email protected]:~$ docker run -d -P training/webapp python app.py
fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d

我們也可以使用 -p 標識來指定容器埠繫結到主機埠。

兩種方式的區別是:

  • -P :是容器內部埠隨機對映到主機的高階口。
  • -p : 是容器內部埠繫結到指定的主機埠。
[email protected]:~$ docker run -d -p 5000:5000 training/webapp python app.py
33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0

另外,我們可以指定容器繫結的網路地址,比如繫結 127.0.0.1

[email protected]:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c

這樣我們就可以通過訪問 127.0.0.1:5001 來訪問容器的 5000 埠。

這樣我們就可以通過訪問 127.0.0.1:5001 來訪問容器的 5000 埠。

上面的例子中,預設都是繫結 tcp 埠,如果要繫結 UDP 埠,可以在埠後面加上 /udp

[email protected]:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a

docker port 命令可以讓我們快捷地檢視埠的繫結情況。

[email protected]:~$ docker port adoring_stonebraker 5000
127.0.0.1:5001

Docker容器連線

埠對映並不是唯一把 docker 連線到另一個容器的方法。

docker 有一個連線系統允許將多個容器連線在一起,共享連線資訊。

docker 連線會建立一個父子關係,其中父容器可以看到子容器的資訊。

容器命名

當我們建立一個容器的時候,docker 會自動對它進行命名。另外,我們也可以使用 --name 標識來命名容器,例如:

[email protected]:~$  docker run -d -P --name runoob training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441

Docker 安裝 Redis

這裡我們拉取官方的映象,標籤為3.2

[email protected]:~/redis$ docker pull  redis:3.2

等待下載完成後,我們就可以在本地映象列表裡查到REPOSITORY為redis,標籤為3.2的映象。

[email protected]:~/redis$ docker images redis 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               3.2                 43c923d57784        2 weeks ago         193.9 MB

使用redis映象

執行容器

[email protected]:~/redis$ docker run -p 6379:6379 -v $PWD/data:/data  -d redis:3.2 redis-server --appendonly yes
43f7a65ec7f8bd64eb1c5d82bc4fb60e5eb31915979c4e7821759aac3b62f330
[email protected]:~/redis$

命令說明:

-p 6379:6379 : 將容器的6379埠對映到主機的6379埠

-v $PWD/data:/data : 將主機中當前目錄下的data掛載到容器的/data

redis-server --appendonly yes : 在容器執行redis-server啟動命令,並開啟redis持久化配置

檢視容器啟動情況

[email protected]:~/redis$ docker ps
CONTAINER ID   IMAGE        COMMAND                 ...   PORTS                      NAMES
43f7a65ec7f8   redis:3.2    "docker-entrypoint.sh"  ...   0.0.0.0:6379->6379/tcp     agitated_cray
連線、檢視容器

使用redis映象執行redis-cli命令連線到剛啟動的容器,主機IP為172.17.0.1

[email protected]:~/redis$ docker exec -it 43f7a65ec7f8 redis-cli
172.17.0.1:6379> info
# Server
redis_version:3.2.0
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:f449541256e7d446
redis_mode:standalone
os:Linux 4.2.0-16-generic x86_64
arch_bits:64
multiplexing_api:epoll
...