Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的Linux機(jī)器或Windows 機(jī)器上,也可以實(shí)現(xiàn)虛擬化,容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口怎栽。
一個(gè)完整的Docker有以下幾個(gè)部分組成:
1. Docker Client客戶端
2. Docker Daemon守護(hù)進(jìn)程
3. Docker Image鏡像
4. Docker Container容器
docker容器
1:什么是容器?
容器就是在隔離的環(huán)境中運(yùn)行的一個(gè)進(jìn)程杆故,如果進(jìn)程停止伴逸,容器就會(huì)退出蜀踏。隔離的環(huán)境擁有自己的系統(tǒng)文件撬码,ip地址儿倒,主機(jī)名等
kvm虛擬機(jī),linux呜笑,系統(tǒng)文件
程序:代碼夫否,命令
進(jìn)程:正在運(yùn)行的程序
2:容器和虛擬化的區(qū)別
linux容器技術(shù),容器虛擬化和kvm虛擬化的區(qū)別
kvm虛擬化: 需要硬件的支持叫胁,需要模擬硬件慷吊,可以運(yùn)行不同的操作系統(tǒng),啟動(dòng)時(shí)間分鐘級(jí)(開(kāi)機(jī)啟動(dòng)流程)
linux開(kāi)機(jī)啟動(dòng)流程: bios開(kāi)機(jī)硬件自檢 basic input output system 根據(jù)bios設(shè)置的優(yōu)先啟動(dòng)項(xiàng)boot 網(wǎng)卡 硬盤(pán) u盤(pán) 光驅(qū) 讀取grub(mbr)引導(dǎo) 2T UEFI(gpt分區(qū)) mbr硬盤(pán)分區(qū)信息曹抬,內(nèi)核加載路徑,加載內(nèi)核 啟動(dòng)第一個(gè)進(jìn)程/sbin/init systemd 系統(tǒng)初始化完成 運(yùn)行服務(wù)(nginx,httpd,mysql) 谤民。堰酿。。
容器啟動(dòng)流程: 共用宿主機(jī)內(nèi)核: 第一個(gè)進(jìn)程直接啟動(dòng)服務(wù)(nginx张足,httpd触创,mysql)
容器:共用宿主機(jī)內(nèi)核,輕量級(jí)为牍,損耗少哼绑,啟動(dòng)快,性能高碉咆,只能運(yùn)行在linux系統(tǒng)上
虛擬機(jī):需要硬件的支持抖韩,需要模擬硬件,需要走開(kāi)機(jī)啟動(dòng)流程疫铜,可以運(yùn)行不同的操作系統(tǒng)
3:容器技術(shù)的發(fā)展過(guò)程:
1):chroot技術(shù)茂浮,新建一個(gè)子系統(tǒng)(擁有自己完整的系統(tǒng)文件)
參考資料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/ chang root
2):linux容器(lxc) linux container(namespaces 命名空間 隔離環(huán)境 及cgroups 進(jìn)程資源限制)
cgroups 限制一個(gè)進(jìn)程能夠使用的資源。cpu壳咕,內(nèi)存席揽,硬盤(pán)io
kvm虛擬機(jī):資源限制(1c 1G 20G)
需要使用epel源
yum install epel-release -y
編譯epel源配置文件
vi /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel 7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch/debug
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/SRPMS
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
安裝lxc
yum install lxc-* -y yum install libcgroup* -y yum install bridge-utils.x86_64 -y
橋接網(wǎng)卡
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
echo 'TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=virbr0' >/etc/sysconfig/network-scripts/ifcfg-eth0
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-virbr0
echo 'TYPE=Bridge
BOOTPROTO=static
NAME=virbr0
DEVICE=virbr0
ONBOOT=yes
IPADDR=10.0.0.11
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=180.76.76.76' >/etc/sysconfig/network-scripts/ifcfg-virbr0
啟動(dòng)cgroup
systemctl start cgconfig.service
啟動(dòng)lxc
systemctl start lxc.service
創(chuàng)建lxc容器
方法1: lxc-create -t download -n centos6 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images -d centos -r 6 -a amd64
方法2: lxc-create -t centos -n test
為lxc容器設(shè)置root密碼:
[root@controller ~]# chroot /var/lib/lxc/test/rootfs passwd Changing password for user root. New password: BAD PASSWORD: it is too simplistic/systematic BAD PASSWORD: is too simple Retype new password: passwd: all authentication tokens updated successfully.
為容器指定ip和網(wǎng)關(guān)
vi /var/lib/lxc/centos7/config
lxc.network.name = eth0
lxc.network.ipv4 = 10.0.0.111/24
lxc.network.ipv4.gateway = 10.0.0.254
啟動(dòng)容器
lxc-start -n centos7
3):docker容器
centos7.6 2G 10.0.0.11 docker01 host解析
centos7.6 2G 10.0.0.12 docker02 host解析
Docker是通過(guò)進(jìn)程虛擬化技術(shù)(namespaces及cgroups cpu、內(nèi)存谓厘、磁盤(pán)io等)來(lái)提供容器的資源隔離與安全保障等幌羞。由于Docker通過(guò)操作系統(tǒng)層的虛擬化實(shí)現(xiàn)隔離,所以Docker容器在運(yùn)行時(shí)竟稳,不需要類似虛擬機(jī)(VM)額外的操作系統(tǒng)開(kāi)銷属桦,提高資源利用率。 namespace 資源隔離 cgroups 進(jìn)程的資源限制 kvm 虛擬磁盤(pán)文件住练,資源隔離 kvm 資源限制地啰,--cpus --memory
docker 初期把lxc二次開(kāi)發(fā),libcontainer
4:docker的安裝
10.0.0.11:修改主機(jī)名和host解析
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/docker-ce.repo https://mirrors.ustc.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
yum install docker-ce -y
5:docker的主要組成部分
docker是傳統(tǒng)的CS架構(gòu)分為docker client和docker server,像mysql一樣
命令:docker version
[root@controller ~]# docker version Client: Version: 17.12.0-ce API version: 1.35 Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:10:14 2017 OS/Arch: linux/amd64
Server: Engine: Version: 17.12.0-ce API version: 1.35 (minimum version 1.12) Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:12:46 2017 OS/Arch: linux/amd64 Experimental: false
docker主要組件有:鏡像讲逛、容器亏吝、倉(cāng)庫(kù), 網(wǎng)絡(luò),存儲(chǔ)
啟動(dòng)容器必須需要一個(gè)鏡像盏混,倉(cāng)庫(kù)存儲(chǔ)鏡像 容器---鏡像---倉(cāng)庫(kù)
6:?jiǎn)?dòng)第一個(gè)容器
docker的主要目標(biāo)是"Build,Ship and Run any App,Angwhere",構(gòu)建蔚鸥,運(yùn)輸,處處運(yùn)行 部署服務(wù)许赃,環(huán)境問(wèn)題
一次構(gòu)建止喷,處處運(yùn)行
docker是一種軟件的打包技術(shù)
docker初次體驗(yàn):
安裝Nginx步驟:
官網(wǎng)下載Nginx源碼包wget
tar 創(chuàng)建Nginx用戶
編譯安裝 ./config.... 修改配置文件, 啟動(dòng)
配置docker鏡像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
docker run -d -p 80:80 nginx
run(創(chuàng)建并啟動(dòng)一個(gè)容器)
-d 放在后臺(tái)
-p 端口映射
nginx docker鏡像的名字
7:docker的鏡像管理
搜索鏡像? docker search 選鏡像的建議:
1混聊,優(yōu)先考慮官方
2弹谁,stars數(shù)量多
官方鏡像倉(cāng)庫(kù)地址:hub.docker.com
獲取鏡像? docker pull(push)?
鏡像加速器:
阿里云加速器,
daocloud加速器,
中科大加速器预愤,
Docker 中國(guó)官方鏡像加速:https://registry.docker-cn.com?官方pull docker pull centos:6.8(沒(méi)有指定版本沟于,默認(rèn)會(huì)下載最新版)
私有倉(cāng)庫(kù)pull docker pull daocloud.io/huangzhichong/alpine-cn:latest
配置docker鏡像加速
vi /etc/docker/daemon.json { "registry-mirrors": ["[https://registry.docker-cn.com](https://registry.docker-cn.com)"] }?
查看鏡像列表?
docker images or docker image ls
刪除鏡像? docker rmi
例子:docker image rm centos:latest
導(dǎo)出鏡像? docker save
例子:docker image save centos -o docker-centos7.4.tar.gz
導(dǎo)入鏡像? docker load
例子:docker image load -i docker-centos7.4.tar.gz?
8:docker的容器管理
docker run -d -p 80:80 nginx:latest
run(創(chuàng)建并運(yùn)行一個(gè)容器)
-d 放在后臺(tái)
-p 端口映射
-v 源地址(宿主機(jī)):目標(biāo)地址(容器)
nginx docker鏡像的名字
docker run -it --name centos6 centos:6.9 /bin/bash
-it 分配交互式的終端interactive tty
--name 指定容器的名字
/bin/sh覆蓋容器的初始命令
運(yùn)行容器
docker run image_name
docker run ==== docker create + docker start
啟動(dòng)容器
docker start
停止容器
docker stop CONTAINER_ID
殺死容器
docker kill container_name
查看容器列表
docker ps(-a -l -q)
進(jìn)入正在運(yùn)行的容器(目的,調(diào)試植康,排錯(cuò))
docker exec (會(huì)分配一個(gè)新的終端tty)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh)
docker attach(使用同一個(gè)終端) 偷偷離開(kāi)的快捷鍵ctrl+p,ctrl+q
docker attach [OPTIONS] CONTAINER
nsenter(安裝yum install -y util-linux 棄用)
?刪除容器
docker rm
批量刪除容器
docker rm -f `docker ps -a -q`
總結(jié):docker容器內(nèi)的第一個(gè)進(jìn)程(初始命令)必須一直處于前臺(tái)運(yùn)行的狀態(tài)(必須夯卓跆),否則這個(gè)容器销睁,就會(huì)處于退出狀態(tài)供璧!
業(yè)務(wù)在容器中運(yùn)行:
初始命令一定要夯住并且啟動(dòng)服務(wù)
nginx -g 'daemon off;'
/usr/sbin/zabbix_agentd -f -c /etc/zabbix/zabbix_agentd.conf
9:docker容器的網(wǎng)絡(luò)訪問(wèn)(端口映射)
指定映射(docker 會(huì)自動(dòng)添加一條iptables規(guī)則來(lái)實(shí)現(xiàn)端口映射)? -p hostPort:containerPort? -p ip:hostPort:containerPort 多個(gè)容器都想使用80端口? -p ip::containerPort(隨機(jī)端口)? -p hostPort:containerPort/udp? -p 10.0.0.100::53/udp 使用宿主機(jī)的10.0.0.100這個(gè)ip地址的隨機(jī)端口的udp協(xié)議映射容器的udp53端口? -p 81:80 –p 443:443 可以指定多個(gè)-p
隨機(jī)映射? docker run -P (隨機(jī)端口)
通過(guò)iptables來(lái)實(shí)現(xiàn)的端口映射
10:docker的數(shù)據(jù)卷管理
nginx 站點(diǎn) /usr/share/nginx/html
-v /opt/xiaoniao:/usr/share/nginx/html
持久化 數(shù)據(jù)卷
(文件或目錄)? -v 卷名:/data (第一次卷是空,會(huì)容器的數(shù)據(jù)復(fù)制到卷中,如果卷里面有數(shù)據(jù),把卷數(shù)據(jù)的掛載到容器中)? -v src
(宿主機(jī)的目錄):dst(容器的目錄) 數(shù)據(jù)卷容器? --volumes-from(跟某一個(gè)已經(jīng)存在的容器掛載相同的卷)?
基于nginx啟動(dòng)一個(gè)容器,監(jiān)聽(tīng)80和81冻记,訪問(wèn)80睡毒,出現(xiàn)nginx默認(rèn)歡迎首頁(yè),訪問(wèn)81檩赢,出現(xiàn)小鳥(niǎo)吕嘀。
-p 80:80 -p 81:81 -v xxx:xxx -v xxx:xxxx 基于nginx多端口的多站點(diǎn)。
11:手動(dòng)將容器保存為鏡像
docker commit 容器id或者容器的名字 新的鏡像名字[:版本號(hào)可選]
1):基于容器制作鏡像
docker run -it -p 80:80 centos:6.9
####
echo "192.168.37.200 mirrors.aliyun.com" >>/etc/hosts
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install nginx -y
yum install unzip -y
cd /usr/share/nginx/html/
rm -fr *
curl -o yiliao.zip http://192.168.37.200/191127/everyxiaoqiang-yiliao-master.zip
unzip yiliao.zip
mv yiliao/* .
####
2)把安裝好服務(wù)的容器,提交成鏡像
docker commit 9f366f3988cd yiliao:v1
3)測(cè)試鏡像功能是否可用
docker run -d -p 81:80 yiliao:v1 nginx -g 'daemon off;'
手動(dòng)制作的鏡像贞瞒,傳輸時(shí)間長(zhǎng) 鏡像初始命令
制作一個(gè)kodexplorer網(wǎng)盤(pán)docker鏡像偶房。nginx + php-fpm(httpd + php)
內(nèi)容總結(jié)
1.什么是容器
容器就是在隔離的環(huán)境中運(yùn)行的一個(gè)進(jìn)程.如果進(jìn)程結(jié)束,容器退出. 這個(gè)隔離的環(huán)境,有自己的系統(tǒng)文件,ip地址,主機(jī)名,進(jìn)程管理
2:容器和虛擬機(jī)的區(qū)別
容器: 不依賴硬件cpu支持共用宿主機(jī)內(nèi)核,輕量級(jí),啟動(dòng)快,性能高,損壞少
虛擬化: 依賴硬件cpu支持,擁有自己的內(nèi)核,
docker用的多: 節(jié)省成本
3:docker-ce的安裝
centos base源 docker engine 1.13
docker.repo
yum install docker-ce 17.03 1903
4:docker主要內(nèi)容
容器 鏡像 倉(cāng)庫(kù) 網(wǎng)絡(luò) 存儲(chǔ) 監(jiān)控
5:docker鏡像常用命令
docker image:
docker image ls 查看鏡像列表
docker image rm 刪除鏡像
docker image load 導(dǎo)入鏡像
docker image save 導(dǎo)出鏡像
docker image pull 下載鏡像(拉取鏡像)
docker image push 上傳鏡像
6:docker容器的常用命令
docker run 創(chuàng)建并啟動(dòng)容器
docker kill 強(qiáng)制關(guān)閉容器
docker rm 刪除容器
docker ps 查看容器列表
docker start 啟動(dòng)容器
docker stop 關(guān)閉容器
docker restart 重啟容器
docker exec 進(jìn)入正在運(yùn)行的容器(分配一個(gè)新的端口)(排查錯(cuò)誤)
docker attach 進(jìn)入正在運(yùn)行的容器(同一個(gè)終端)
docker logs 查看容器的終端輸出(排查錯(cuò)誤)
7:docker端口映射
docker run -p
宿主機(jī)端口:容器端口 最常見(jiàn)
ip1:宿主機(jī)端口:容器端口 ip2:宿主機(jī)端口:容器端口
ip1::容器端口 隨機(jī)端口
ip1::容器端口/udp
-p 宿主機(jī)端口1:容器端口1 -p 宿主機(jī)端口2:容器端口2
docker run -P 自動(dòng)隨機(jī)端口映射
8:docker數(shù)據(jù)卷
docker run -v 宿主機(jī)目錄:容器目錄 -v 宿主機(jī)文件:容器文件
9:手動(dòng)制作鏡像
a:啟動(dòng)一個(gè)基礎(chǔ)容器,在容器安裝自己的服務(wù)
b:把安裝好服務(wù)的容器提交為鏡像
c:測(cè)試鏡像是否可用