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