Docker入門學習三之運行Docker鏡像和容器

1、第一個Docker鏡像和容器——HelloWorldnginx

      1.學習幾條命令docker

  • docker pull [OPTION] NAME[:TAG] :表示從Docker的遠程倉庫拉取一個鏡像到本地,NAME是必填內容,即咱們所要拉取的鏡像的名稱,[:TAG]是可選的,若是不填,則默認會加上[:LA],表示鏡像的最新版本,若是填了就會制定鏡像的具體版本,因此[:TAG]就是版本的意思。
  • docker imags [OPTION] [REPOSITORY[:TAG] ] :表示查看本地都有哪些鏡像,也能夠用來驗證pull是否成功,[REPOSITORY[:TAG] ]這個能夠用來指定鏡像的名稱和版本,特別是當本地鏡像比較多的時候,會用的比較多。
  • docker run [OPTION] IMAGE[:TAG] [COMMAND][ARG...] :IMAGE表示要運行的鏡像名稱,[:TAG]表示鏡像的版本,[COMMAND]表示鏡像運行起來以後要執行什麼命令,[ARG...]表示要執行的命令所依賴的參數, [OPTION] 表示運行起來的一些選項,很是多且複雜。
  • docker ps 能夠查看當前機器運行的容器
  • docker exec [OPTION] CONTAINER[:TAG] [COMMAND][ARG...] :表示進入一個運行中的容器的內部(好比查看日誌,系統是否正常,調試鏡像是否正常),CONTAINER容器名稱或容器ID,[:TAG]容器版本,[COMMAND]要的命令在容器中運行,經常使用的[OPTION]有-i :保證咱們的輸入有效在沒有attached的時候,-t :分配一個僞終端,以便輸入內容。

      2.案例:咱們從遠程pull一個hello-word鏡像ubuntu

      (1)拉取鏡像,能夠看到不加[:TAG] 會默認拉取最新的瀏覽器

docker pull hello-word
Using default tag: latest
latest: Pulling from library/hello-world

5b0f327be733: Pull complete
Digest: sha256:175735360662078abd70dacb73c5518d5b3ae7c1ed069d22def5da57c3e917d6
Status: Downloaded newer image for hello-world:latest

      (2)查看本地鏡像,REPOSITORY鏡像名字,TAG鏡像版本,IMAGE ID 64位字符串(這裏只顯示了12位,被截取了),惟一標識鏡像,CREATED最後修改時間,SIZE鏡像大小。bash

C:\WINDOWS\system32>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              05a3bd381fc2        7 weeks ago         1.84kB

      注意:鏡像的名稱爲何是hello-world,這個是能夠到遠程鏡像倉庫中心能夠查詢到的,而pull時只提供鏡像的名稱,而沒有倉庫地址信息,則默認到Docker的鏡像倉庫中心http://hub.docker.com獲取鏡像。網絡

      (3)運行hello-world鏡像,若是成功的顯示以下,表示成功運行,且你的Docker安裝是沒有問題的。app

C:\WINDOWS\system32>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              05a3bd381fc2        7 weeks ago         1.84kB

C:\WINDOWS\system32>docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

爲了生成下面的消息,Docker花費了如下步驟:
To generate this message, Docker took the following steps:
 1. Docker 客戶端鏈接了daemon
 1. The Docker client contacted the Docker daemon.

 2. Docker daemon 從Docker倉庫拉取了hello-world鏡像
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.

 3. Docker daemon 從這個鏡像中建立了一個容器,這個容器運行了一個可執行文件,可執行文件能夠產生你當前看到的輸出
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.

 4. Docker daemon 把輸出變成輸出流給到Docker客戶端,Docker客戶端將它發送到了你的終端
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

      3.圖解Docker從拉取鏡像到運行鏡像整個流程:tcp

     

  • 首先左邊是咱們本機的Docker客戶端,中間是本機由Docker daemon管理的容器和鏡像,最右邊則是Docker的遠程倉庫;
  • docker pull命令,經由客戶端發起請求,告知Docker daemon要拉取哪一個鏡像,Docker daemon則會先在本地查找鏡像是否存在,若是存在而且就是所要拉取的版本就不會作任何的操做,若是不存在,下一步它就會到Docker的遠程倉庫中查找咱們要拉取鏡像的名字,若是找到了就會從Docker遠程倉庫下載到咱們本地;
  • docker run命令,經由客戶端發起請Docker daemon,Docker daemon接收到請求會先檢查本機鏡像是否存在,若是不存在就會執行一個docker pull命令(先從遠程Docker倉庫將鏡像下載回來),而後將鏡像通過必定的方式運行起來,變成Docker的容器。

2、Docker運行Nginx鏡像ide

      1.Nginx鏡像學習

  • 持久運行的容器
  • 前臺掛起 & 後臺運行,最好使用後臺運行
  • 進入容器內部

      2.運行Nginx鏡像步驟

      (1)前往網易蜂巢鏡像中心https://c.163.com/hub#/m/home/查找Nginx鏡像,須要登陸!而後搜索Nginx,能夠看到以下,有兩個Nginx鏡像,一個是library/nginx,一個是public/nginx,經過圖標也能夠區別,第一個也就是帶有鯨魚圖標的是從Docker官網的鏡像倉庫同步過來的,和Dokcer的是一摸同樣的,咱們使用Docker的鏡像,咱們點開它,而後複製下載地址http://docker pull hub.c.163.com/library/nginx:latest

     

      

 

      (2)而後到終端上將它pull下來,再查看鏡像,能夠看到Nginx鏡像成功拉取下來了!

C:\WINDOWS\system32>docker pull hub.c.163.com/library/nginx:latest
latest: Pulling from library/nginx
5de4b4d551f8: Pull complete
d4b36a5e9443: Pull complete
0af1f0713557: Pull complete
Digest: sha256:f84932f738583e0169f94af9b2d5201be2dbacc1578de73b09a6dfaaa07801d6
Status: Downloaded newer image for hub.c.163.com/library/nginx:latest

C:\WINDOWS\system32>docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
hello-world                   latest              05a3bd381fc2        7 weeks ago         1.84kB
hub.c.163.com/library/nginx   latest              46102226f2fd        6 months ago        109MB

      (3)咱們使用docker run hub.c.163.com/library/nginx運行Nginx鏡像

docker run hub.c.163.com/library/nginx

      運行以後,你會發現沒有任何反應,咱們再開一個終端查看下當前運行的容器,你能夠看到Nginx其實已經運行起來了,說明這是使用前臺啓動的方式,咱們使用Ctrl+C把它停了,再次docker ps,發現已經中止運行了。

C:\WINDOWS\system32>docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED              STATUS              PORTS               NAMES
f756bb16d3cc        hub.c.163.com/library/nginx   "nginx -g 'daemon ..."   About a minute ago   Up About a minute   80/tcp              modest_poincare

      其實最好的運行方式是後臺運行,使用docker run -d代表運行程序在後臺,並打印容器的ID (若是不知道用什麼參數,可使用docker run --help查看幫助),再經過查看docker ps是否成功運行。

C:\WINDOWS\system32>docker run -d hub.c.163.com/library/nginx
6f80393759d2ac6884faa5a5ff78588e7e57838e613c054cb960513c730af981

      (4)進入容器內容 docker exec -it 6f80 bash

C:\WINDOWS\system32>docker exec -it 6f80 bash
root@6f80393759d2:/# ls
bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  etc  lib   lib64  media   opt  root  sbin  sys  usr
root@6f80393759d2:/# which nginx
/usr/sbin/nginx
root@6f80393759d2:/# exit
exit

      3.Docker網絡

      (1)網絡類型

      Docker的隔離性,網絡也是隔離性的一部分,Linux用了namespace(即命名空間)來進行資源的隔離,好比pid namespace就是用來隔離進程的,network namespace就是用來隔離網絡的,每個network namespace都提供了一個獨立的網絡環境,包括像網卡、路由、iptable規則等都是與其餘的network namespace隔離的。

  • Bridge :Docker容器通常在默認狀況下,會分配一個獨立的network namespace,也就是網絡類型中的Bridge橋接模式。
  • Host :另外一種是Host,若是啓動容器指定使用Host模式,那麼這個容器就不會得到一個獨立的network namespace,而是和主機共同使用一個,這個時候容器不會再虛擬出本身的網卡、配置本身的ip等,只會使用宿主機上的ip和端口,也就是說當你在Docker裏面使用網絡的時候,跟在主機上使用是同樣的
  • None :第三種就是沒有網絡,這種狀況下,Docker將不會跟外界的任何東西進行通信

      (2)端口映射:在使用Bridge模式的時候,就涉及到如何讓容器中的端口能夠在主機上訪問到(由於它有獨立的namespace),這個時候就須要用到端口映射技術。Docker能夠指定,你想把容器內的某一個端口和容器所在主機上的端口作一個映射,當你訪問主機的端口時,其實就是訪問容器裏的一個端口。

     

      咱們將Nginx容器的端口和主機的端口作一個端口映射,這樣訪問主機的指定端口時就能夠訪問Nginx容器中的指定端口了:

      (1)使用docker run -d -p 8080:80 hub.c.163.com/library/nginx命令

C:\WINDOWS\system32>docker run -d -p 8080:80 hub.c.163.com/library/nginx
b3d5a8b4472b0e072abdc496c2a0748a5a341a3c260ba932dcc40a0216aea7f1

C:\WINDOWS\system32>docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                  NAMES
b3d5a8b4472b        hub.c.163.com/library/nginx   "nginx -g 'daemon ..."   8 seconds ago       Up 7 seconds        0.0.0.0:8080->80/tcp   practical_torvalds

      咱們上面能夠看到咱們將本機的8080端口映射到了Nginx容器中的80端口,而且成功啓動,咱們在瀏覽器訪問本機的8080端口,看是否能夠訪問到Nginx容器的80端口(當看到下圖是,代表成功的訪問到了Nginx的歡迎頁):

     

      (2)使用docker run -d -P hub.c.163.com/library/nginx命令,表示主機的全部端口能夠和容器作端口映射,而且會隨機分配一個端口32768映射到80端口,咱們再次使用瀏覽器訪問本機8080端口已經沒法打開了,此次須要訪問分配的隨機端口32768進行訪問!

C:\WINDOWS\system32>docker run -d -P hub.c.163.com/library/nginx
8e539fc8a0cd3a357bc466e7cbdfb7386430ce53aa008338a2c5f21f790c014c

C:\WINDOWS\system32>docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                   NAMES
8e539fc8a0cd        hub.c.163.com/library/nginx   "nginx -g 'daemon ..."   8 seconds ago       Up 8 seconds        0.0.0.0:32768->80/tcp   frosty_darwin

 

本文爲原創文章,若是對你有一點點的幫助,別忘了點贊哦!比心!如需轉載,請註明出處,謝謝!

相關文章
相關標籤/搜索