Docker虛擬機配置手札(centos)

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

二、yum安裝Docker

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

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo //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埠

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

#查看開放的埠
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配置,也是按正常配置即可,無需另行特殊配置。