Docker:是對應用的虛擬化,共享了底層宿主機的操作系統內核,是一種標准的應用程序打包、部署方式
虛擬機技術:對整個操作系統的虛擬化,用於模擬完整的操作系統
Docker在centos上的安裝,Ubuntu上的安裝可以參考Docker官網給的安裝教程
sudo yum install –y docker-io
啟動docker
sudo systemctl start docker
搜索docker鏡像
sudo docker search centos
獲取鏡像
sudo docker pull centos
查看鏡像
sudo docker images
刪除鏡像
sudo docker rmi <鏡像名稱>
啟動容器
sudo docker run --name –h hostname
列如啟動一個‘Hello world’鏡像為centos的docker容器
sudo docker run centos /bin/echo ‘Hello world’
啟動自定義名稱的docker容器,並進入到容器里面
sudo docker run --name mydocker -it centos /bin/bash
啟動已經創建好的docker容器
sudo docker start <容器ID>
啟動docker容器,並讓其在后台運行
sudo docker run -d --name mynginx nginx
交互型容器:運行在前台,通常會指定有交互的控制台,可以給容器輸入,也可以得到容器的輸出
sudo docker run -it --name <容器名稱> <鏡像> /bin/bash
守護型容器:運行在后台,創建啟動之后就與終端無關
sudo docker run -d --name <容器名稱> <鏡像> /bin/bash
獲取容器PID
sudo docker inspect --format “{{.State.Pid}}” <容器ID/容器名稱>
進去正在運行的容器,其中pid、net、ipc、mount、uts分別表示容器的進程、網絡、消息、文件系統和主機名
sudo nsenter --target <容器PID> --mount --uts --ipc --net --pid
停止容器
sudo docker stop CONTAINER ID
查看當前正在運行的容器
sudo docker ps
查看所有容器,包括運行和停止的
sudo docker ps -a
查看最新創建的容器
sudo docker ps -l
查看最后創建的x個容器
sudo docker ps -n=x
刪除容器
sudo rm CONTAINER ID
Docker沒有提供一次性刪除所有容器的命令,但是可以用下面的命令來實現這個目的
sudo docker rm ‘docker ps -a -q’
這個命令會用docker ps列出當前的所有容器,-a標志列出所有容器,-q標志只列出容器的ID,不包括容器的其他信息。然后將這個列表傳給docker rm命令,依次刪除容器
編寫進入容器腳本in.sh
vim in.sh #!/bin/bash CNAME=$1 CPID=$(sudo docker inspect --format "{{.Status.Pid}}" $CNAME) sudo nsenter --target "$CPID" --mount --uts --ipc --net --pid
賦予腳本可執行權限
sudo chmod u+x in.sh
進入容器只需 ./in.sh <主機名>
查看網橋情況,可以看出網絡中是有docker的網橋的
brctl show
查看防火牆規則,同樣網絡中含有docker的防火牆規則
sudo iptables -L
隨機映射
sudo docker run -P
sudo docker run -d -P --name mynginx1 nginx
指定映射
sudo docker run -p hostPort:containerPort sudo docker run -p ip:hostPort:containerPort sudo docker run -p ip::containerPort sudo docker run -d -p 91:80 --name mynginx2 nginx
通過nginx在容器中部署靜態網站
sudo docker run -it -p 80 --name web ubuntu /bin/bash root@425c7a0e6949:/# apt-get update root@425c7a0e6949:/# apt-get install nginx root@425c7a0e6949:/# apt-get install vim root@425c7a0e6949:/# mkdir -p /var/www/html root@425c7a0e6949:/# cd /var/www/html/ root@425c7a0e6949:/var/www/html# vim index.html root@425c7a0e6949:/var/www/html# whereis nginx nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx root@425c7a0e6949:/var/www/html# ls /etc/nginx/ root@425c7a0e6949:/var/www/html# ls /etc/nginx/sites-enabled/ root@425c7a0e6949:/var/www/html# vim /etc/nginx/sites-enabled/default(將root后的目錄改為自己創建的靜態網站的目錄) root@425c7a0e6949:/var/www/html# cd root@425c7a0e6949:~# nginx root@425c7a0e6949:~# ps -ef
在宿主機查看正在運行的容器,可以看到容器映射的端口信息
sudo docker ps
也可以直接查看容器映射的端口號和容器內進程
sudo docker port web
sudo docker top web
可以在通過宿主機本地IP加上端口號查看所創建的網頁,也可以直接通過容器IP查看,當然也可以在瀏覽器里面直接輸入IP地址
curl http://127.0.0.1:<端口號> curl http://172.17.0.2
使用commit構建鏡像
sudo docker commit <容器名稱/容器ID> <鏡像名稱>
使用Dockerfile構建鏡像
mkdir -p dockerfile/df_test1 cd dockerfile/df_test1 vim dockerfile #First dockerfile for test FROM ubuntu MAINTAINER(維護人信息) RUN apt-get update RUN apt-get install nginx EXPOSE 80 sudo docker build -t=<鏡像名稱>
Dockerfile的指令
# 后面跟着注釋的內容
INSTRUCTION argument <指令以大寫的指令名開頭,后面跟指令的參數>
FROM <鏡像名> (已經存在的鏡像,也成為基礎鏡像,必須是Dockerfile中第一條非注釋指令)
MAINTAINER <name> (指定鏡像的作者信息,包含鏡像的所有者和聯系信息)
RUN <command>
EXPOSE <port> (指定該鏡像運行的容器使用的端口)
Dockerfile構建過程
從基礎鏡像運行一個容器
執行一條指令,對容器作出修改
執行類似docker commit的操作,提交一個新的鏡像層
再基於剛提交的鏡像運行一個新的容器
執行Dockerfile中的下一條指令,直至所有指令執行完畢
commit構建鏡像實例
對鏡像進行升級 root@e8730dd51d57:/# apt-get update 安裝網絡工具 root@e8730dd51d57:/# apt-get install net-tools 安裝Ping工具 root@e8730dd51d57:/# apt-get install iputils-ping sudo docker commit <容器ID> 名字/鏡像
再用sudo docker images去查看可以發現多處了鏡像
在另外一個終端中進入已經運行的容器
sudo docker attach <容器ID>
sudo docker exec -it <容器ID> /bin/bash
利用docker logs命令來查看容器日志,其中-f標志可以查看實時日志,-t標志可以日志產生的時間,也可以用--tail標志來指定查看日志的最后部分
sudo docker run -d --name logs ubuntu /bin/sh -c "while true;do echo Hello world;sleep 1;done" sudo docker logs -t logs sudo docker logs -f logs sudo docker logs -t -f --tail=0 logs
查看容器內進程
sudo docker top <容器名稱>
查看docker守護進程
sudo ps -ef | grep docker
啟動停止docker守護進程
sudo service docker start
sudo service docker stop
sudo service docker restart
修改docker0默認分配的ip地址
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0 sudo service docker restart
添加虛擬網橋
sudo ovs-vsctl add-br br0 sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0
更改docker守護進程的啟動配置:
/etc/default/docker中添加DOCKER_OPTS值 -b=br0
拒絕所有容器間互聯
/etc/default/docker中添加DOCKER_OPTS值 --icc=false,然后再用重啟docker守護進程
sudo vim /ect/default/docker DOCKER_OPTS=”--icc=false” sudo service docker restart
允許特定容器間的連接
Docker守護進程的啟動選項
--icc=false --iptables=true
--link 在容器啟動時添加link
docker利用iptables中的機制,在icc=false時,阻斷所有的docker容器間的訪問,僅僅運行利用link選項配置的容器進行相互的訪問
查看docker網絡
sudo docker network ls
sudo docker network inspect <網絡類型>
建立自己的網絡
sudo docker network create --driver bridge mynet
讓容器運行在自己創建的網絡中
sudo docker run -it --network=mynet --name <容器名稱> <鏡像>
數據卷是經過特殊設計的目錄,可以繞過聯合文件系統,為一個或多個容器提供訪問
數據卷的設計目的,在於數據的永久化,它完全獨立於容器的生成周期,因此,docker不會在容器刪除時刪除其掛載的數據卷,也不會存在類似的垃圾手機機制,對容器引用的數據卷進行處理
數據卷的特點
(1)數據卷在容器啟動時初始化,如果容器使用的鏡像在掛載點包含了數據,這些數據會拷貝到新初始化的數據卷中
(2)數據卷可以在容器之間共享和重用
(3)可以對數據卷里的內容直接進行修改
(4)數據卷的變化不會影響鏡像的更新
(5)卷會一直存在,即使掛載數據卷的容器已經被刪除
為容器添加數據卷
在用docker run命令的時候,使用-v標記來添加一個數據卷。在一次run中多次使用可以掛載多個數據卷,下面加載一個卷到web容器上
sudo docker run -it --name web -v /web ubuntu /bin/bash
web是容器中的目錄,目錄不存在會重新創建
掛載一個主機目錄作為數據卷
sudo docker run -it --name web -v /opt/web:/web ubuntu /bin/bash
為數據卷添加訪問權限為只讀
sudo docker run -it --name web -v /opt/web:/web:ro ubuntu /bin/bash
掛載一個宿主主機文件作為數據卷
sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
創建一個容器數據卷
sudo docker run -itd -v /logdata --name logdata ubuntu
在其他容器中掛載logdata容器的數據卷
sudo docker run -itd --name web1 --volumes-from logdata ubuntu udo docker run -itd --name web2 --volumes-from logdata ubuntu
備份
sudo docker run --volumes-from logdata -v /containet_backup:/backup ubuntu tar cvf /backup/backup.tar /data
恢復
先創建一個數據卷
sudo docker run -v /data --name logdata2 ubuntu
再將備份文件恢復到這個數據卷容器
sudo docker run --volumes-from logdata2 -v /container_backup:/backup ubuntu tar xvf /backup/backup.tar
最后啟動一個容器掛載驗證/data目錄數據恢復成功
sudo docker run -itd --volumes-from logdata2 --name web_recover ubuntu
遷移容器和鏡像
先創建測試容器
sudo docker exec web touch /opt/test.txt
sudo docker exec web ls /opt
執行導出
sudo docker export web > web.tar
執行導入
cat web.tar | sudo docker import - web:v2
啟動容器
sudo docker run -itd --name web_v2 web:v2 /bin/bash
進入容器查看
sudo docker exec web_v2 ls /opt
導出
sudo docker save web > web.tar
導入
sudo docker load < web.tar