Docker

docker簡介:

物理機(平常使用的電腦)是一棟樓,虛擬機(vmware)就是一個套間,docker是套間里面的隔斷。

?

一臺虛擬機在物理機里體現為一個進程,docker對于虛擬機來說也是一個進程,進程和進程是沒有聯系的,即每個docker容器都是獨立的,互不影響。

虛擬機和docker的區別

虛擬機起到隔離運行環境的作用,占用的資源較大

docker起到隔離應用程序的作用,占用的資源較小

docker里面運行的是鏡像(自帶操作系統),也就是說實際應用中需要用到多臺電腦的時候,可以使用docker來代替多臺電腦,從而在一臺電腦中運行多個程序或虛擬機。

docker的版本:

  • docker-ce 社區版(一些程序員在維護,免費的)
    • stable版
      • 穩定版,一個季度更新一次
    • edge版
      • 非穩定版,一個月更新一次
  • docker-ee 企業版(收費的)

docker組成

示意圖
1555225471244.png

客戶端:就是一個終端,由很多指令組成,類似于xshell5來操作linux,xshell5就是一個linux的終端(客戶端)

服務器:docker服務器是一個守護進程,沒有操作終端,主要是管理docker容器和docker鏡像。所謂守護進程,就是不能喝用戶進行交互(輸入和輸出),在后臺周期性的執行某些操作,類似于apache服務器,不能用戶進行交互,在后臺默默的輔助解析PHP代碼。

docker容器:通過docker操作命令可以啟動磁盤上的鏡像啟動,啟動之后就是docker容器,容器中運行的是一個操作系統。即,運行操作系統的媒介或容器。

docker鏡像:所謂鏡像就是一些系統磁盤文件,如vmware.vm等文件。用戶可以自己制作也可以在官網下載。nginx鏡像,意思是有一個操作系統,里面安裝了nginx;redis鏡像,意思是有一個操作系統,里面安裝了redis;ubuntu鏡像,意思是純凈的ubuntu操作系統。

鏡像倉庫:docker hub 是官方提供的鏡像倉庫。

docker的安裝和卸載

安裝命令:

# 1.更新軟件列表
sudo apt-get update #不會更新軟件,是更新本地系統中自帶的軟件列表,可以讓下載的時候下載到最新的軟件版本
# 2.安裝一些小工具
sudo apt-get install apt-transport-https ca-certificates curl software-properties-commonlrzsz -y # 為后面的安裝座準備,-y的意思是碰到提示輸入yes或no的時候默認選擇yes
# 3.下載阿里云的公鑰,通過管道將秘鑰添加到本地受信任的數據庫(trusted)中
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/gpg | sudo apt-key add - # curl是一個下載工具
# 4.添加阿里云的docke軟件包到apt倉庫
sudo add-apt-respository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -ce) stable"
# 5.將阿里云的軟件源升級到最新版本
sudo apt-get update 
# 6.安裝docker
sudo apt-get install docker docker-ce -y
# 7.測試docker
docker version 

docker加速器設置:

目的:

? docker安裝成功以后,啟動docker需要鏡像,鏡像需要從官方下載,配置加速器九尾了提高下載鏡像的速度

# 1.訪問https://dashboard.daocloud.io網站,登錄進去,點擊右上角的“小火箭”圖標,復制“配置docker加速器”中的linux命令,在中斷中執行該命令即可,不同的用戶登錄會有不同的網址,但是都可以用
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io 
# 這個命令會在/etc/docker目錄下生成daemon.json文件,寫入執行成功的提示命令{"registy-mirrors":["http://f1361db2.m.daocloud.io"]}
# 2.重啟docker服務
sudo systemctl restart docker

docker的權限問題:

當安裝好docker執行docker version命令,效果如下:

Client:
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.6
 Git commit:        6247962
 Built:             Sun Feb 10 04:13:47 2019
 OS/Arch:           linux/amd64
 Experimental:      false
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/version: dial unix /var/run/docker.sock: connect: permission denied

最后的提示是說權限不夠,解決方案:

# 方案1:每次執行命令使用sudo
sudo docker version
# 方案2:將當前用戶添加到docker組中,設置一次就好了(但重啟電腦還不行)
    # 使用命令:sudo gpasswd -a 當前用戶 組名
sudo gpasswd -a itcast docker
    # 這個時候如果還不行的話,再進行組的切換(因為當前用戶默認不在docker組,所以現在執行命令雖然也是當前用戶,但不屬于docker組的操作,所以要進行組的切換),使用命令:newgrp - 組名
newgrp - docker # 如果下次重啟,還沒權限的話,只需要切換組即可
# 方案3:修改docker文件的權限。文件:/ver/run/docker.sock
sudo chmod 666 docker.sock # 這個命令只需要設置一次即可

docker服務器操作相關指令:

# 重啟命令
sudo systemctl restart docker
# 啟動命令
sudo systemctl start docker
# 關閉命令
sudo systemctl stop docker
# 查看狀態
sudo systemctl status docker

卸載命令:

# 1.卸載軟件
sudo apt-get purge docker-ce #刪除對應的信息文件+應用程序,如刪除人和人的信息,包括姓名,衣服,身份證
# 或者
sudo apt-get remove docker-ce # 只刪除應用程序,但是信息還在
# 2.刪除兩個目錄,一個是身份認證目錄 /etc/docker,另一個是存儲鏡像的目錄 /var/lib/docker
sudo rm /etc/docker /var/lib/docker

docker鏡像管理

查看docker中的所有指令:

docker --help

鏡像的搜索:

操作鏡像需要知道這個鏡像是否存在,也就是需要搜索一下

注意:搜索范圍是在docker hub,也就是官方的倉庫中搜索

# 使用命令:docker search 鏡像名   例:
docker search ubuntu

會搜索很多結果出來,其中有些是官方的,有些是自己制作好上傳的,具體結果字段如下:

NAME:鏡像的名稱
DESCRIPTION:鏡像的描述
STARS:鏡像的下載量
OFFICIAL:是否為官方出品的鏡像
AUTOMATED:會不會啟動一些腳本之類的程序

鏡像的下載:

# 下載指令:docker pull 鏡像名       例:
docker pull ubuntu

下載成功后,會存儲到本地的鏡像倉庫,對應一個本地目錄:/var/lib/docker,這個目錄需要root用戶才能進去查看,可以使用命令切換到root用戶su - root,使用這個命令切換的root用戶,連環境變量也切換到了root用戶,如果不加-那代表雖然用戶切換到了root,但使用環境變量還是普通用戶的

該目錄中有很多文件夾,下載好的鏡像不是一個文件,而是由很多小文件組成的,所以是找不到單獨的某個鏡像文件的,所以在后期需要刪除這個鏡像的話,就將這個目錄刪掉就好了。

鏡像的查看:

# 查看所有的鏡像
docker images
# 或
docker image ls

# 查看某一個鏡像
docker image ls 鏡像名
# 或
docker images 鏡像名

查看的結果中包含很多字段,如下:

REPOSITORY:鏡像名稱
TAG:鏡像的版本(latest代表最新版本)
IMAGE ID:鏡像id(類似于身份證,是唯一的)
CREATED:創建時間
SIZe:鏡像的大小

通常在描述一個鏡像的時候,描述方式如下:

語法:
    鏡像名:tag    
例:
    nginx:latest
# 如果tag的值為latest,那么latest可以省略不寫,例: nginx == nginx:latest

給docker起別名:

語法:
    docker tag 鏡像名:tag 別名:tag的別名
例:
    docker tag ubuntu:latest uuuu:v1.0
# 這里的別名和tag的別名都可以自定義

當再次查看的時候,會發現列表中多了一個鏡像,這個鏡像是多出來的一個名字不是復制了一個新的鏡像。

刪除鏡像:

語法:
    docker rmi 鏡像id/鏡像名
# 如果鏡像有別名,就不能用鏡像id進行刪除,因為鏡像id不是唯一的,只能使用鏡像名來刪除,且tag不是latest的話,也必須加上tag,而且刪除的只是一個名字,鏡像還在的,只是廢棄了一個名字,如果用鏡像名刪除不了的話,可以在后面加一個參數  -f   表示強制刪除

鏡像的導入導出

由于鏡像在使用過程中難免會發生誤刪的情況,所以鏡像需要備份。目的是鏡像文件的備份和分發(備份以后傳送給別人進行導入使用)。

導出的本質就是將本地倉庫中的鏡像備份到本地磁盤中。導入的本質就是將本地磁盤中保存的鏡像放到本地倉庫中。

導出:

導出命令:
    docker save -o 目標路徑(帶名字) 要導出的鏡像名帶tag
或
    docker save --output 目標路徑(帶名字) 要導出的鏡像名帶tag
例:
    docker save -o /home/itcast/docker-test/ubuntu.img uuuu:v1.0
或
    docker save --output /home/itcast/docker-test/ubuntu.img uuuu:v1.0
# 這時候在目標文件夾中就能看到導出的文件了(文件名是自定義的),這個單獨的文件就是整個鏡像文件

導入:

導入命令:
    docker load -i 鏡像文件路徑
或
    docker load --input 鏡像文件路徑
# 如果這個鏡像本身就存在的話,該命令不會進行任何操作
還有另外一種命令:
    docker load < 鏡像文件路徑

查看鏡像的歷史記錄

命令:
    docker history 鏡像名:tag
# 查看的是鏡像制作過程中一些比較重要的步驟

查看鏡像的詳細信息

命令:
    docker inspect 鏡像名/鏡像id
# 查看的是鏡像的屬性信息(id,大小,名稱等),結果以json格式輸出

這個命令還可以查看網絡等信息,參考地址:https://yq.aliyun.com/articles/230067

鏡像管理總結:

示意圖
1555249738442.png

docker容器管理

容器是基于鏡像的,鏡像(鏡像可看做可執行程序)啟動之后,就變成了容器。鏡像啟動之前只占用磁盤空間,當鏡像啟動之后會占用內存、CPU等資源。

每個容器啟動之后,都是一個進程。

查看容器

命令:
    docker ps
# 因為容器啟動后是進程,所以查看容器和查看進程的指令類似。
命令后面的參數:
    docker ps -a/--all # 顯示所有的容器,默認只顯示running狀態的
    docker ps -q/--quiet # 直線容器的id

查看結果會有很多字段,如下:

CONTAINER ID:容器啟動之后的id,是唯一的
IMAGE:當前容器是基于哪個鏡像啟動的
COMMAND:容器啟動之后,默認執行了什么命令
CREATED:容器的創建時間
STATUS:容器當前的狀態
    created:容器被創建,但是不能使用的狀態
    running:運行的狀態
    pause:暫停的狀態
    exited:容器終止運行,但是容器還在的狀態
PORTS:映射的端口,主機和容器直接的端口映射
NAMES:容器啟動之后的名字,如果沒有指定,會隨機生成一個,這個不能重復(是唯一的)

創建容器:

命令:
    docker create -it [--rm] --name 容器名 鏡像名:tag commad(執行的命令)
# 其中-i參數,也可以是--interactive,表示給容器關聯標準輸入,-t參數,也可以是--tty,表示給容器綁定終端,這個位置還可以有-a/--attach list參數,表示給容器關聯標準輸入輸出或錯誤,--rm參數表示容器終止運行的時候自動刪除這個容器,--name參數表示手動指定容器的名字(不指定容器名會自動生成一個),command可以不寫,如果必須的寫的話,就寫bash,所謂bash,就是一個shell命令解析器,沒有實際意義
例:
    docker create -it --name myubuntu --rm uuuu:v1.0 bash

啟動已創建好的容器:

命令:
    docker start -ia 容器名/容器id
例:
    docker start -ia myubuntu

這時候,操作的用戶會發生改變,因為啟動容器加了參數后,會進入到容器內部,而容器就是一個微型操作系統,這時候輸入exit可以退出容器

啟動容器可以不加參數,就不會進入到容器內部,容器正在運行的狀態會顯示up狀態

容器創建并啟動:

命令:
    docker run -aitd --name 容器名 鏡像名:tag command
# 參數意義和用法與docker create一樣,多的-d/--detach參數意思是以守護進程的形式運行(在后臺運行),并在啟動成功以后打印一個容器的id,加了-d參數后不會進入到容器內部了
例:
    docker run -itd --name newubun uuuu:v1.0 bash

這時候查看容器的話,可以看到這個容器已經創建好并在運行了,狀態是up(正在運行)

暫停容器:

命令:
    docker pause 容器名/容器id
例:
    docker pause newubun

再次查看容器的時候,在正在運行的容器狀態up后面會有一個(Paused),表示這個容器暫停運行了,這個命令可以同時操作多個容器,多個容器名之間使用空格隔開

恢復容器:

命令:
    docker unpause 容器名/容器id
例:
    docker unpause newubun

容器重啟:

命令:
    docker restart -t 容器名/容器id
# -t,--time int:延時時間,默認是10s
例:
    docker restart -t 5 newubun # 表示容器在5秒鐘之后重啟

關閉和終止容器:

關閉容器和終止容器都沒有刪除容器,只是讓容器從up狀態到了exited狀態,關閉容器有延時,終止容器沒有延時

關閉命令:
    docker stop [-t] 容器名/容器id
# -t,--time int:延時時間,默認為10s
終止命令:
    docker kill [-s] 容器名/容器id
# -s.--signal string:指定發出的信號,默認為kill(linux默認有64個信號,實際有62個,sigkill為9號信號(使用kill -l命令可以進行查看所有信號),不能被攔截,只會有一個結果,就是kill),一般不用
例:
    docker stop -t 5 newubun # 表示容器在5s之后關閉,容器從up狀態變成了exited狀態
    docker kill newubun # 結果同樣是容器關閉

容器的刪除:

? 刪除未運行的容器:

命令:
    docker rm 容器名/容器id

? 刪除運行的容器:

命令:
    docker rm -f 容器名/容器id
# -f參數表示強制刪除,也可以加在命令的最末尾

? 批量刪除容器:

命令:
    docker rm `docker ps -aq` -f
或
    docker rm $(docker ps -aq) -f

進入容器中:

創建并啟動并進入容器

命令:
    docker run -it [--name 容器名] 鏡像名:tag [command] 

進入已創建但未啟動的容器:

命令:
    docker start -ia 容器名/容器id

進入已啟動的容器:

命令:
    docker exec -it 容器名/容器id command
# -i,--interactive:表示給容器關聯標準輸入
# -t,--tty:表示給容器綁定終端
# 命令的最后面的command是不能被省略的
# command:shell指令,一般就是用bash
例:
    docker exec -it 456b55bb7850 bash # 進入到容器內部,-it兩個參數必不可少,且command必須是bash

退出容器:

退出容器,不會影響容器的運行

# 方式1:
    exit
# 方式2:
    ctrl+D

容器的其他命令:

? 小知識:我們平常看到的子網掩碼為:255.255.255.0,這個代表24位,因為ip地址是32的,四個整數,每個代表8位,其中3個有值,那就24位,如果說子網掩碼為16位,那這個子網掩碼就是255.255.0.0

? 查看容器日志:

命令:
    docker logs 容器名/容器id

? 查看容器的詳細信息(屬性):

命令:
    docker inspect 容器名/容器id
# 參考網址: https://yq.aliyun.com/articles/230067

? 查看容器的端口信息:

命令:
    docker port 容器名/容器id
# 查看的是主機和容器的端口映射

容器重命名:

命令:
    docker rename 容器名/容器id 新的容器名
例:
    docker rename newubun myu

基于容器的進行導出:

命令:
    # 方式1
    docker export -o 鏡像文件名 容器名/容器id
    # 方式2
    docker export 容器名/容器id > 鏡像文件名
例:
    docker export -o ~/docker-test/myub.img myu # 將容器中的鏡像導入到了本地文件

鏡像的導入:

鏡像的導入本質是將本地的鏡像文件導入到本地的鏡像倉庫

命令:
    cat 鏡像文件 | docker import - 新的鏡像名:tag
例:
    cat myub.img | docker import - ub:1

導入使用的docker import命令,但是在使用的時候,docker import 需要接收數據(數據來源于文件或者url),所以需要使用cat配合管道使用

鏡像導出的對比:

save export
導出方式 通過鏡像導出 通過容器導出
是否可以修改 不能對鏡像進行修改 原始鏡像可以通過啟動的容器進行修改
是否丟失數據 不會丟失 若沒有通過容器對進行修改直接導出,會丟失鏡像的歷史記錄
大小 和原始鏡像一樣 會比原始鏡像小(丟失了歷史記錄)

鏡像導入的對比:

load import
是否可以修改鏡像名 無法修改 可以修改

docker命令總結:

示意圖
1555477156230.png

數據卷

容器和宿主機之間的數據拷貝:

宿主機拷貝到容器:
    docker cp 宿主機的文件路徑 容器名:容器中的文件路徑
例:
    docker cp ./a.txt myu:/b.txt 
    # 將當前目錄下的a.txt文件拷貝到容器中的根目錄下,并改名為b.txt,也可以不改名,即目標之路經中不寫文件名
容器拷貝到宿主機:
    docker cp 容器:容器中的文件路徑 宿主機的文件路徑
例:
    docker cp myu:/b.txt ./c.html 
    # 將容器中的根目錄下的b.txt拷貝到當前目錄下,并改名為c.html,也可以不改名,即目標之路經中不寫文件名

數據卷和使用:

所謂數據卷,就是在創建或啟動容器的時候,讓容器中的某個目錄或文件掛載到宿主機上的某個目錄或文件,讓宿主機和容器之間形成一種數據的映射關系,從而達到宿主機和容器之間數據共享的目的。

掛載命令:
    # 創建并啟動容器的時候進行掛載
    docker run -itd --name 容器名 -v 宿主機路徑:容器路徑:ro 鏡像名:tag command
    # 創建容器的時候掛載
    docker create -it --name 容器名 -v 宿主機路徑:容器路徑:ro 鏡像名:tag command
# -v,--volume list:list就是路徑的意思;ro是容器對于掛載目錄是只讀的權限,可以不寫,默認為讀寫權限;宿主機路徑必須是絕對路徑,否則會映射失敗,但不會報錯;容器路徑可以隨便定義,不存在會創建
例:
    docker run -itd --name myub -v /home/itcast/docker-test/ub:/d-test uuuu:v1.0 bash
    # 宿主機/home/itcast/docker-test/ub文件夾和容器/d-test文件夾中的數據可以共享了

? 文件的掛載和目錄的掛載命令一樣,同樣可以讓宿主機和容器共享一個文件,文件名可以重命名,也可以不重命名(不重命名就不寫文件名即可)

數據卷容器和宿主機共享目錄的示意圖
1555492695097.png

數據卷容器和使用:

所謂數據卷容器,本質上是一個容器,只不過這個容器只做一件事情,就是只提供共享目錄,只為了共享數據而存在,不做其他任何事情。

如果創建了數據卷和宿主機進行了映射,而且容器什么也不做,也可以叫做數據卷容器。數據卷容器可以不和宿主機進行映射,而只為了和其他容器進行數據共享,創建命令如下:

創建[并啟動]數據卷容器:
    docker run -itd --name 容器名 -v 數據卷容器的目錄 鏡像名:tag command
    # 除了可以創建并啟動,也可以光創建不啟動
    docker create -it --name 容器名 -v 數據卷容器的目錄 鏡像名:tag command
    # 這個容器可以不啟動,目錄存在就好
例:
    docker create -it --name u1 -v /backup ub:1 bash

創建好以后,關鍵是和其他容器共享這個目錄,其他容器要啟動才能用,命令如下:

創建掛載數據卷容器的容器命令:
    docker run -itd --name 容器名 --volumes-from 數據卷容器名 鏡像名:tag command
例:
    docker run -itd --name u2 --volumes-from u1 uuuu:v1.0 bash
    # 會在容器內自動生成backup目錄,并與數據卷容器共享這個目錄

數據卷容器和容器以及宿主機之間的關系有兩種,一種是沒有宿主機參與,一種是有宿主機參與

有宿主機參與的:

示意圖1
1555493020066.png

沒有宿主機參與的:

示意圖2
1555493125532.png

數據卷容器的數據備份與還原:

  • 備份分兩種情況:

    1. 數據卷容器在創建或啟動時已經掛載到宿主機上

      ? 這種情況基本不用進行任何操作,因為數據卷容器中的數據和宿主機中的數據是共享的,要丟一起丟,要有一起有。如果非要備份的話,就是將宿主機中的數據進行備份到另一個地方即可,或者給宿主機中的共享文件夾創建硬鏈接。

    2. 數據卷容器創建并啟動時并未掛載到宿主機上

      ? 創建或啟動時沒有掛載宿主機上,到運行一段時間之后再來備份已經來不及了,所以需要另外一個“備份容器”作為宿主機和數據卷容器的媒介來連接宿主機和數據卷容器,以便達到數據卷容器中的數據備份到宿主機的目的。

      示意圖
      1555496756594.png

|

 例:

 ```shell
 # 1.創建數據卷容器
 docker create -it --name container -v /backup ub:1 bash
 # 2.創建兩個容器共享數據卷容器的數據
 docker run -itd --name ub1 --volumes-from container ub:1 bash
 docker run -itd --name ub2 --volumes-from container ub:1 bash
 # 3.進入容器ub1的共享目錄中寫入文件數據
 docker exec -it ub1 bash
 echo aaaaaaaaaaaaaaaaa > /backup/a.txt
 # 4.進入容器ub2的共享目錄中查看數據
 docker exec -it ub2 bash
 cat /backup/a.txt # 可以看到數據和前面寫進去的一致
 # 5.在宿主機上創建本地備份目錄
 mkdir /home/itcast/docker-test/temp
 # 6.創建備份容器,映射到宿主機的備份目錄,并共享數據卷容器的數據(注意:這兩個目錄不要做成一個,否則會有意想不到的錯誤)
 docker run -itd --name tmp -v /home/itcast/docker-test/temp:/test1 --volumes-from container ub:1 bash
 # 7.進入備份容器將數據卷容器的數據(/backup文件夾)打包拷貝到和宿主機共享的目錄中(/test1)
 tar zcvf /test1/backup.tar.gz /backup 
 # 8.然后可以在宿主機上的temp目錄中查看到備份好的數據文件
 ls /home/itcast/docker-test/temp
 ```

 命令優化(合并第6~第7):

 ```shell
 docker run -itd --rm --name tmp -v /home/itcast/docker-test/temp:/test1 --volumes-from container ub:1 tar zcvf /test1/backup.tar.gz /backup
 # 這個容器創建出來就是為了備份文件,備份以后這個容器就沒用了,所以直接加--rm參數;最后的command反正也是shell命令,打包也是shell命令,直接進行替換
 ```
  • 還原

    還原的過程其實就是將備份的過程反過來。

    第1第5一樣,第6第7將壓縮換成解壓即可

    # 1.創建數據卷容器
    docker create -it --name container -v /backup ub:1 bash
    # 2.創建兩個容器共享數據卷容器的數據
    docker run -itd --name ub1 --volumes-from container ub:1 bash
    docker run -itd --name ub2 --volumes-from container ub:1 bash
    # 3.進入容器ub1的共享目錄中寫入文件數據
    docker exec -it ub1 bash
    echo aaaaaaaaaaaaaaaaa > /backup/a.txt
    # 4.進入容器ub2的共享目錄中查看數據
    docker exec -it ub2 bash
    cat /backup/a.txt # 可以看到數據和前面寫進去的一致
    # 5.在宿主機上創建本地備份目錄
    mkdir /home/itcast/docker-test/temp
    # 創建恢復容器,并將數據放入和數據卷容器共享的文件夾中
    docker run -itd --rm --name tmp -v /home/itcast/docker-test/temp:/test1 --volumes-from container ub:1 tar zxvf /test1/backup.tar.gz -C /
    

端口映射:

示意圖
1555513504076.png

命令:

都是創建并啟動容器的時候設置

隨機端口映射(不推薦):
    docker run -itd --name 容器名 -P 鏡像名:tag
指定端口映射(推薦):
    docker run -itd --name 容器名 -p [宿主機ip:]宿主機端口:容器端口 鏡像名:tag
    # 指定一個宿主機的空閑端口,容器端口指定一個協議端口,例:http為80,https為443
# 在啟動系統自帶的容器的時候,在最后面不要加command了,因為涉及到服務的啟動,指定command后,服務不能啟動
例:
    docker run -itd --name myweb -p 8088:80 nginx

容器的網絡管理

docker network --help
    docker network command
    commands:
        connect     連接容器到指定的網絡中
        create      創建一個網絡
        disconnect  將容器從網絡中刪除
        inspect     查看網絡相關的信息
        ls          查看現有的所有網絡
        prune       刪除所有的未使用的網絡
        rm          刪除一個或多個指定的網絡

docker中的網絡

查看所有網絡列表:
NETWORK ID          NAME                DRIVER              SCOPE # 頭
64d83b763e85        bridge              bridge              local # 橋接網絡,單獨生成網卡
89d9ce6dd16d        host                host                local # 主機網絡,和宿主機共用網卡
b53a004ffcb7        none                null                local # 網絡一切都需要手動設置

# 查看bridge網絡
docker network inspect bridge
    # "IPv4Address": "172.17.0.3/16", 表示ip地址和子網掩碼,子網掩碼是255.255.0.0
    "Containers": {
            "16a17991c9d7034eba09fdc9a5c90d3121b5607f062002d6e01b7375bd2803b9": {
                "Name": "ub2",
                "EndpointID": "89b4d01ab4b2be864a4e56fc115b1c6ce8880fdb4842c8c1c4981e4114e79ea8",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16", # 每個容器都由對應的ip地址和子網掩碼
                "IPv6Address": ""
            },
            "250c697739db1a291e17a24efccbf88a64de4c600d24e839f14740c22b724c0e": {
                "Name": "myweb",
                "EndpointID": "52ccff4ef2237641fdbb39557f2a15fc62d1226d510dbf1a49dce654b94114b5",
                "MacAddress": "02:42:ac:11:00:05",
                "IPv4Address": "172.17.0.5/16",
                "IPv6Address": ""
            },
 # container項,表示在網絡中包含了的容器

docker容器默認都在bridge網絡中

bridge網絡模式

創建網絡

docker network create [OPTIONS] NETWORK
Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by
                             Network driver (default map[])
      --config-from string   The network from which copying the configuration
      --config-only          Create a configuration only network
  -d, --driver string        # 指定網絡的驅動,默認是橋接模式
      --gateway strings      # 指定網關(一般就是192.168.0.1)
      --ingress              Create swarm routing-mesh network
      --internal             Restrict external access to the network
      --ip-range strings     Allocate container ip from a sub-range
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 Enable IPv6 networking
      --label list           Set metadata on a network
  -o, --opt map              Set driver specific options (default map[])
      --scope string         Control the network's scope
      --subnet strings       # 指定網段(一般是192.168.0.255)
例:
   docker network create mynetwork # 再次查看網絡列表的時候,可以看見網絡列表中多了一個自己創建的mynetwork網絡
   # 查看mynetwork屬性信息的時候,可以看到默認的驅動、網關、網段等信息,并且在新創建的這個網絡沒有容器

創建自定義網段和網關的網絡:
    docker network create --subnet IP地址/子網掩碼 --gateway 自定義網關 網絡名
例:
    docker network create --subnet 180.17.0.0/16 --gateway 180.17.0.1 mynetwork1
    # ip地址自定義,子網掩碼參考bridge網絡,網關是1

查看容器的屬性信息可以看出這個容器處在哪個網絡中

docker inspect myweb
    "Networks": {
        "bridge": { # 網絡名稱
            "IPAMConfig": null,
            "Links": null,
            "Aliases": null,
            "NetworkID": "64d83b763e85d40d83381787cc621ace063233e594ab32f95f5b911b331d2d7a",
            "EndpointID": "52ccff4ef2237641fdbb39557f2a15fc62d1226d510dbf1a49dce654b94114b5",
            "Gateway": "172.17.0.1",
            "IPAddress": "172.17.0.5", 
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "MacAddress": "02:42:ac:11:00:05",
            "DriverOpts": null
        }
    }

啟動并創建容器的時候將容器加入到網絡中

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Options:
      --network string                 # 將一個容器添加到網絡中  
例:
    docker run -itd --name nginxnetwork --network mynetwork ub:1 bash
    # 查看容器詳細信息的時候,可以看到容器的網絡是mynetwork,或者查看mynetwork網絡的詳細信息的時候可以看到container項中會有nginxnetwork容器

從網絡中刪除容器

命令:
    docker network disconnect [OPTIONS] NETWORK CONTAINER
例:
    docker network disconnect mynetwork nginxnetwork # 再次查看網絡或者容器的詳細信息會發現容器已經不在這個網絡中

將容器添加到指定網絡中

命令:
    docker network connect [OPTIONS] NETWORK CONTAINER
例:
    docker network connect mynetwork nginxnetwork   

刪除網絡:

命令:
    docker network rm NETWORK [NETWORK...] # 可以同時刪除多個網絡
例:
    docker network rm mynetwork1
#刪除網絡的時候,要確保網絡中沒有包含容器

容器在啟動的時候會加入到默認的網絡中;一個容器可以同時加入到多個網絡中;容器和容器之間要進行通信的前提是這些容器必須處于同一個網絡中;

host網絡模式

host網絡是和宿主機共享同一個網卡,所以不能重建,也就是說host網絡只有一個。操作host網絡只能是在容器創建啟動或者后期將容器添加到這個網絡中。

docker run -itd --network host --name nyweb2 nginx bash # 創建啟動容器nyweb2并加入到host網絡
docker inspect nyweb2 # 查看nyweb2容器的詳細信息
    "Networks": {
        "host": { # 這個容器已經加入到host網絡中了
            "IPAMConfig": null,
            "Links": null,
            "Aliases": null,
            "NetworkID": "89d9ce6dd16d7808daa82fdada549392e02ba7e0cea496bed5e0ad9091471986",
            "EndpointID": "c6f601bb153671834675a5c8c44ca5ce918489ac99ea661075eb6a33c1dd64ed",
            "Gateway": "",
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "MacAddress": "",
            "DriverOpts": null
        }
    }

dockerfile

簡介:

shell命令就是linux命令,shell腳本是一個可執行的文件,這個文件寫了很多的shell命令以及一些簡單的邏輯(判斷和循環)。dockerfile也是一個文件,這個文件中寫了很多的docker命令,一般情況,里面寫的是制作鏡像的步驟,以便重復使用和快速制作鏡像。

即:一般情況,手動下載鏡像,創建容器,在容器中搭建環境或者安裝軟件 ------>使用dockerfile文件執行即可。也就是將手動操作的步驟,同過dockerfile的規則和命令書寫到dockerfile文件中,執行這個文件得到容器并將這個鏡像導出。

規則:

  1. dockerfile文件名首字母大寫(例:Dockerfile)
  2. 盡量將dockerfile放到空目錄中
  3. 每個容器盡量只有一個功能
  4. dockerfile中要執行的命令越少越好

dockerfile基礎指令

dockerfile里面的注釋是#

FROM

指定原始鏡像,最后制作出來的鏡像是從容器中導出的,制作容器是需要原始鏡像的

命令:
    FROM 鏡像名:tag # 這里的鏡像名指的是原始鏡像   
例:
    FROM ubuntu

FROM必須寫在Dockerfile的第一行(除注釋),可以連續寫多個FROM原始鏡像,如果指定的鏡像名在本地鏡像倉庫中不存在,會自動從遠程倉庫下載到本地倉庫,如果遠程倉庫中也沒指定的鏡像,就報錯終止執行了

MAINTAINER

維護者信息

命令:
    MAINTAINER 維護人員信息
例:
    MAINTAINER zhangsan zhangsan@163.com

RUN

構建鏡像要執行的shell命令,如果命令中有需要確認的操作,在后面必須有-y;命令太長需要換行,行尾要加\

命令: 
    RUN shell命令
例:
    RUN mkdir /home/itcast/go -p
或:
    RUN ["mkdir","/home/itcast/go","-p"]

EXPOSE

設置docker容器對外開放的端口。容器和外部環境是隔離的,要從外部訪問到容器內部,需要容器開放端口

命令:
    EXPOSE 端口號
例:
    EXPOSE 80
    # 還可以使用docker命令進行:docker run -itd -p 8888:80

執行dockerfile文件的命令:

docker build [OPTIONS] dockerfile的文件路徑或者網上能訪問到dockerfile的url
# 后面的路徑必須是一個目錄,而不能是具體文件
Options:
      -t, --tag list                指定最后制作出來的鏡像(執行到最后從容器中導出的鏡像)的名字
# 最后制作好的鏡像在本地鏡像倉庫中

例:

先創建一個空目錄,然后在目錄中新建文件名為Dockerfile,寫入如下內容

# 構建一個基于ubuntu的docker訂制鏡像
# 基礎鏡像
FROM ubuntu
# 鏡像作者
MAINTAINER wangjie wangjie.912@163.com
# 執行命令
RUN mkdir hello
RUN mkdir world
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# sed的意思是替換下載庫地址,后面的/g代表整行替換
RUN apt-get update
RUN apt-get install nginx -y
# 對外開放端口
EXPOSE 80

運行這個文件:

# 運行docker文件
    docker build -t mytest:v1.0 . # 在當前文件夾可以使用一個點來表示路徑
# 查看制作好的鏡像
    docker images

運行最后結果:

示意圖
1555639757579.png

dockerfile的運行指令

CMD

這個指令是用來執行shell命令的,這個shell命令代表容器啟動后默認要執行的命令(CMD就是command的簡寫)。一個dockerfile只能有一個CMD,如果寫多個,以最后一個為準。在后期執行docker run的時候,這個指令會被覆蓋。

CMD shell命令
CMD ["shell命令","命令參數1","命令參數2"]

ENTRYPOINT

ENTRYPOINT的用法和意義跟CMD一樣,區別只在ENTRYPOINT默認不會被docker run覆蓋,若想覆蓋,需要在docker run后面加--entrypoint參數

CMD和ENTRYPOINT綜合使用:

# 要先寫ENTRYPOINT后寫CMD,CMD通常作為ENTRYPOINT的參數
ENTRYPOINT mkdir /home/itcast/go
CMD -p
# 意思為:mkdir /homt/itcast/go -p

dockerfile的文件編輯指令

ADD

這個指令是將宿主機的文件拷貝到容器中的。ADD指令在拷貝的同時,如果這個文件是壓縮文件,會將宿主機的壓縮文件拷貝到容器中進行解壓(前提是宿主機中的壓縮文件是可識別的壓縮包,例:.gz或.bz2)。

命令:
    ADD 宿主機文件 容器目錄/文件名
    ADD ["宿主機文件","容器目錄/文件名"]
    # 宿主機的文件一般放到和dockerfile所在的目錄中
例:
    # 文件
    ADD ["a.txt","/home/itcast/go/b.txt"] #容器中目錄不存在會自動創建;文件存在則覆蓋,不存在則拷貝
    # 目錄 a.tar.gz ---> mytest文件夾
    Add ["a.tar.gz","/home/itcast/go"] # 會在/home/itcast/go目錄下得到一個mytest錄

COPY

COPY的用法和意義跟ADD是一樣的,區別只在于COPY不會解壓。

VOLUME

這個指令是在鏡像中創建掛載點,這樣只要通過該鏡像創建的容器都由了掛載點(可以是在容器中創建數據卷,也可以把這個容器當做數據卷容器),通過VOLUME指定的掛載點目錄是自動生成的。

命令:
    VOLUME ["/data"]
例:
    VOLUME ["/data","/home/itcast/mytest"]

dockerfile的環境指令

ENV

這個指令是用來設置容器的環境變量的,一般寫在RUN指令之前。

命令:
    ENV <key> <value> # 設置一個
    ENV <key>=<value> <key>=<value> # 設置多個 
例:
    ENV name zhangsan
    ENV name=zhangsan age=12

WORKDIR

這個指令是用來切換工作目錄的,類似于shell命令的cd,主要是為后續的RUN、ENTRYPOINT、CMD等指令在指定的目錄中執行。可以進行多次切換。

命令:
    WORKDIR 目錄
例:
    WORKDIR /home/itcast/go
    RUN a.sh
    
    WORKDIR /home
    WORKDIR itcast # 代表相對路徑
    WORKDIR go
    RUM pwd # /home/itcast/go

USER

這個指令用來指定執行命令的用戶,默認是root

命令:
    USER 用戶名
例:
    USER root

ARG

這個指令是用來向dockerfile命令傳參的。如果在dockerfile中需要用到外部傳來的參數,在dockerfile中就用ARG來表示。

命令:
    ARG <name>[=value]
例:
    FROM ubuntu
    ARG myname
    ARG index
# 在執行dockerfile的時候
    docker build --build-arg myname=zhangsan index=1

dockerfile觸發器指令

ONBUILD

ONBUILD指令的意思示意圖
1555645862355.png

制作鏡像A的時候,設置輸出1,但是不會被輸出,當使用鏡像A作為原始鏡像制作鏡像B的時候才會輸出1。

命令:
    ONBUILD [command]
例:
    ONBUILD ["echo","1"]

dockerfile案例

用dockerfile來部署一個go的運行環境,并搭建beego框架至可以運行。

步驟:

  1. 手動搭建go運行環境并搭建beego框架

    #1、docker環境配置
    #1.1 獲取docker鏡像
    #獲取一個ubuntu的模板文件
    cat ubuntu-16.04-x86_64.tar.gz | docker import - ubuntu-nimi
    #1.2 啟動docker容器
    #啟動容器,容器名稱叫go-test
    docker run -itd --name go-test ubuntu-nimi
    #進入容器
    docker exec -it go-test /bin/bash
    #2、go環境部署
    #2.1 基礎環境配置
    #配置國內源
    vim /etc/apt/sources.list
    #文件內容如下
    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
    #如果由于網絡環境原因不能進行軟件源更新可以使用如下內容
    sudo sed -i 's/cn.archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list 
    
    #更新軟件源,安裝基本軟件
    apt-get update
    apt-get install gcc libc6-dev git vim lrzsz -y
    #2.2 go環境配置
    #安裝go語言軟件
    //apt-get install golang -y
    由于軟件源問題改使用新版本go
    將go1.10.linux-amd64.tar.gz拷貝到容器中進行解壓
    tar -C /usr/local  -zxf go1.10.linux-amd64.tar.gz
    
    #配置go基本環境變量
    export GOROOT=/usr/local/go                
    export PATH=$PATH:/usr/local/go/bin   
    export GOPATH=/root/go
    export PATH=$GOPATH/bin/:$PATH
    #3、go項目部署
    #3.1 獲取beego代碼
    #下載項目beego
    go get github.com/astaxie/beego
    #3.2 項目文件配置
    #創建項目目錄
    mkdir /root/go/src/myTest
    cd /root/go/src/myTest
    #編輯go項目測試文件test.go
    package main
    import (
    "github.com/astaxie/beego"
    )
    type MainController struct {
    beego.Controller
    }
    func (this *MainController) Get() {
    this.Ctx.WriteString("hello world\n")
    }
    func main() {
    beego.Router("/", &MainController{})
    beego.Run()
    }
    #3.3 項目啟動
    #運行該文件
    go run test.go
    #可以看到:
    #這個go項目運行起來后,開放的端口是8080
    #4、測試
    #4.1宿主機測試
    #查看容器的ip地址
    docker inspect go-test
    #瀏覽器查看效果:
    curl 172.17.0.2:8080
    
  1. 修改為dockerfile方案

    # 構建一個基于ubuntu 的docker 定制鏡像
    # 基礎鏡像
    FROM ubuntu
    
    # 鏡像作者
    MAINTAINER panda kstwoak47@163.com
    
    # 增加國內源
    #COPY sources.list /etc/apt/
    
    RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    
    # 執行命令
    
    RUN apt-get update
    RUN apt-get install gcc libc6-dev git lrzsz -y
    #將go復制解壓到容器中
    ADD go1.10.linux-amd64.tar.gz  /usr/local/
    
    # 定制環境變量
    
    ENV GOROOT=/usr/local/go                
    ENV PATH=$PATH:/usr/local/go/bin   
    ENV GOPATH=/root/go
    ENV PATH=$GOPATH/bin/:$PATH
    
    # 下載項目
    
    RUN go get github.com/astaxie/beego
    
    # 增加文件
    
    COPY test.go /root/go/src/myTest/
    
    # 定制工作目錄
    
    WORKDIR /root/go/src/myTest/
    
    # 對外端口
    
    EXPOSE 8080
    
    # 運行項目
    
    ENTRYPOINT ["go","run","test.go"]
    
    #把sources.list和test.go文件放到這個目錄中
    #構建鏡像
    docker build -t go-test:v0.1 .
    #運行鏡像
    docker run -p 8080:8080 -itd go-test:v0.1
    #訪問鏡像,查看效果
    

    注意順序:如果最后的端口開放和運行項目反了就啟動不了了;最后這個運行項目是bash命令,且不能夠被command覆蓋,所以只能使用ENTRYPOINT。

docker-compose

docker-compose是一款管理docker的工具,可以批量操作docker。這款工具是用python開發的。

docker-compose是docker容器進行編排的工具,定義和運行多容器的應用,可以一條命令啟動多個容器,使用Docker Compose不再需要使用shell腳本來啟動容器。

簡單來說,就是使用docker-compose自身的命令來批量操作容器。操作步驟:

  1. 安裝docker-compose工具
  2. 編寫docker-compose配置文件
  3. 使用命令啟動docker-compose

安裝

# 安裝依賴工具
sudo apt-get install python-pip -y
# 安裝編排工具
sudo pip install docker-compose
# 查看編排工具版本(可以用來檢測是否安裝好)
sudo docker-compose version
# 查看命令幫助
docker-compose --help

如下圖所示,則表示docker-compose工具安裝成功

示意圖
1555688569313.png

YAML文件格式

docker-compose的配置文件格式是yaml或者yml(后綴為yaml或者yml)。

YAM格式文件的基本規則:

  1. 大小寫敏感
  2. 使用縮進表示層級關系
  3. 進制使用tab縮進,只能使用空格表達縮進
  4. 縮進長度沒有限制,只要元素對齊就表示這些元素是同一層級
  5. 使用#注釋
  6. 字符串可以不適用引號標注,建議用雙引號標注字符串

YAM格式文件的3中數據類型:

  1. map-散列表

    # 使用冒號標注鍵值對,相同縮進的鍵值對屬于同一個map
    例:
     age:12
     name:zhangsan
     # age和name屬于同一個map
    
  1. list-數組

    # 使用連字符表示數組中的元素,相同縮進的元素屬于同一個數組
    例:
     - a
     - b
         - c
         - d
     # a和b屬于同一個數組,c和d屬于數組b
    
  1. scalar-純量

    # 字符串
     "hello"
     world
    # 布爾值
     true
     false
    # 整型
     12
    # 浮點型
     3.14
    # null
     在YML中使用~來表示空
    

數據類型示例:

# 例1
Websites:
    YAML:yaml.org
    Ruby:ruby-lang.org
    Python:python.org
    Perl:use.perl.org
# 使用json表示:整體上是一個map,這個map的結構如下:
# {"Website":{"YAML":yaml.org","Ruby":"ruby-lang.org","Python":"python.org","Perl":"use.perl.org"}}

# 例2
languages:
- Ruby
- Perl
- Python
- C
# 使用json表示,整體上是一個map,該map結構如下:
# {"languages":["Ruby","Perl","Python","C"]}

# 例3
-
  - Ruby
  - Perl
  - Python
-
  - C
  - C++
  - Java
# 使用json表示,整體上是由兩個元素組成的數組,這兩個元素也是數組,各有3個字符串元素,具體結構如下:
# [["Ruby","Perl","Python"],["C","C++","Java"]]

# 例4
- 
  id:1
  name:zhangsan
-
  id:2
  name:lisi
# 使用json表示,整體上是兩個map組成的數組,具體結構如下:
# [{"id":1,"name":"zhangsan"},{"id":2,"name":"lisi"}]

YML配置文件的關鍵字

在docker-compose的配置文件中,有三大部分(是不用縮進的):

  1. version

    表示docker-compose的版本,一般情況寫成固定的2就行,例:

    version: '2' # docker-compose的版本
    
  1. services

    表示每個docker啟動后的在linux中的服務,服務名自定義,每個服務名代表一個docker容器,例:

    # common.yaml
    version: '2' # docker-compose的版本
    services:    # 服務
     webapp  
            environment:     # 環境變量
                  RACK_ENV: development
                  SHOW: 'true'
                  SESSION_SECRET: docker-compose
    
# test.yaml
services:        # 服務
  web:           # 服務名, 自己起的, 每個服務器名對應一個啟動的容器
    image: nginx:latest  # 容器是基于那個鏡像啟動 的
    container_name: myweb # 容器名字
    extends: # 繼承自另一個服務
      file: common.yml
      service: webapp
    command: /urs/local/nginx -g daemon off # docker容器啟動之后, 執行的命令
    networks:    # 容器啟動之后所在的網絡
      - network1
    ports:       # 端口映射
      - "6789:8080"
      - 12:12  -> yaml解析的時候如果60以下, 解析會有問題
      # 6789: 宿主機端口, 8080: 容器端口
    extra_hosts:
      - "host1:162.242.195.82"
      - "host2:50.31.209.229"
      # host1: 主機名(域名)
      # 域名解析: 
         - 先查本地hosts文件
         - 本地的dns緩存
         - 通過dns服務器查詢
 
  sql:
    image: mysql
    volumes:
      - /home/test:/root/workdir 
    ports:
      - 9999:3306
    networks:
      - network1
      - network2
    depend_on:
      - web
      - redis
      
  redis:
    image: redis
    volumes:
      - /home/go/redis.conf:/redis/redis.conf
    ports:
      - 8989:6379
    networks:
      - network1

多學一招:設置臨時的環境變量就是直接是變量名=變量值,然后在該終端關閉之前都可以用$變量名來得到變量值。變量名習慣是大寫。

  1. networks

    聲名容器會用到的網絡,例:

    networks:
      network1:  # 網絡名
        driver: bridge # 網絡驅動, 可以省略
      network2   # 網絡名
        driver: bridge
    

sevices關鍵字中的具體描述:

  • image

    image 則是指定服務的鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。

  • command

    使用 command 可以覆蓋容器啟動后默認執行的命令。

  • container_name

    容器啟動之后的名字

  • depends_on

    一般項目容器啟動的順序是有要求的,如果直接從上到下啟動容器,必然會因為容器依賴問題而啟動失敗。例如在沒啟動數據庫容器的時候啟動了應用容器,這時候應用容器會因為找不到數據庫而退出,為了避免這種情況我們需要加入一個標簽,就是 depends_on,這個標簽解決了容器的依賴、啟動先后的問題。例:

    version: '2'
    services:
      web:
        image: ubuntu
        depends_on: # 表示在啟動web服務之前,先啟動db和redis服務
          - db
          - redis
      redis:
        image: redis
      db:
        image: mysql
    
  • evironment

    environment 和 Dockerfile 中的 ENV 指令一樣會把變量一直保存在鏡像、容器中。

  • ports

    映射端口的標簽。
    使用HOST:CONTAINER格式或者只是指定容器的端口,宿主機會隨機映射端口,例:

    # docker run -p 宿主機端口:容器端口
    ports:
     - "3000"  # 宿主機的端口是隨機分配的, 3000是容器開發的對外端口  // -P
     - "8000:8000"   -> 一般這樣寫就可以
     - "127.0.0.1:8001:8001"
    
  • volumes

    掛載一個目錄或者一個已存在的數據卷容器,可以直接使用 [HOST:CONTAINER] 這樣的格式,或者使用 [HOST:CONTAINER:ro] 這樣的格式,后者對于容器來說,數據卷是只讀的,這樣可以有效保護宿主機的文件系統。
    Compose的數據卷指定路徑可以是相對路徑,使用 . 或者 .. 來指定相對目錄。例:

    # docker run -v /home/go:/xxx
    # 宿主機或容器的映射路徑如果不存在, 會自動創建出來
    volumes:
      # 這是宿主機目錄, 容器的映射目錄會自動創建,但是不知道在容器中是哪個目錄
      - /var/lib/mysql -> 不推薦使用
      # 按照絕對路徑映射
      - /opt/data:/var/lib/mysql
      # 相對路徑的映射
      # ./ 目錄是docker-compose配置文件所在的目錄
      # 如果是相對路徑, ./是必須要寫的, ../
      - ./cache:/tmp/cache
      # 指定容器中對文件的操作權限, 默認rw
      - /home/go/configs:/etc/configs/:ro
      # 文件映射
      - ../temp/a.txt:/temp/b.sh
    
  • volumes_from

    從其它容器或者服務掛載數據卷,可選的參數是 :ro或者 :rw,前者表示容器只讀,后者表示容器對數據卷是可讀可寫的。默認情況下是可讀可寫的。例:

    # docker run --volumes_from 數據卷容器名
    volumes_from:
      - service_name  # 服務名
      - service_name:ro
      - container:container_name  # 掛載容器
      - container:container_name:rw   
    
  • extends

    這個標簽可以擴展另一個服務,擴展內容可以是來自在當前文件,也可以是來自其他文件,相同服務的情況下,后來者會有選擇地覆蓋原有配置。

  • networks

    加入指定網絡,格式如下:

    services:
      some-service:
        networks:
         - some-network
         - other-network
    

    關于這個標簽還有一個特別的子標簽aliases,這是一個用來設置服務別名的標簽,例如:

    services:
      some-service:
        networks:
          some-network:
            aliases:
             - alias1
          other-network:
            aliases:
             - alias2
    
  • extra_hosts

    添加主機映射, 最終被添加到hosts文件中 /etc/hosts,例:

    extra_hosts:
     - "somehost:162.242.195.82"
     - "otherhost:50.31.209.229"
    

docker-compose的命令

配置文件的命名自定義,但是推薦使用docker-compose.yaml或docker-compose.yml

服務

服務的啟動:

docker-compose -f 配置文件路徑 up [-d]
# -d參數表示以守護進程的方式運行

服務的關閉:

docker-compose -f 配置文件路徑 down

查看服務:

docker-compose -f 配置文件路徑 ps

如果配置文件的名字是docker-compose,那么在服務的所有命令都可以不加-f參數

容器

啟動某個容器:

docker-compose start 服務名

關閉某個容器:

docker-compose stop 服務名

刪除某個容器:

docker-compose rm 服務名
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯系作者。

推薦閱讀更多精彩內容

  • 《Docker從入門到實踐》閱讀筆記 原書地址: https://yeasy.gitbooks.io/docker...
    GuoYuebo閱讀 11,420評論 1 39
  • 一 、什么是 Docker Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國...
    Blazzer閱讀 3,171評論 0 13
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,805評論 1 21
  • 今天,是一年一度的母親節! 過節,成了身邊人重要的談資! 今天,是一帶一路高峰論壇第一天! 帶路藍,成了人們口中的...
    槑頭槑腦兒閱讀 402評論 5 10
  • 車在高速路上高速行使 我輕握方向盤 駕馭著車的方向 我可以掌控車的速度 卻無法控制思維的蔓延 車里的音樂觸動了我的...
    靜若青蓮閱讀 235評論 12 38