1. 程式人生 > >Docker虛擬機器配置手札(centos)

Docker虛擬機器配置手札(centos)

一、Docker只支援CentOS7及以上系統,不支援6.x系統

二、yum安裝Docker

1、安裝相關環境和設定倉庫

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

2、安裝Docker社群版

yum install docker-ce docker-ce-cli containerd.io

Docker 安裝完預設未啟動。並且已經建立好 docker 使用者組,但該使用者組下沒有使用者。

3、啟動Docker  systemctl start docker 

4、執行hello-world  docker run hello-world 

三、修改Docker映象存放目錄

docker 預設的儲存路徑在  /var/lib/docker ,但機子的資料盤掛載在/home目錄下,

所以修改docker儲存路徑到  /home/docker  中。

1、查詢 docker.service 配置檔案,不知道配置檔案在哪裡可以用以下命令顯示

systemctl disable docker
systemctl enable docker
#顯示結果
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

2、修改 docker.service 配置檔案

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

3、在裡面的EXECStart找到這樣一行

 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ,將其修改為

 ExecStart=/usr/bin/dockerd --graph /home/docker -H fd:// --containerd=/run/containerd/containerd.sock 儲存並退出

4、過載並重啟docker服務

systemctl daemon-reload        #過載配置檔案
systemctl restart docker       #重啟docker
systemctl enable docker        #設為自啟動

5、檢視docker執行資訊  docker info 

 其中 Docker Root Dir: /home/docker  即表示已經成功修改執行目錄了

6、重新下載和執行hello-world映象

 docker run hello-world 

四、容器和映象的匯入匯出

映象(Image),就相當於是一個 root 檔案系統。比如官方映象 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 檔案系統。

映象(Image)和容器(Container)的關係,就像是面向物件程式設計中的類和例項一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。

 docker images  檢視映象列表;   docker ps  檢視容器列表;

1、儲存容器為映象  docker commit mycentos myos202005  mycentos是容器名,即現正執行的這個虛擬機器的名;myos202005是匯出的虛擬機器映象名,可用於釋出、備份等操作;

2、匯出映象(轉格式)為檔案  docker save myos202005:latest > /home/myos202005.img 

3、匯出容器(正在執行的虛擬機器)為檔案  docker export mycentos > /home/myos202005.img

4、匯入映象, docker load --input /home/myos202005.img 

5、匯入容器, docker import /home/myos202005.img myos202005 

區別:
    docker save儲存的是映象(image),docker export儲存的是容器(container);
    docker load用來載入映象包,docker import用來載入容器包,但兩者都會恢復為映象;
    docker load不能對載入的映象重新命名,而docker import可以為映象指定新名稱。

 (如果VMware中的虛擬機器centos空間不足,需要擴容,參考這篇文章)

 五、執行虛擬機器和進入虛擬機器系統

1、後臺執行映象(會新建一個容器) 

docker run -itd --privileged=true --name myos202005 myos202005:latest

  (注:以特權模式執行,容器中才能使用啟動服務systemctl等系統命令)

2、如果有執行過,則應該啟動容器  docker ps -a   docker start 容器ID 

2、進入容器(虛擬機器),使用 docker ps 檢視容器資訊,然後  docker exec -it 容器ID /bin/bash

3、退出容器(虛擬機器),不關閉容器  Ctrl + P + Q

4、關閉容器, docker stop 容器ID ;重啟容器  docker restart 容器ID ;啟動容器  docker start 容器ID 

5、檢視包括已退出的容器  docker ps -a ;刪除容器  docker rm 容器ID ;刪除映象 docker rmi 映象ID 

PS:容器ID 和 容器名是等效的,以上命令均可以用容器名替代容器ID。

六、虛擬機器埠對映

1、先分別檢視本機和docker機的程序埠使用情況 netstat -nlpt 

2、檢視容器列表資訊  docker ps 

3、停止容器、停止docker服務 

docker stop 容器ID
systemctl stop docker

4、修改容器的配置檔案,兩個配置檔案都要改

vi /var/lib/docker/containers/容器ID/hostconfig.json
vi /var/lib/docker/containers/容器ID/config.v2.json

PS:如果第三步修改過docker存放目錄,如 /home/docker,則配置檔案的位置也在相應新的位置

例如把docker中mysql 3306埠,對映到外面的13306埠,以便遠端訪問docker中的資料庫

5、hostconfig.json修改

找到 PortBindings ,把那一段JSON修改為  "PortBindings":{"3306/tcp":[{"HostIp":"","HostPort":"13306"}]} 

6、config.v2.json修改

修改值 config > ExposedPorts 和 NetworkSettings > Ports

"Config": {
    ....
    "ExposedPorts": {
        "22/tcp": {},
        "3306/tcp": {}
    },
    ....
},
"NetworkSettings": {
    ....
    "Ports": {
        "22/tcp":null,
        "3306/tcp": [{
            "HostIp": "",
            "HostPort": "13306"
        }],
    },
    ...
}

7、修改完成後先檢查兩個檔案是否JSON格式正確

8、啟動docker,啟動容器, 檢視容器列表資訊,檢視埠對映是否生效

systemctl start docker
docker start 容器ID
docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                       NAMES
容器ID                myos202005:latest   "/usr/sbin/init"    3 hours ago         Up 5 seconds        22/tcp, 1300/tcp, 0.0.0.0:13306->3306/tcp   cranky_franklin

如上標紅的 13306->3306,則表示埠對映成功

9、檢視埠使用情況  netstat -nlpt ,可以看到 docker-proxy 程序使用13306埠

10、伺服器防火牆開放相應的埠

#檢視開放的埠
firewall-cmd --list-port
#新增埠(永久)
firewall-cmd --zone=public --add-port=13306/tcp --permanent
#過載防火牆
firewall-cmd --reload

如果是用的阿里雲,還有“安全組”策略限制了埠訪問,需要在阿里雲後臺操作新增埠

七、Nginx / Apache 反向代理部分域名到docker中

實現效果:blog.batsing.com 正常定向在伺服器中,blog.demo.batsing.com 定向到docker中。都是使用80埠。

實現過程:

1、docker機裡有內網IP(預設172.17.0.2)

2、伺服器可以通過此IP訪問到docker中的nginx curl 172.17.0.2:80

3、伺服器配置系統hosts,把demo域名指向docker內網IP

cat /etc/hosts
172.17.0.2 blog.demo.batsing.com

4、Nginx中配置vhost,將demo域名轉發到域名自身

server {
    listen            80;
    server_name        blog.demo.batsing.com;
    location / {
        proxy_pass    http://blog.demo.batsing.com;
        proxy_set_header X-Real-IP $remote_addr;                                                   
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
    }
}

轉發到域名自身,因為伺服器的hosts配置,所以會轉發到docker機中,從而實現部分域名轉入到docker中的功能。

伺服器中其他站點域名,按nginx正常配置即可。

docker中的nginx配置,也是按正常配置即可,無需另行特殊配