什麼是Docker?
官方解釋為一個類似集裝箱的東西,把開發完成的應用或程序放到這個集裝箱裡去運行 ,整個環境都是獨立 隔離的互相不干擾而整個docker平臺就像一艘大貨輪把這些集裝箱都放到上面運行。
再舉一個例子就是 本來房東要將自己的大房子對外出租 ,每個人睡一張床鋪整個房子到處都是大大小小的床 一些生活用品堆的的到處都是,在用水用電等其他公共設施 都在統一的管理下 時間久了非常 繁瑣 。
而現在引用docker的概念就是 把每個住戶都分成一個小標間隔離起來 裡面的水電生活設施都是獨立的 住戶們自己解決,設計,個性化
安裝 Docker:
官方源:
yum install -y yum-utils device-mapper-persistent-data lvm2 //安裝依賴
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo //安裝yum源
yum -y install docker-ce //安裝docker
阿里雲源:
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
docker-cn 加速:
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
docker-clound 加速:
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://6f41b03d.m.daocloud.io
阿里雲 加速:
https://cr.console.aliyun.com
{
"registry-mirrors": ["https://widbrt8z.mirror.aliyuncs.com"]
}
登陸 Docker Hub:
docker login --username=qxfell --password=qxfell123 # 登錄docker hub
docker tag nginx:v1 qxfell/nginx:v1 # 鏡像打標籤
docker push qxfell/nginx:v1 # 上傳
docker pull qxfell/nginx:v1 # 下載
基本操作命令:
docker search # 查找鏡像
docker run # 運行鏡像
-d # 後臺運行容器
-P # -p 指定端口運行
docker ps -a # 查看所有容器(包括已睡眠) 去掉-a是查找正在運行的
docker run -i -t centos /bin/bash # 與容器產生交互 進入到centos 鏡像中
-t # 在新容器內指定一個偽終端或終端
-i # 允許對容器 內的標準輸入進行 交互
docker los 容器ID # 查看交互信息日誌
docker rm $( docker ps -a -q ) # 清除睡眠的容器
docker run -d -p 8000:5000 training/webapp python app.py # 將docker內部端口映射到本機8000端口
docker logs -f 容器ID # 查看容器的日誌 後面加上容器ID即可
docker top 容器ID # 查看容器的進程
docker exec -it 容器ID /bin/bash # 進入指定容器
docker cp 容器ID:/usr/local/ /tmp # 從容器裡拷貝文件或目錄到本地主機裡
ps -a # 查看睡眠的容器 -q 顯示容器標籤/ID
attach # 容器的標準輸入 也就是進入容器裡操作
rm # rmi 刪除鏡像 rm -f 強制刪掉所有正在運行的容器
start # 開啟容器
stop # 停止容器
kill
pause/unpause
rename # 重命名容器
更多操作:
inspect # 後面加上容器名字 查看容器所有屬性信息 常見的網絡信息等
exec # -it 標準輸入 和 attach 一樣 進入模擬終端
top # 查看容器的後臺進程
port # 將容器內的某個端口映射到宿主機上
cp # 容器與宿主機之家互相拷貝
diff # 可以看出系統有什麼變化
logs # 查看容器的輸入日誌
stats # 命令用於顯示一個或多個容器實時的資源使用情況,包括CPU,內存使用量,網絡IO,磁盤IO等信息
update # --image 指定新的鏡像 更新鏡像版本
events # 從服務器獲取實時事件
打包自定義鏡像:
docker commit -m="has update" -a="runoob" 容器ID runoob/ubuntu:v2
-m: # 提交的描述信息
-a: # 指定鏡像作者
e218edb10161:容器ID
runoob/ubuntu:v2: # 指定要創建的目標鏡像名
導入導出鏡像:
// 導出
docekr export 容器名 保存的名字.tar
例:docekr export test01 test01.tar
// 導入
docker import 名字.tar 鏡像包名字
例: docker import test-01.tar centos
// 完整導出
docker save 鏡像名 > 保存的名字.tar
// 完整導入
docker load -i 保存的名字.tar
容器數據持久化:
# 掛載數據卷 將宿主機的目錄當作卷 掛載到容器中
docker run -itd -v /data/web:/data --name web01 centos
docker run -itd --volumes-from 容器名 --name web02 centos
# Volume Bind Mount (推薦用這個)
--mount src=nginx-vol,dst=/usr/share/nginx/html # 將容器裡的內容掛載到宿主機的數據卷
# 管理卷:
docker volume create 數據卷名 # 創建數據卷
docker volume ls # 查看數據卷
docker volume inspect 數據卷名 # 查看數據卷的信息
# 啟動容器 引用mount 根據創建的數據卷 掛載
docker run -d -it --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx #
# 指定目錄綁定 會替換容器中的內容 當容器裡跑的是java應用 就可以把構建的 target/*.war 共享到容器裡 直接重啟容器就可以完成部署
docker run -d -it --name=nginx-test --mount type=bind src=/wwwroot dst=/usr/share/nginx/html nginx
清理刪除容器:
docker container stop nginx-test # 停止容器
docker container rm nginx-test # 刪除容器
docker volume rm nginx-vol # 刪除數據卷
自定義網段:
# 創建網絡
docker network create --subnet-10.0.0.0/16 network_10
docker network ls
# 運行一個網段
docker run -itd --net=network_10 --ip 10.0.0.123 容器名 (centos)
docker inspect 容器名 # 查看容器ip信息
# 容器間通信
--link
docker run -itd --link 之前創建或有的容器名或主機名:新增一臺的主機名 容器名
# restart重啟
docker run -itd --restart always centos # 不斷重啟容器
docker run -it --restart always centos # 指定重啟3次 onfailure:3
# 容器修改DNS:
docker run -itd --dns 8.8.8.8 鏡像名字(centos)
#指定容器的主機名
docker run -itd -h qiangxianfei centos
# -e 傳入變量
docker run -itd -e TEST=123 cetnos
docker attach 容器名 # 將變量聲明到容器中
3種網絡模式:
bridge
默認網絡, docker 啟動後創建一個docker0 網橋,默認創建的容器也是添加到這個上
host
容器不會獲得一個獨立的network namespace (命名空間)而是和宿主機公用一個
none
獲取獨立的network namespace 但不為容器進行任何網絡配置
container
與指定的容器使用同一個network namespace 網卡配置也都是相同的自定義
除了容器映射端口以外 還可以用iptables 來讓容器對外進行訪問 可以PREROUTING (路由前的匹配) 將88 端口轉發到容器的80
iptables -t nat -A PREROUTING -d 192.168.80.128 -p tcp --dport 89 -j DNAT --to 172.17.0.2:80
容器配置自定義ip(永久生效)
vi /etc/network/interfaces
auto eth0
iface eth0 inet static
auto br0
iface br0 inet static
address 192.168.1.120
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1
bridge_ports eth0
利用pipework 配置容器自定義ip
git clone https://github.com/jpetazzo/pipework
cp pipework/pipework /usr/local/bin
docker run -itd --net=none --name test01 centos
pipework br0 test01 192.168.1.88/24@192.168.1.1
容器開啟ssh服務:
# 開啟容器之後 進入安裝openssh-server 提交一個新的鏡像 然後在開啟鏡像 映射22端口
docker commit test01 centos_ssh
Dockerfile 常用指令:
FROM //構建的新鏡像是基於哪個鏡像
例 FROM centos6
MAINTAINER // 鏡像維護者姓名或郵箱地址
例 MAINTAINER xfell
RUN // 構建鏡像時運行的shell命令
例 RUN [ "yum","install","httpd"] 或者 RUN yum install
CMD //運行容器時 執行的shell命令
例 CMD [ "-e" , "./start.sh"]
CMD [ "/usr/sbin/sshd","-D" ]
CMD /usr/sbin/sshd -D
EXPOSE //聲明容器運行的服務端口
例 EXPOSE 80 443
ENV // 設置容器內環境變量
例 ENV MYSQL_ROOT_PASSWORD 123456
ADD //拷貝文件或目錄到鏡像 如果是URL或壓縮包