docker深入學習
一、容器的介紹和容器的發展史
為什么要學習容器?
在openstack之后,目前互聯網最火熱的技術莫過于docker容器了,早在2015年,京東技術備戰雙11就是使用了10萬+Docker,這兩年docker更是如日中天,docker只是容器的一種,在學習docker之前,我有必要先了解一下什么是容器?有助于我們更好的了解docker,
什么是容器:
容器是在隔離的環境里面運行的一個行程,這個隔離的環境有自己的系統目錄檔案,有自己的ip地址,主機名等,
也有人稱:容器是一種輕量級虛擬化的技術,
容器相對于kvm虛擬機的優勢:
1:容器能提供接近宿主機的性能,而kvm虛擬機會損害一部分宿主機的性能;
2:同樣硬體配置的宿主機最多能啟動10虛擬機,那么它可以啟動100+容器;
3:啟動一臺kvm虛擬機,可以能需要20秒,啟動一個容器只需要1秒;
4:kvm需要硬體cpu的支持,容器不需要;
linux開機啟動流程:
- bios開機硬體自檢
- 根據bios設定的優先啟動項
- 讀取mbr引導
- 加載內核
- 啟動第一個行程/sbin/init
- 執行系統初始化腳本/etc/rc.d/rc.sysinit
- 完成系統初始化
- 運行想要的服務sshd
總結:kvm虛擬機運行一個sshd服務需要完整的開機啟動流程,容器是直接啟動sshd服務,中間的流程全部精簡,(docker共用宿主機內核,)
容器的發展史:
1)chroot技術chroot,即change root directory(更改 root 目錄),在 linux 系統中,系統默認的目錄結構都是以/,即是以根 (root) 開始的,而在使用chroot之后,系統的目錄結構將以指定的位置作為/位置,
2)lxc容器全稱:linux container,通過namespaces 命名空間實作的隔離環境,通過cgroups實作的資源限制,提供類似虛擬機一樣的體驗,
3)docker容器早期的docker容器底層就是呼叫的lxc,后期才換成了自己的libcontainer,
二、lxc容器的安裝和使用
lxc容器的安裝
lxc容器的依賴:
依賴CentOS-Base.repo和epel.repo
rm -fr /etc/yum.repos.d/local.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
安裝lxc容器:(Ubuntu上開發的,在Ubuntu上可以直接使用,centos可以直接使用)
yum install lxc-* -y
yum install libcgroup* -y
yum install bridge-utils.x86_64 -y
為lxc容器準備橋接網卡(virsh iface-bridge eth0 br0)
echo 'TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=virbr0' >/etc/sysconfig/network-scripts/ifcfg-eth0
echo 'TYPE=Bridge
BOOTPROTO=static
NAME=virbr0
DEVICE=virbr0
ONBOOT=yes
IPADDR=10.0.0.14
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=223.5.5.5' >/etc/sysconfig/network-scripts/ifcfg-virbr0
創建并啟動容器
創建lxc容器:
lxc-create -t download -n centos6 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images
注意:
Distribution: centos
Release: 6
Architecture: amd64
設定容器的root用戶密碼
chroot /var/lib/lxc/centos6/rootfs passwd
啟動容器:
lxc-start -n centos6
lxc容器的行程:容器中運行的命令,在宿主機中都可以看到推薦使用pstree命令來查看,需安裝yum install psmisc.x86_64 -y,lxc容器的系統目錄檔案:lxc容器的系統目錄檔案在宿主機的某一個目錄下/var/lib/lxc/容器名/rootfs
三、docker的介紹和安裝
Docker是通過內核虛擬化技術(namespaces及cgroups)來提供容器的資源隔離與資源限制,由于Docker通過作業系統層的虛擬化實作隔離(對作業系統的內核有要求),所以Docker容器在運行時,不需要類似虛擬機(VM)額外的作業系統開銷,從而比kvm虛擬機更輕量,docker是一種軟體的打包技術,
docker的理念:
docker的主要目標是"Build,Ship and Run any App,Angwhere",構建,運輸,處處運行,
- 構建:制作docker鏡像,打包容器的所有系統目錄檔案
- 運輸:下載docker鏡像
- 運行:基于docker鏡像提供的rootfs,啟動容器
總結:只要能運行docker容器,那么docker鏡像中已經安裝好的軟體也可以運行,所以說docker是一種軟體的打包技術,
docker的優點:
1:解決了作業系統和軟體運行環境的依賴,
如:nginx openssl
? git openssl(nginx,git 適應不同的openssl的版本,兼容性存在問題)
2:對于開發人員來說,再也不用擔心不會部署開發環境,
3:開發環境,測驗環境和生產環境高度一致,
4:讓用戶體驗產品新特性的又一種思路,
docker的安裝:
yum源配置:
rm -fr /etc/yum.repos.d/local.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
----
上面不可用時候替換備選(阿里源):
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
---
安裝docker-ce:
yum install docker-ce -y
docker的架構
啟動docker
systemctl start docker
systemctl enable docker
docker是一個cs架構:
通過docker version來查看
docker最重要的三大組件:
鏡像,容器,倉庫
四、啟動第一個docker容器
docker容器是一種軟體的打包技術,接下來我們體驗一下
傳統編譯安裝nginx:
官網下載Nginx原始碼包wget
tar解壓原始碼包
創建Nginx用戶
安裝依賴包
編譯安裝三部曲configure,make,make install
修改nginx組態檔
啟動nginx
docker容器
docker run -d -p 80:80 nginx
命令解釋:
run (創建并運行一個容器)
-d 放在后臺
-p 埠映射
nginx docker鏡像的名字
為了快速下載鏡像:
配置docker鏡像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
systemctl restart docker
五、docker鏡像的常用命令
搜索鏡像: docker search
選鏡像的建議:
1,優先考慮官方
2,starts數量多
鏡像獲取:
獲取鏡像:
docker pull(push)
鏡像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker 中國官方鏡像加速:https://registry.docker-cn.com
docker pull centos:6.8(沒有指定版本,默認會下載最新版)
docker pull daocloud.io/huangzhichong/alpine-cn:latest
擴展:查詢docker鏡像所有版本https://hub.docker.com/r/library/
docker其他操作:
查看鏡像
docker images
洗掉鏡像
docker rmi 例子:docker image rm centos:latest
匯出鏡像
docker save 例子:docker image save centos > docker-centos7.4.tar.gz
匯入鏡像
docker load 例子:docker image load -i docker-centos7.4.tar.gz
[root@docker-01 docker]# docker image
build history import inspect load ls prune pull push rm save tag
build:構建鏡像
history:查看構建鏡像的歷史
import:匯入鏡像(棄用)
inspect:查看鏡像的詳細資訊
load:匯入鏡像
ls:查看鏡像
prune:洗掉(已經不用)
pull:下載鏡像
push:上傳鏡像
rm:洗掉鏡像
save:匯出鏡像
tag:鏡像起別名
六、docker容器日常管理
運行一個容器:
docker run -d -p 80:80 nginx:latest
run (創建并運行一個容器)
-d 放在后臺
-p 埠映射
nginx:latest docker鏡像的名字和版本
還有很多其他的引數
docker run == docker create + docker start
docker 其他命令
停止容器
docker stop CONTAINER_ID
殺死容器
docker kill container_name
查看容器串列
docker ps
docker ps –a
洗掉容器
docker rm
批量洗掉容器
docker rm -f `docker ps -a -q`
[root@docker-01 docker]# docker container
attach cp diff export kill ls port rename rm start stop unpause wait
commit create exec inspect logs pause prune restart run stats top update
docker的run的擴展
docker run -it --name centos6 centos:6.8 /bin/bash
-it 分配互動式的終端
--name 指定容器的名字
/bin/sh 覆寫容器的初始命令
--cpus 指定cpu的數量
--memory 限定記憶體的大小
-h 指定容器的主機名
進入容器的方法
進入容器的目的:排錯,除錯
進入容器的方法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
例子: (使用不同的終端vty)
docker exec -it 容器id或容器名字 /bin/bash
docker attach [OPTIONS] CONTAINER
例子:(使用相同的終端vty)
docker attach 容器id或容器名字
nsenter(安裝yum install -y util-linux 棄用)
容器的核心理念
docker的本質是:在隔離的環境運行的一個行程
所以:docker容器內的第一個行程必須一直處于前臺運行的狀態(必須夯住),否則這個容器,就會處于退出狀態!
tail -f(-F)
七、docker容器網路訪問
運行容器為什么要使用埠映射?
默認,情況下,容器使用的ip是172.17.0.0/16網段的,外界的用戶只能訪問宿主機的10.0.0.0/24網段,無法訪問172.17.0.0/16網段,我們運行容器的目的:是希望運行在容器中的服務,能夠被外界訪問,這里就涉及到了外網10.0.0.0/24到容器內網172.17.0.0/16網段的轉換,所以需要做埠映射,
docker運行容器埠映射的方法
指定映射(docker 自動添加一條iptables規則實作埠映射)
-p hostPort:containerPort
-p ip:hostPort:containerPort
-p ip::containerPort(隨機埠)
-p hostPort:containerPort:udp
-p 81:80 -p 443:443 可以指定多個-p
隨機映射
docker run -P (隨機埠)
docker自動添加iptables的規則
iptables -t nat -L -n

docker 容器的網路原理圖

yum install bridge-utils.x86_64 -y
brctl show (查看容器網橋)
[root@docker-01 ~]# tail -1 /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@docker-01 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@docker-01 ~]#
默認情況下,net.ipv4.ip_forward=0;開啟容器后自動改為1,但是掛起容器宿主機掛起后又開啟的時候會自動設定為0,導致容器無法訪問,為防止這情況發生,將此配置放在內核組態檔中,
八、docker資料卷存盤
為什么要要使用docker資料卷
資料卷的作用:
1:持久化容器運行程序中產生的資料檔案
2:實作多個容器間的檔案共享,
正常情況下,洗掉容器,容器中所有的檔案也會被洗掉,使用資料卷后,洗掉容器后資料在資料卷中不會被洗掉,
常見的docker資料卷命令
創建一個資料卷
docker volume create
查看資料卷串列
docker volume ls
洗掉一個資料卷
docker volume rm
查看一個資料卷的屬性
docker volume inspect
資料卷應用:
docker run -d -p 80:80 -v oldboy:/usr/share/nginx/html nginx:latest
根據命令查看容器位置:[root@docker-01 ~]# docker volume inspect oldboy
cd /var/lib/docker/volumes/oldboy/_data/
rm -f *
wget https://www.qstack.com.cn/xiaoniaofeifei.zip
unzip xiaoniaofeifei.zip
docker run -d -p 81:80 -v oldboy:/usr/share/nginx/html nginx:latest
docker run -d -p 82:80 -v oldboy:/usr/share/nginx/html nginx:latest
將宿主機的目錄掛載到容器中
cd /opt
mkdir xiaoniao
cd xiaoniao/
wget https://www.qstack.com.cn/xiaoniaofeifei.zip
unzip xiaoniaofeifei.zip
#重點
docker run -d -p 83:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest
九、手動制作docker鏡像
制作docker鏡像步驟:
- 1:啟動容器安裝軟體服務
- 2:將安裝好服務的容器commit提交為鏡像
- 3: 啟動新容器來測驗新提交的鏡像
制作支持ssh遠程登陸的docker鏡像
制作docker鏡像步驟:
1:啟動容器安裝軟體服務
docker run -it -p 1023:22 --name oldboy centos:6.9
######
yum install openssh-server
/etc/init.d/sshd start
passwd
或者
echo 123456|passwd --stdin root
######
2:將安裝好服務的容器commit提交為鏡像
docker commit oldboy centos6-ssh:v1
3: 啟動新容器來測驗新提交的鏡像
docker run -d -p 2022:22 centos6-ssh:v1 /usr/sbin/sshd -D
/usr/sbin/sshd -D:這個命令可以啟動ssh的同時將容器夯住,
制作支持ssh+httpd雙服務的鏡像
1:啟動容器安裝軟體服務
docker run -it --name oldgirl centos:6.9
yum install httpd
yum install openssh-server
/etc/init.d/sshd start
passwd
###容器啟動腳本
vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
---
或者使用以下這個腳本
[root@dbb708722b6c /]# cat /init.sh
#!/bin/bash
/etc/init.d/sshd start
/etc/init.d/httpd start
tail -F /var/log/httpd/access-log(可以夯住容器行程)
2:將安裝好服務的容器commit提交為鏡像
docker commit oldgirl centos6-ssh-httpd:v1
3:啟動新容器來測驗新提交的鏡像
docker run -d -p 8080:80 -p 1122:22 centos6-ssh-httpd:v1 /bin/bash /init.sh
十、dockerfile自動構建鏡像
手動docker鏡像的缺點
相對于手動制作的docker鏡像,使用dockerfile構建的鏡像有以下優點:
- 1:dockerfile只有幾kb,便于傳輸
- 2:使用dockerfile構建出來的鏡像,在運行容器的時候,不用指定容器的初始命令
- 3:支持更多的自定義操作
dockerfile常用指令:
? FROM 這個鏡像的媽媽是誰?(指定基礎鏡像)
? MAINTAINER 告訴別人,誰負責養它?(指定維護者資訊,可以沒有)
? RUN 你想讓它干啥(在命令前面加上RUN即可)
? ADD 給它點創業資金(COPY檔案,會自動解壓)
? WORKDIR 我是cd,今天付訓了妝(設定當前作業目錄)
? VOLUME 給它一個存放行李的地方(設定卷,掛載主機目錄)
? EXPOSE 它要打開的門是啥(指定對外的埠)(-P 隨機埠)
? CMD 奔跑吧,兄弟!(指定容器啟動后的要干的事情)(容易被替換)
dockerfile其他指令:
? COPY 復制檔案
? ENV 環境變數
? ENTRYPOINT 容器啟動后執行的命令(無法被替換,啟容器的時候指定的命令,會被當成引數)
dockerfile實戰1:
手動制作docker鏡像步驟:
1:啟動容器安裝軟體服務
docker run -it -p 1022:22 --name oldboy centos:6.9
######
yum install openssh-server -y
/etc/init.d/sshd start
echo 123456|passwd --stdin root
######
2:將安裝好服務的容器commit提交為鏡像
docker commit oldboy centos6-ssh:v1
3: 啟動新容器來測驗新提交的鏡像
docker run -d -p 2022:22 centos6-ssh:v1 /usr/sbin/sshd -D
==============================
dockerfile制作docker鏡像步驟:
1:撰寫dockerfile
vi dockerfile
FROM centos:6.9
RUN yum install openssh-server -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
CMD ["/usr/sbin/sshd","-D"]
2:docker build構建鏡像
docker build -t centos6-ssh:v2 .
3: 啟動新容器來測驗新構建的鏡像
docker run -d -p 1422:22 centos6-ssh:v2
dockerfile實戰2
手動制作支持ssh-http雙服務的docker鏡像
1:啟動容器安裝軟體服務
docker run -it --name oldgirl centos:6.9
yum install httpd -y
yum install openssh-server -y
/etc/init.d/sshd start
echo 123456|passwd --stdin root
###容器啟動腳本
vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
2:將安裝好服務的容器commit提交為鏡像
docker commit oldgirl centos6-ssh-httpd:v1
3:啟動新容器來測驗新提交的鏡像
docker run -d -p 8080:80 -p 1122:22 centos6-ssh-httpd:v1 /bin/bash /init.sh
============================================
dockerfile制作docker鏡像步驟:
1:撰寫dockerfile
FROM centos:6.9
RUN yum install openssh-server httpd -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
ADD init.sh /init.sh (將宿主機當前目錄下的init.sh檔案拷貝只容器的根目錄下)
CMD [“/bin/bash",“/init.sh"]
###容器啟動腳本
vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
2:docker build構建鏡像
docker build -t centos6-ssh-httpd:v2 .
3:啟動新容器來測驗新提交的鏡像
docker run -d -p 8080:80 -p 2122:22 centos6-ssh-httpd:v2
docker 實戰3
[root@docker-01 centos6_ssh_http]# cat dockerfile
FROM centos:6.9
RUN yum install openssh-server httpd -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
ADD init.sh /init.sh
EXPOSE 80 22
CMD ["/bin/bash","/init.sh"]
[root@docker-01 centos6_ssh_http]# cat init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
[root@docker-01 centos6_ssh_http]# docker build -t centos6-ssh-httpd:v3 .
[root@docker-01 centos6_ssh_http]# docker run -d -P centos6-ssh-httpd:v3
[root@docker-01 centos6_ssh_http]# docker ps -a -l
[root@docker-01 centos6_ssh_http]# docker exec -it objective_pike /bin/bash
docker實戰4
[root@docker-01 centos6_ssh_http]# cat dockerfile
FROM centos:6.9
RUN yum install openssh-server httpd -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
ADD init.sh /init.sh
EXPOSE 80 22
WORKDIR /root
CMD ["/bin/bash","/init.sh"]
[root@docker-01 centos6_ssh_http]# docker build -t centos6-ssh-httpd:v5 .
[root@docker-01 centos6_ssh_http]# docker run -d -P centos6-ssh-httpd:v5
[root@docker-01 centos6_ssh_http]# docker ps -a -l
[root@docker-01 centos6_ssh_http]# docker exec -it pensive_tesla /bin/bash
[root@23b7958b721e ~]# pwd
/root
docker 容器實戰5
[root@docker-01 centos6_ssh_http]# cat dockerfile
FROM centos:6.9
RUN yum install openssh-server httpd -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
ADD init.sh /init.sh
EXPOSE 80 22
WORKDIR /root
ENV SSH_PASSWD=123456
CMD ["/bin/bash","/init.sh"]
[root@docker-01 centos6_ssh_http]# cat init.sh
#!/bin/bash
echo $SSH_PASSWD|passwd --stdin root
/etc/init.d/httpd start
/usr/sbin/sshd -D
[root@docker-01 centos6_ssh_http]# docker build -t centos6-ssh-httpd:v6 .
[root@docker-01 centos6_ssh_http]# docker run --env "SSH_PASSWD=oldboy123" -d -P centos6-ssh-httpd:v6
[root@docker-01 centos6_ssh_http]# docker ps -a -l
[root@docker-01 centos6_ssh_http]# ssh [email protected] -p 32779
docker 容器實戰6
[root@docker-01 centos6_ssh_http]# cat dockerfile
FROM centos:6.9
RUN yum install openssh-server httpd -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
ADD init.sh /init.sh
EXPOSE 80 22
WORKDIR /root
ENV SSH_PASSWD=123456
ENTRYPOINT ["/bin/bash","/init.sh"]
[root@docker-01 centos6_ssh_http]# cat init.sh
#!/bin/bash
echo $SSH_PASSWD|passwd --stdin root
/etc/init.d/httpd start
/usr/sbin/sshd -D
[root@docker-01 centos6_ssh_http]#
[root@docker-01 centos6_ssh_http]# docker build -t centos6-ssh-httpd:v7 .
[root@docker-01 centos6_ssh_http]# docker run -d -P centos6-ssh-httpd:v7 sleep 10
[root@docker-01 centos6_ssh_http]# docker ps -a -l
#這里的sleep 10沒有起作用,作用的是的entrypoint 后的執行腳本,
十一、dockerfile構建php專案
把專案封裝成docker鏡像的步驟
把專案封裝成docker鏡像的步驟:
1:先運行一個基礎容器,手動制作docker鏡像
2:撰寫dockerfile,構建鏡像
3:測驗運行
=============
dockerfile常用指令:
FROM 這個鏡像的媽媽是誰?(指定基礎鏡像)
MAINTAINER 告訴別人,誰負責養它?(指定維護者資訊,可以沒有)
RUN 你想讓它干啥(在命令前面加上RUN即可)
ADD 給它點創業資金(COPY檔案,會自動解壓)
WORKDIR 我是cd,今天付訓了妝(設定當前作業目錄)
VOLUME 給它一個存放行李的地方(設定卷,掛載主機目錄)
EXPOSE 它要打開的門是啥(指定對外的埠)(-P 隨機埠)
CMD 奔跑吧,兄弟!(指定容器啟動后的要干的事情)(容易被替換)
dockerfile其他指令:
COPY 復制檔案
ENV 環境變數
ENTRYPOINT 容器啟動后執行的命令(無法被替換,啟容器的時候指定的命令,會被當成引數)
手工啟動容器:
[root@docker-01 centos6_ssh_http]# docker rm -f `docker ps -a -q`
[root@docker-01 centos6_ssh_http]# docker run -it -p 80:80 centos:6.9
yum install httpd php php-cli unzip php-gd php-mbstring -y
/etc/init.d/httpd start
cd /var/www/html/
curl -o kodexplorer4.40.zip http://static.kodcloud.com/update/download/kodexplorer4.40.zip
unzip kodexplorer4.40.zip
chmod -R 777 /var/www/html/
docker專案制作dockerfile檔案:
curl -o kodexplorer4.40.zip http://static.kodcloud.com/update/download/kodexplorer4.40.zip
[root@docker-01 kop]# ll
total 13580
-rw-r--r-- 1 root root 259 Apr 12 18:27 dockerfile
-rw-r--r-- 1 root root 69 Apr 12 18:29 init.sh
-rw-r--r-- 1 root root 13894810 Apr 12 18:28 kodexplorer4.40.zip
[root@docker-01 kop]# cat dockerfile
FROM centos:6.9
RUN yum install httpd php php-cli unzip php-gd php-mbstring -y
WORKDIR /var/www/html
COPY kodexplorer4.40.zip .
RUN unzip kodexplorer4.40.zip
RUN chmod -R 777 /var/www/html/
ADD init.sh /init.sh
EXPOSE 80 22
CMD ["/bin/bash","/init.sh"]
[root@docker-01 kop]# cat init.sh
#!/bin/bash
/etc/init.d/httpd start
tail -F /var/log/http/access_log
[root@docker-01 kop]# docker build -t kod:v1 .
[root@docker-01 kop]# docker run -d -P kod:v1
[root@docker-01 kop]# docker ps -a -l
十二、dockerfile鏡像的分層
docker鏡像的分層

有變化的資料變化的都會被封裝成一層,

鏡像分層的好處

分層的好處:
共享資源,節省資源,
有多個鏡像都從相同的 base 鏡像構建而來,那么 Docker Host 只需在磁盤上保存一份 base 鏡像;同時記憶體中也只需加載一份 base 鏡像,就可以為所有容器服務了,
dockerfile中run的原理:

運行臨時的容器,運行程序中可以另開視窗,docker ps -a -l 查看,docker ps -a -l --no--trunc 查看資訊資訊,

docker 容器的總結

十三、容器間的互聯和應用
docker容器間的互聯
容器間互聯的方法:--link 單方向的
docker run -d --name oldboy httpd:latest
docker run -it --link oldboy:web01 centos:6.8
測驗:
curl oldboy
curl web01
原理:
cat /etc/hosts
========
[root@docker-01 kop]# docker run -d --name oldboy httpd:latest
[root@docker-01 kop]# docker run -it --link oldboy:web01 centos:6.9
[root@docker-01 ~]# docker inspect oldboy
[root@006f2289cc04 /]# curl -I 172.17.0.3
[root@006f2289cc04 /]# curl -I oldboy
[root@006f2289cc04 /]# cat /etc/hosts
172.17.0.3 web01 5f2c3eab08d8 oldboy
172.17.0.4 006f2289cc04
[root@006f2289cc04 /]#
容器間互聯的應用(zabbix安裝實體)
docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin
docker run --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest
docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--link mysql-server:mysql \
--link zabbix-java-gateway:zabbix-java-gateway \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
配置監控的docker02主機:
[root@docker-02 ~]# rpm -qa | grep docker
docker-ce-19.03.5-3.el7.x86_64
docker-ce-cli-19.03.5-3.el7.x86_64
[root@docker-02 ~]# rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.5/rhel/7/x86_64/zabbix-agent-5.0.0-0.4alpha4.el7.x86_64.rpm
[root@docker-02 ~]# vim /etc/zabbix/zabbix_agentd.conf
修改:server=10.0.0.11
[root@docker-02 ~]# systemctl restart zabbix-agent.service
打開網頁監控docker02
十四、docker私有倉庫registry
運行docker私有倉庫
運行docker私有倉庫:
docker run -d -p 5000:5000 --restart=always -v /opt/myregistry:/var/lib/registry registry
當容器啟動完成,私有倉庫就可以使用了
上傳鏡像到私有倉庫
上傳到私有倉庫的步驟:
a:給要上傳的鏡像打tag
10.0.0.12:5000/httpd:latest (手動給它打tag)
b:上傳
docker push 10.0.0.12:5000/httpd:latest
報錯解決方法:
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.12:5000"]
}
systemctl restart docker
帶base認證的私有倉庫
a:base認證密碼檔案準備
yum install httpd-tools -y
mkdir /opt/registry-var/auth/ -p
htpasswd -Bbn oldboy 123456 >> /opt/registry-var/auth/htpasswd
b:啟動docker私有倉庫
docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry
十五、容器編排docker-compose
安裝docker-compose
安裝:
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install -y python2-pip
pip install docker-compose
或者pip install -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose
檢查是否安裝成功
docker-compose -v
===============================
[root@docker-01 opt]# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 617 0 617 0 0 510 0 --:--:-- 0:00:01 --:--:-- 511
0 15.4M 100 15.4M 0 0 191k 0 0:01:22 0:01:22 --:--:-- 201k
▽root@docker-01 opt]# chmod +x /usr/local/bin/docker-compose
[root@docker-01 opt]# docker-compose -v
docker-compose version 1.24.1, build 4667896b
[root@docker-01 mywordpress]# vim docker-compose.yml
vi docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- web_data:/var/www/html
ports:
- "80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
web_data:
==================
[root@docker-01 mywordpress]# docker-compose up
[root@docker-01 mywordpress]# docker-compose up -d
[root@docker-01 mywordpress]# docker-compose scale wordpress=3(啟動3個容器)
[root@docker-01 mywordpress]# docker ps
nginx安裝
啟動的3個容器對外提供一個服務:配置nginx反向代理:
[root@docker-02 repositories]# sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@docker-02 repositories]# sudo yum install -y nginx
組態檔:
涉及配置:upstream,location
[root@docker-02 nginx]# cat nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream wordpress {
server 10.0.0.11:32769;
server 10.0.0.11:32770;
server 10.0.0.11:32771;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://wordpress;
proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
[root@docker-02 nginx]#
[root@docker-02 nginx]# systemctl start nginx
在目錄下配置測驗檔案
[root@docker-01 _data]# pwd
/var/lib/docker/volumes/mywordpress_web_data/_data
[root@docker-01 _data]# cat info.php
<?php phpinfo(); ?>
[root@docker-01 _data]#
不停重繪頁面發現地址代理地址不同:
http://10.0.0.12/info.php
restart: always---每次重啟docker服務,這個容器也會重啟
docker volume ls
docker network ls
十六、容器的四種網路型別
None:不為容器配置任何網路功能,--net=none
Container:與另一個運行中的容器共享Network Namespace,--net=container:containerID
Host:與主機共享Network Namespace,--net=host
Bridge:Docker設計的NAT網路模型(默認)
[root@docker-01 _data]# docker run -it --network none busybox:latest
檢查網路型別:
docker ps -a -l
docker inspect competent_lewin
----
[root@docker-01 _data]# docker run -d httpd:latest
dbf395b9b91dbc83fdf16535d686a2e3172520022fe9142edbef0461ea11f53c
[root@docker-01 _data]# docker run -it --network container:charming_antonelli 10.0.0.12:5000/centos:6.8 ([root@docker-01 ~]# docker ps -a -l
查出name)
[root@dbf395b9b91d /]# netstat -lntp
[root@docker-01 ~]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f09de4357455 10.0.0.12:5000/centos:6.8 "/bin/bash" About a minute ago Up About a minute charming_feynman
[root@docker-01 ~]# docker inspect f09de4357455
network為空,
host:
[root@docker-01 _data]# docker run -it --network host 10.0.0.12:5000/centos:6.8
[root@docker-01 ~]# docker inspect (網路型別為host)
[root@docker-01 /]# ifconfig
跟宿主機共用,
十七、跨主機通信之macvlan
macvlan定義:
macvlan 本身是 linux kernel 模塊,其功能是允許在同一個物理網卡上配置多個 MAC 地址,即多個 interface,每個 interface 可以配置自己的 IP,
macvlan 本質上是一種網卡虛擬化技術
使用macvlan實作容器跨主機通信:
創建macvlan:(兩臺主機都需要)
docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
測驗:
docker01:
docker run -it --network macvlan_1 --ip=10.0.0.111 busybox:latest /bin/sh
ping 10.0.0.112
docker02:
docker run -it --network macvlan_1 --ip=10.0.0.112 busybox:latest /bin/sh
ping 10.0.0.111
[root@docker-01 _data]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
41476f94745165b43591760a9fe4541d0bf13d1c3498f84bd4daa8aa14fafe0f
[root@docker-01 _data]# docker network ls
NETWORK ID NAME DRIVER SCOPE
e3f7c473d255 bridge bridge local
ed8ed81588ce host host local
41476f947451 macvlan_1 macvlan local
e8e53247c464 mywordpress_default bridge local
e6e9a262ab5f none null local
[root@docker-01 _data]# docker run -it --network macvlan_1 --ip=10.0.0.111 busybox:latest /bin/sh
[root@docker-02 nginx]# docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
2644c26dbacfe64add4eba8a792fcaee04384d08255918590367569fe5058cd9
[root@docker-02 nginx]#
[root@docker-02 nginx]# docker network ls
NETWORK ID NAME DRIVER SCOPE
e60a56edfd03 bridge bridge local
85abdf640cbc host host local
2644c26dbacf macvlan_1 macvlan local
daa49e0aaede none null local
[root@docker-02 nginx]# docker run -it --network macvlan_1 --ip=10.0.0.112 busybox:latest /bin/sh
開啟混雜模式:
[root@docker-01 _data]# ip link set eth0 promisc on
[root@docker-01 _data]# ip link show eth0
相互可以ping通,
十八、跨主機容器間通信之overlay
1)準備作業
docker03上:
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
docker01、02上:
vim /etc/docker/daemon.json
{
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.11:2376",(本機地址)
"insecure-registries": ["10.0.0.11:5000"]
}
修改內容:
vi /usr/lib/systemd/sytem/docker.serveice
ExecStart=/usr/bin/dockerd
systemctl daemon-reload
systemctl restart docker
2)創建overlay網路
docker network create -d overlay ol1
3)啟動容器測驗
docker run -it --network ol1 --name oldboy02 busybox:latest /bin/sh
docker run -it --network ol1 --name oldboy01 busybox:latest /bin/sh
默認vxlan的地址不要和宿主機相同,docker network create -d overlay--subnet 172.16.1.0/16 ol4 執行vxlan容器的地址,
用于容器間的通信,另一塊網卡172.18.0.0/24用于外部通信,
相互可以ping通域名和ip地址,
overlay型別原理圖

十九、企業級私有倉庫harbor
harbor-offline-installer-v1.5.1.tgz
鏈接:https://pan.baidu.com/s/1Z9I7zYXSt-8ve3lFT2YCeg
提取碼:iuqj
第一步:安裝docker和docker-compose
第二步:下載harbor-offline-installer-v1.5.1.tgz
第三步:上傳到/opt,并解壓
第四步:修改harbor.cfg組態檔
hostname = 10.0.0.11
harbor_admin_password = 123456
docker rm -f `docker ps -a -q`
第五步:執行install.sh
###
./install.sh
訪問harbor:
瀏覽器中輸入:10.0.0.11
推送鏡像:
[root@docker-02 _data]# vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com",
"https://registry.docker-cn.com"
],
"insecure-registries": ["10.0.0.12:5000"],
"insecure-registries": ["10.0.0.11"]
[root@docker-02 _data]# systemctl restart docker
先登錄:(admin,123456)
docker login 10.0.0.11
[root@docker-02 kop]# docker images
[root@docker-02 kop]# docker image tag busybox:latest 10.0.0.11/library/busybox:latest(library專案名稱)
[root@docker-02 kop]# docker images
[root@docker-02 kop]# docker push 10.0.0.11/library/busybox:latest
登錄web頁面檢查,是否推送成功,
下載鏡像:
修改下載主機的信任資訊:
[root@docker-02 _data]# vim /etc/docker/daemon.json
"insecure-registries": ["10.0.0.11"]
[root@docker-02 _data]# systemctl restart docker
直接復制web頁面,讓后在需要主機上黏貼,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/24811.html
標籤:其他
