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