1. 程式人生 > >Docker基礎配置簡介

Docker基礎配置簡介

docker

隨著容器技術的發展,微服務架構被許多互聯網公司推崇。docker作為一種容器的交付方式,可以實現快速交付,應用隔離,保持環境一致性等多方面的優點。這裏對docker的操作做簡單的介紹。


安裝部署

docker的安裝和配置非常簡單,如果對版本沒有要求在系統的默認鏡像源中就有,可直接安裝即可。

yum install docker -y

修改默認鏡像源為國內的阿裏鏡像,使用阿裏賬號登錄https://cr.console.aliyun.com 在"Docker Hub 鏡像站點"中可以找到添加方式:

vim /usr/lib/systemd/system/docker.service

添加一行--registry-mirror的

ExecStart=/usr/bin/dockerd-current --registry-mirror=https://qxx96o44.mirror.aliyuncs.com \

啟動docker:

 systemctl daemon-reload
 systemctl start docker

使用docker daemon --help 可以查看後臺啟動進程的一些可配置參數。


Docker 常用管理命令

鏡像管理

對於docker我們可以通過本地導入鏡像的方式,或者直接從網絡上的鏡像倉庫進行下載。

顯示鏡像 docker images

搜索鏡像 docker search nginx

下載鏡像 docker pull nginx

導出鏡像 docker save nginx > /tmp/nginx.tar.gz

導入鏡像 docker load < /tmp/nginx.tar.gz

刪除鏡像 docker rmi nginx


容器管理

當下載好一個鏡像之後,下一步就是使用這個鏡像來啟動一個容器,啟動容器我們使用docker run 命令,這裏會自動創建並啟動。

啟動一個容器,並進入終端, 退出後容器停止

docker run -it nginx sh   # -i -t 打開一個偽終端,打開標準輸入, sh 執行的命令

如果要想退出終端後容器不停止,可以使用 組合鍵:ctrl + p + q

或者登錄容器使用 exec 命令(退出登錄後容器不終止):

docker exec -it  con-name  sh

也可以使用如下命令登錄容器,但是與其他的登錄者共享一個終端,能看到實時操作(退出會終止):

docker attach Con-name

如果你看不見shell提示符,按鍵盤方向鍵的上箭頭。

啟動容器,命名為test,並讓其在後臺運行:

docker run -d --name test centos bash -c  "for n in {1..10};do echo up;sleep 1;done"

可以使用docker logs 查看容器的運行狀態信息:

docker logs test 
docker logs test -f  #實時查看日誌

啟動一個容器,命名為mynginx,退出後容器刪除:

docker run -it --rm --name mynginx nginx bash

後臺啟動一個mynginx的容器

docker run  -d --name mynginx nginx

查看容器的具體信息:

docker inspect  Docker-Name

進入一個正在運行的容器,可以使用如下腳本(退出時需要註意,直接退出會終止容器):

#!/bin/bash
pid=`docker inspect --format "{{.State.Pid}}" $1` 
nsenter -t $pid -m -u -i -n -p    # nsenter的參數不能少

如果沒有這個命令可以采用yum install util-linux -y進行安裝。


停止一個容器:

docker stop mynginx

或者使用kill ID 的方式:

docker kill  Docker-ID

殺死所有運行的容器:

docker kill $(docker ps -a -q)

查看所有容器(包含未運行的容器):

docker ps -a

刪除所有的容器(強制刪除正在運行的容器加-f 參數):

docker rm `docker ps --all|awk ‘{print $1}‘|grep -v "CONTAINER"`

容器端口管理

在啟動容器的時候,如果不指定對應的參數,在容器外部是無法通過網絡來訪問容器內的網 絡應用和服務的。當容器中運行一些網絡應用,要讓外部訪問這些應用時,可以通過P或 者p參數來指定容器端口映射。當使用P(大寫)時,docker會隨機映射一個端口到容器內 部開放的端口

隨機端口映射:

docker run --rm -it -P nginx
docker run --rm -it -p 127.0.0.1::80  nginx

指定端口:

docker run -it --rm -p 80:80 nginx   # 第一個端口為宿主機端口,第二個為容器內部端口

綁定多個端口:

docker run --rm -it  -p 82:80 -p 822:22 nginx

指定IP綁定端口:

docker run –rm it p 127.0.0.1:80:80 nginx

默認使用的是TCP協議,也可指定協議:

docker run –rm it p 127.0.0.1:80:80/udp  nginx


網絡功能

docker創建的容器默認是使用的NAT進行網絡通信的,默認情況下創建的容器都在172.17.0.0/16的bridge網絡中。

docker會在宿主機創建一個docker0的網卡,默認情況下自帶三種網絡:

# docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
19d6580ec589        bridge              bridge              local               
7d48677c86bc        host                host                local               
01b58b1cb415        none                null                local


host網絡是在主機的網絡堆棧上添加一個容器,使用host網絡,主機和容器之間沒有隔離。 例如,如果您使用主機網絡運行在端口80上運行Web服務器的容器,則Web服務器可在主機端口80上使用。

host網絡和none網絡是無法直接配置的,我們可以配置和自定義bridge網絡。


查看網絡類型的具體說明:

docker network inspect bridge

內容會顯示當前分配的容器網絡地址。

當我們要創建一個基於某個網絡的容器時,使用 docker run --network=<NETWORK> 指定


容器互聯

您可以使用Docker鏈接功能來允許容器相互發現,並將有關一個容器的信息安全地傳輸到另一個容器。 通過引入Docker網絡功能,您仍然可以創建鏈接,但它們在默認網橋和用戶定義網絡之間的行為方式不同,容器的互聯需要通過容器的name來指定。

創建一個名為web的容器,將它與test容器互聯:

docker run -d --link test  --name web nginx

這樣兩個容器在默認的docker0中網絡就打通了,其實也是利用DNS的主機和IP解析,在test容器中的/etc/hosts文件添加了web容器主機名解析配置。不過官方不推薦這樣做,更好的做法是自定義一個bridge網絡。

由於默認容器是以NAT方式接入宿主機網絡的,所以這種方式只支持在同一臺宿主機上的容器互聯。



自定義網絡

建議使用用戶定義的bridge網絡來控制哪些容器可以相互通信,還可以使用自動DNS解析容器名稱到IP地址。 Docker提供了創建這些網絡的默認網絡驅動程序。 您可以創建一個新的橋接網絡,覆蓋網絡或MACVLAN網絡。 您還可以創建一個網絡插件或遠程網絡進行完整的自定義和控制。


您可以根據需要創建任意數量的網絡,並且可以在任何給定時間將容器連接到這些網絡中的零個或多個網絡。 此外,您可以連接並斷開網絡中的運行容器,而無需重新啟動容器。 當容器連接到多個網絡時,其外部連接通過第一個非內部網絡以字母順序提供網絡連接。


Bridge 網絡

Bridge網絡是Docker中最常見的網絡類型。 Bridge網絡類似於橋接網絡,但是與傳統的橋接網絡不通,docker的bridge網絡添加了一些新功能並刪除一些舊的功能。 以下示例創建一些橋接網絡,並對這些網絡上的容器執行一些實驗。

系統默認的是172.17.0.1/16網段的,如果我們想要修改這個網段(即docker0地址)需要修改啟動文件:

vim /usr/lib/systemd/system/docker.service

在ExecStart=區域,加上參數:

--bip=10.10.0.1/24 \

這裏指定的網段必須以1結尾,不能使用0表示一個網段,否則服務無法啟動。

查看默認的docker0網絡:

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:7f:52:5a brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.231/24 brd 192.168.20.255 scope global ens3
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:3d:be:20:1d brd ff:ff:ff:ff:ff:ff
    inet 10.10.0.1/24 scope global docker0
       valid_lft forever preferred_lft forever
76: br-0d7cff84eda0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:98:d5:cf:bf brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 scope global br-0d7cff84eda0
       valid_lft forever preferred_lft forever


創建一個自定義的bridge網絡:

docker network create backend  #默認會使用bridge驅動
# docker network inspect backend
[
    {
        "Name": "backend",
        "Id": "0d7cff84eda06d5648a9ec3b079b4f41dfad836a7ea15dbdd2e1521318d93478",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
0d7cff84eda0        backend             bridge              local               
239f46f2ac1c        bridge              bridge              local               
7d48677c86bc        host                host                local               
01b58b1cb415        none                null                local

創建一個容器,並指定backend網絡:

# docker run --network=backend -itd --name=ts-net centos

04ddbd92fea9c63f6ec54c7e63409054fabe1ae8a5d4ab4e4134722df9ca890c

查看自定義的網絡狀態:

# docker network inspect backend
[
    {
        "Name": "backend",
        "Id": "0d7cff84eda06d5648a9ec3b079b4f41dfad836a7ea15dbdd2e1521318d93478",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "04ddbd92fea9c63f6ec54c7e63409054fabe1ae8a5d4ab4e4134722df9ca890c": {
                "Name": "ts-net",
                "EndpointID": "0b9d8cdf461a4a623693b86cb465c624573ff466453e6a0d202bd40937bf23c4",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]


啟動到此網絡的容器必須駐留在相同的Docker宿主機上。 網絡中的每個容器都可以立即與網絡中的其他容器進行通信。 雖然網絡本身將容器與外部網絡隔離開來。

用戶自定義的bridge網絡不支持link方式。可以使用之前介紹的端口映射或者使用expose的方式。



本文出自 “Trying” 博客,請務必保留此出處http://tryingstuff.blog.51cto.com/4603492/1945403

Docker基礎配置簡介