學習docker,有本文就夠了

什麼是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或壓縮包