1. 程式人生 > >docker教程之從一頭霧水到不一頭霧水(3)

docker教程之從一頭霧水到不一頭霧水(3)

wal entry 移植 span cst pan hello 實時 自然

本文主要是介紹Docker容器的相關內容

容器創建

我們已經知道,鏡像是只讀的,而基於鏡像創建出來的容器是可讀寫的,所以,一般我們實際中,會經常使用對應鏡像創建容器並且使用這些容器。同樣,如果我們想要使用容器,那麽我們必須首先需要創建容器。而且要知道一個鏡像可以同時創建多個容器

[root@206 /]# docker run -t -i ubuntu:17.10 /bin/bash
-t表示為容器分配一個偽終端 -i容器的標準輸出為打開的狀態 /bin/bash表示容器運行的地址 再執行一遍,就又創建一個容器

容器的啟動

容器的啟動主要分為兩種方式:

1、創建。 2、把終止狀態的容器啟動。

exit之後就是終止狀態

[root@206 /]# docker run -t -i ubuntu:17.10 /bin/bash
root@abc6e11de34e:/# exit
exit

查看docker上所有的容器

技術分享圖片
[root@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
abc6e11de34e        ubuntu:17.10        "/bin/bash"              11 minutes ago      Exited (0) 50 seconds ago                       ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   3 hours ago         Exited (1) 3 hours ago                          xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   3 hours ago         Exited (1) 3 hours ago                          amazing_kowalevski
技術分享圖片

再次啟動

[root@206 /]# docker start abc6
技術分享圖片
[root@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
abc6e11de34e        ubuntu:17.10        "/bin/bash"              14 minutes ago      Up 2 seconds                                 ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   3 hours ago         Exited (1) 3 hours ago                       xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   3 hours ago         Exited (1) 3 hours ago                       amazing_kowalevski
技術分享圖片

守護態運行

Docker裏的容器可以在後臺以守護態的方式運行,這樣可以方便我們對Docker的操作

[root@206 /]# docker run -d ubuntu:17.10 /bin/bash -c "while true;do echo thanks;sleep 3;done"
這裏我們創建了一個守護態運行的容器,並讓他一直輸出thanks 根據id查看容器的輸出 技術分享圖片
[root@206 /]# docker logs 9e48
thanks
thanks
thanks
thanks
thanks
thanks
thanks
thanks
...
技術分享圖片

終止

假如我們暫時不想運行某個容器,我們可以終止該容器,終止之後,對應的容器將退出運行狀態

技術分享圖片
[root@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
9e489b563341        ubuntu:17.10        "/bin/bash -c ‘whi..."   2 minutes ago       Up 2 minutes                                 inspiring_hawking
abc6e11de34e        ubuntu:17.10        "/bin/bash"              25 minutes ago      Up 11 minutes                                ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   3 hours ago         Exited (1) 3 hours ago                       xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   3 hours ago         Exited (1) 3 hours ago                       amazing_kowalevski
技術分享圖片

這裏有兩個正在後面默默運行的容器

技術分享圖片
[root@206 /]# docker stop 9e48
9e48
[root@206 /]# docker stop abc6
abc6
[root@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
9e489b563341        ubuntu:17.10        "/bin/bash -c ‘whi..."   4 minutes ago       Exited (137) 13 seconds ago                       inspiring_hawking
abc6e11de34e        ubuntu:17.10        "/bin/bash"              28 minutes ago      Exited (0) 8 seconds ago                          ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   3 hours ago         Exited (1) 3 hours ago                            xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   4 hours ago         Exited (1) 4 hours ago                            amazing_kowalevski
技術分享圖片

依附容器

我們可以使用Docker attach指令依附到某個容器中,通俗來說,就是指我們可以通過該指令進入某個容器。

沒有在運行的容器是不能依附的

技術分享圖片
[root@206 /]# docker start abc6
abc6
[root@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
9e489b563341        ubuntu:17.10        "/bin/bash -c ‘whi..."   10 minutes ago      Exited (137) 6 minutes ago                       inspiring_hawking
abc6e11de34e        ubuntu:17.10        "/bin/bash"              34 minutes ago      Up 2 seconds                                     ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   4 hours ago         Exited (1) 4 hours ago                           xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   4 hours ago         Exited (1) 4 hours ago                           amazing_kowalevski
技術分享圖片
[root@206 /]# docker attach abc6
root@abc6e11de34e:/# 

其實依附也就是進入一個容器而已

容器信息查看

查看運行中的容器

[root@206 /]# docker ps

查看所有容器

[root@206 /]# docker ps -a

查看最後一次創建的容器

[root@206 /]# docker ps -l

查看運行中的容器的id號

[root@206 /]# docker ps -q

上面的查看守護容器的log

[root@206 /]# docker logs 9e48

實時查看

[root@206 /]# docker logs -f 9e48

只查看最新兩行

[root@206 /]# docker logs --tail=2 9e48

只查看最新的兩行,且不斷實時查看

[root@206 /]# docker logs --tail=2 -f 9e48

附加產生log的具體時間

[root@206 /]# docker logs  -t 9e48

容器內命令執行

容器內命令的執行方式有兩種: 1.依附到對應容器,在對應容器中直接執行。 2.不進入對應容器,直接在主系統中通過docker exec指令對對應容器進行相關指令執行操作。而2又可分為:

2.1 後臺執行

[root@206 /]# docker exec -d abc6 touch /q.txt
[root@206 /]# docker exec -d abc6  echo "123"
[root@206 /]#

2.2 交互執行

[root@206 /]# docker exec -ti abc6 touch /w.txt
[root@206 /]# docker exec -ti abc6  echo "123"
123
結果很明顯了 docker exec -ti abc6 /bin/bash
這個比attach的好處是,不會exit就關閉容器

容器的導入導出

我們已經學過如何將某個鏡像導出成一個壓縮文件,移植到其他環境中使用。同樣,我們也可以將某個容器通過docker export指令導出為一個壓縮文件,然後存儲起來,在必要的時候可以根據該壓縮文件恢復為容器

[root@206 /]# docker export abc6 > abc6.tar
當我們想把某個容器的壓縮文件導入恢復為容器的時候,我們需要通過docker import指令進行容器的導入操作。由於容器是基於鏡像而創建的,其核心特征是在鏡像上創建一層可寫層。故而,容器的導入過程可以這樣:首先把容器壓縮文件快照導入為一個鏡像,然後基於該鏡像創建一個容器,則此時創建的新容器跟原容器性能一致,該過程即為容器的導入操作 首先把容器壓縮文件快照導入為一個鏡像
[root@206 /]# cat abc6.tar | docker import - cba:v2

查看鏡像,發現多了一個

技術分享圖片
[root@206 /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cba                 v2                  7ee75c306951        48 minutes ago      78.5 MB
<none>              <none>              cbf64eb48a64        6 hours ago         89.6 MB
newsuse             99999               7e4ff5f67461        6 hours ago         156 MB
newubuntu           8888                036d21b62a12        6 hours ago         89.6 MB
ubuntu              17.10               073e7b409b9b        43 hours ago        89.6 MB
itliucheng/ubuntu   first               073e7b409b9b        43 hours ago        89.6 MB
技術分享圖片

創建容器

[root@206 /]# docker run  -ti cba:v2 /bin/bash

雖然容器號不一樣了,但是內容是完全一樣的

數據卷

我們以後在學習Docker容器的時候,那麽容器可能會出現多個,同樣,每個容器中都會涉及數據,自然,我們就要研究如何對這些數據進行管理。管理容器中數據的方式主要有2種: 1.數據卷 2.數據卷容器 數據卷是一個可以供一個容器或者多個容器使用的特殊目錄,該目錄利用容器的UFS文件系統可以為容器提供一些穩定的特性或者數據共享,類似於Linux系統下的mount(掛載命令)
數據卷主要有4個性能: 1.數據卷可以在容器之間共享和重用 2.對數據卷的修改會立馬生效 3.對數據卷的更新,不會影響鏡像 4.卷會一直存在,直到沒有容器使用 數據卷創建
[root@206 ~]# docker run -ti -v /abctest ubuntu:17.10 /bin/bash

-v就是創建數據卷參數,並且掛載到指定的容器裏

root@f109cdc59516:/# ls
abctest  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

掛載

我們在容器中創建了數據卷之後,可以把母機器中的某個目錄或某個文件掛載到數據卷中,這樣,這個目錄或文件與容器中的數據卷內容就相當於是一個了。

[root@206 ~]# cd /
[root@206 /]# mkdir gztest
[root@206 /]# cd gztest/
[root@206 gztest]# touch a.txt

創建容器並掛載 將母機的gztest掛載到 容器中的contest中

技術分享圖片
[root@206 gztest]# docker run -ti -v /gztest:/contest ubuntu:17.10 /bin/bash
root@9647eb0d2898:/# ls
bin  boot  contest  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@9647eb0d2898:/# cd contest/
root@9647eb0d2898:/contest# ls
a.txt
技術分享圖片

延伸:如果創建的容器有權限限制,就修改成這樣創建容器docker run -ti -v /gztest:/contest --privileged=true ubuntu:17.10 /bin/bash 再或者關閉selinux 命令為: setenforce 0

同理,剛才是掛載文件夾,掛載文件同理
docker run -ti -v /file.txt:/co/b.txt ubuntu:17.10 /bin/bash

數據卷容器

所謂的數據卷容器,其實質上,是容器,但是這個容器是一個專門用來提供數據卷的容器。 那麽,為什麽要有數據卷容器呢? 因為有的時候,我們會有一些數據需要持續更新,並且這些數據需要在容器間進行共享,那麽此時,如果有一個專門的容器來提供數據卷,將會方便很多。所以,如果我們要解決數據的持久化問題,我們應當選用數據卷容器 創建一個數據卷容器,設置了容器名稱為datac1
[root@206 /]# docker run -ti -v /abc --name datac1 ubuntu:17.10 /bin/bash
技術分享圖片
[root@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
b2e8f642c525        ubuntu:17.10        "/bin/bash"              17 seconds ago      Exited (0) 8 seconds ago                        datac1
9647eb0d2898        ubuntu:17.10        "/bin/bash"              27 minutes ago      Exited (0) 14 minutes ago                       focused_jang
f109cdc59516        ubuntu:17.10        "/bin/bash"              34 minutes ago      Exited (0) 32 minutes ago                       stupefied_curie
6d8a8372d68b        cba:v2              "/bin/bash"              3 hours ago         Up 3 hours                                      unruffled_agnesi
9e489b563341        ubuntu:17.10        "/bin/bash -c ‘whi..."   6 hours ago         Exited (137) 5 hours ago                        inspiring_hawking
abc6e11de34e        ubuntu:17.10        "/bin/bash"              6 hours ago         Up 5 hours                                      ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   9 hours ago         Exited (1) 9 hours ago                          xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   9 hours ago         Exited (1) 9 hours ago                          amazing_kowalevski
技術分享圖片

創建另外一個普通容器,並掛載數據卷容器

[root@206 /]# docker run -ti --volumes-from b2e8 --name testcommon ubuntu:17.10 /bin/bash
root@f99f555cfac5:/# ls
abc  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
這裏可以用--volumes-from b2e8 也可以用--volumes-from bdatac1 我們可以看到普通容器中有一個abc文件夾,這個就是數據卷容器中的文件夾 在abc中創建文件,attach到數據卷容器中會發現這個 abc文件夾中也有新創建的文件

數據遷移

我們在這裏所說的數據遷移,是指在有必要的時候,將數據卷容器的數據卷中的數據全部轉移到一個新的地方。我們實現遷移的原理是:首先將數據卷容器的相應數據卷進行備份,然後將備份文件保存起來,在有需要的時候,再將備份文件恢復為原來的數據卷,並且數據卷裏面的內容要完整保存 要想對數據卷裏面的內容進行備份,我們可以這樣做:加載源數據卷容器裏面的數據卷,並在新的容器中把加載過來的數據卷歸檔存放,在進行以上操作的同時,將當前目錄掛載到新容器存放歸檔文件的目錄中,這樣就可以直接在當前文件取到對應的壓縮文件了。 意思就是 :創建一個普通容器,並掛載數據卷容器,同時這個普通容器還掛載了母機的一個文件夾,這樣普通容器能操作數據卷,壓縮數據卷後放入母機關聯的文件夾,這樣在母機上也能操作 技術分享圖片
[root@206 /]# docker run -ti -v /abcd --name abc ubuntu:17.10 /bin/bash
root@42fae694e443:/# ls
abcd  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@42fae694e443:/# cd abcd/
root@42fae694e443:/abcd# touch a.txt&&touch b.txt
root@42fae694e443:/abcd# ls
a.txt  b.txt
技術分享圖片

創建普通容器

[root@206 /]# docker run -ti --volumes-from 42fa -v /gztest:/backup --name backcontainer ubuntu:17.10 tar cvf /backup/task1.tar /abcd

母機上

[root@206 /]# cd gztest/
[root@206 gztest]# ls
a.txt  task1.tar

數據恢復就不說了,在建立一個容器,將母機文件所在目錄掛載到容器的目錄中

容器命名

從之前到現在,創建了很多的容器

技術分享圖片
[root@206 /]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                     NAMES
c977c2f4e1a9        ubuntu:17.10        "/bin/bash"              24 minutes ago      Up 24 minutes               0.0.0.0:32769->8998/tcp   net2
e617f1cd394d        ubuntu:17.10        "/bin/bash"              25 minutes ago      Exited (0) 25 minutes ago                             net1
dbb53a5ddc3e        ubuntu:17.10        "tar cvf /backup/t..."   50 minutes ago      Exited (0) 50 minutes ago                             backcontainer
42fae694e443        ubuntu:17.10        "/bin/bash"              57 minutes ago      Exited (0) 56 minutes ago                             abc
f99f555cfac5        ubuntu:17.10        "/bin/bash"              13 hours ago        Exited (0) 13 hours ago                               testcommon
b2e8f642c525        ubuntu:17.10        "/bin/bash"              13 hours ago        Exited (0) 13 hours ago                               datac1
9647eb0d2898        ubuntu:17.10        "/bin/bash"              14 hours ago        Exited (0) 13 hours ago                               focused_jang
f109cdc59516        ubuntu:17.10        "/bin/bash"              14 hours ago        Exited (0) 14 hours ago                               stupefied_curie
6d8a8372d68b        cba:v2              "/bin/bash"              17 hours ago        Exited (255) 2 hours ago                              unruffled_agnesi
9e489b563341        ubuntu:17.10        "/bin/bash -c ‘whi..."   19 hours ago        Exited (137) 19 hours ago                             inspiring_hawking
abc6e11de34e        ubuntu:17.10        "/bin/bash"              20 hours ago        Exited (255) 2 hours ago                              ecstatic_meitner
bcd455f0bc0f        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   23 hours ago        Exited (1) 23 hours ago                               xenodochial_minsky
2f90664d6391        cbf64eb48a64        "/bin/sh -c ‘mkdir..."   23 hours ago        Exited (1) 23 hours ago                               amazing_kowalevski
技術分享圖片

我們先根據容器id查一下容器名稱

[root@206 /]# docker inspect -f "{{.Name}}" 2f90
/amazing_kowalevski

docker不允許容器同名。若出現同名

1、先刪除原容器,再創建新容器。

[root@206 /]# docker rm amazing_kowalevski

把容器名換成id一樣

2、使用--rm標記,一旦容器退出,自動刪除容器

[root@206 /]# docker run -ti --name advc --rm ubuntu:17.10

exit之後容器已經刪除了

網絡服務

Docker可以提供網絡服務。 Docker提供網絡服務,主要有兩種方式:
1、外部訪問
我們在Docker的容器中,可以運行一些網絡應用,比如WEB應用等,如果這些應用需要跟外界進行交互,那麽一般使用外部訪問容器的方式進行。主要會通過端口映射的方式解決。
[root@206 /]# docker run -t -P --expose 8998 --name net2 ubuntu:17.10

-P表示可以外部訪問

--expose綁定端口

[root@206 /]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
c977c2f4e1a9        ubuntu:17.10        "/bin/bash"         12 seconds ago      Up 11 seconds       0.0.0.0:32769->8998/tcp   net2

所以我們可以瀏覽器192.168.126.206:32769來訪問該服務,由於容器裏並沒有什麽web項目,所以訪問也沒效果

[root@206 /]# docker port net2 8998
0.0.0.0:32769

還可以這樣 小寫的p

[root@206 /]# docker run -t -p 192.168.126.205:8999:5001 --name net3 ubuntu:17.10

他表示訪問192.168.126.206:8999來訪問容器的5001端口

2、容器互聯

容器互聯的方式會在接收容器與源容器間創建一個隧道,接收容器可以看到源容器的指定信息

創建源容器

[root@206 /]# docker run -ti --name hl1 ubuntu:17.10
[root@206 /]# docker start hl1

創建接收容器

[root@206 /]# docker run -ti --name hl2 --link hl1:yuan1 ubuntu:17.10
:yuan1表示給源容器起的別名,可以不加 此時這兩個容器就算是互聯了 我們在進行了容器互聯之後,有時我們需要查找某些容器的互聯信息,此時我們就要進行連接信息的公開。 一般,要公開連接信息,有兩種方式 1、hosts文件法

我們可以進入連接容器也就是接收容器然後找到/etc/hosts文件,並cat查看,即可以把該容器的連接信息公開出來,包括該連接容器對應的源容器信息等。公開之後,我們可以使用ping命令測試連接是否通暢。

技術分享圖片
root@7a9dee156249:/# cat /etc/hosts 
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3      yuan1 30bd2045b737 hl1
172.17.0.4      7a9dee156249
技術分享圖片

執行 ping 172.17.0.3 或者 ping hl1 即可

2、環境變量法

技術分享圖片
[root@206 /]# docker run -ti --name hl3 --link hl1:yuan2 ubuntu:17.10 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=7a91ce8a9480
TERM=xterm
YUAN2_NAME=/hl3/yuan2
HOME=/root
技術分享圖片

Dockerfile的使用

這是以前學的只用Dockerfile創建鏡像

[root@206 test]# touch Dockerfile
FROM newubuntu:8888
MAINTAINER root
RUN touch a.txt
RUN mkdir test1

CMD:執行docker run時執行某行指令,具有替換性

技術分享圖片
FROM ubuntu:17.10
MAINTAINER root
CMD ["echo"]
[root@206 test]# docker build -t="copyubuntu" /test
[root@206 /]# docker run -ti copyubuntu echo hello
hello
技術分享圖片

ENTRYPOINT:執行docker run時執行某行指令,不具有替換性

[root@206 test]# vi Dockerfile 
FROM ubuntu:17.10
MAINTAINER root
ENTRYPOINT ["echo"]
[root@206 /]# docker build -t="copyubuntu1" /test
[root@206 /]# docker run -ti copyubuntu1 echo hello
echo hello
USER:使用哪個用戶運行容器 EXPOSE:綁定哪個內部端口,構建鏡像的時候,開啟哪個端口 ENV:環境變量設置,構建鏡像的時候添加環境變量配置 ADD: 跟copy類似 ,將本機某個文件,在生成鏡像的時候,放入鏡像中,同時add有另外的解壓功能,也就是拷貝進去後會自動解壓 COPY :從本地復制文件到鏡像中

docker教程之從一頭霧水到不一頭霧水(3)