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配置,也是按正常配置即可,無需另行特殊配置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM