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
-
/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/version和ls分別檢視當前系統的版本資訊和當前目錄下的檔案列表
我們可以通過執行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
...