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)流程)
1.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) 癣缅。友存。屡立。
2.容器啟動(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
實(shí)戰(zhàn)1:使用chroot監(jiān)獄限制SSH用戶訪問(wèn)指定目錄和使用指定命令(cp,ls) https://linux.cn/article-8313-1.html ldd /bin/ls
### 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/*
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
安裝docker-ce
yum install docker-ce -y
5.docker的主要組成部分
docker是傳統(tǒng)的CS架構(gòu)分為docker client和docker server,和mysql一樣
查看docker版本:
docker version
docker主要組件有:鏡像、容器入撒、倉(cāng)庫(kù), 網(wǎng)絡(luò)献雅,存儲(chǔ)
啟動(dòng)容器必須需要一個(gè)鏡像锌仅,倉(cāng)庫(kù)存儲(chǔ)鏡像 容器--->鏡像--->倉(cāng)庫(kù)
6.啟動(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 images or docker image ls
刪除鏡像
docker rmi 例子:docker image rm centos:latest
導(dǎo)出鏡像
docker save 例子:docker image save centos:latest -o docker-centos7.4.tar.gz
導(dǎo)入鏡像
docker load 例子:docker image load -i docker-centos7.4.tar.gz
docker search php 在官方倉(cāng)庫(kù)中查詢鏡像
docker pull nginx 拉取鏡像
docker image ls 查看所有鏡像
docker images
docker image import docker_centos6.9.tar.gz 導(dǎo)入鏡像但不帶鏡像名稱和版本號(hào)
docker image load -i docker_alpine3.9.tar.gz 導(dǎo)入鏡像
docker image save nginx:latest -o /tmp/docker_nginx.tar.gz 導(dǎo)出鏡像
docker image rm busybox:latest 刪除鏡像
docker rmi
docker image history nginx 查看鏡像歷史
docker image tag a19653214294 centos:6.9 給鏡像設(shè)定名稱版本號(hào)
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
刪除容器
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
docker create centos:6.9 創(chuàng)建一個(gè)容器
docker start 4a0ab8445501 啟動(dòng)容器
docker stop 4a0ab8445501 停止一個(gè)容器
docker restart 20da4e87d10f 重啟一個(gè)容器
docker ps:查看容器,默認(rèn)查看正在運(yùn)行的
-a:查看所有容器
-l:查看最新的容器
-q: 查看所有容器的id
docker run -d nginx:latest:創(chuàng)建運(yùn)行一個(gè)容器相當(dāng)于 create+start
-d:將程序放在后臺(tái)執(zhí)行
-p:指定映射端口
-v:指定將宿主機(jī)文件掛載到容器中的指定文件
docker rm b3d15ddb5f97 刪除一個(gè)容器[id]
-f:強(qiáng)制刪除
docker rm -f `docker ps -a -q` 批量刪除
docker kill 20da4e87d10f 殺死一個(gè)容器
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh) 進(jìn)入正在運(yùn)行的容器
docker attach(使用同一個(gè)終端) 偷偷離開(kāi)的快捷鍵ctrl+p,ctrl+q
docker exec -it heuristic_buck /bin/bash 開(kāi)啟一個(gè)新的會(huì)話窗口并進(jìn)入一個(gè)容器
docker attach 20da4e87d10f 使用同一個(gè)會(huì)話窗口并進(jìn)入容器
docker rename heuristic_buck yiliao 修改容器的名稱
docker logs yiliao 查看容器的終端輸出(日志)
docker cp 容器:宿主機(jī)
docker diff 比對(duì)容器修改的操作
docker export ID 導(dǎo)出容器
docker import ID 導(dǎo)入容器
9.docker容器的網(wǎng)絡(luò)訪問(wèn)(端口映射)
docker默認(rèn)使用nat網(wǎng)絡(luò)劫乱,使用命令-p指定,docker會(huì)自動(dòng)添加iptables規(guī)則實(shí)現(xiàn)端口映射
映射80端口到容器的80端口—81到81:
docker run -d -p 80:80 -p 81:81 nginx:latest多容器使用80端口
添加IP地址:
ifconfig eth0:0 10.0.0.12 up
ifconfig eth0:1 10.0.0.13 up
映射:
docker run -d -p 10.0.0.11:80:80 nginx:latest
docker run -d -p 10.0.0.12:80:80 nginx:latest
docker run -d -p 10.0.0.13:80:80 nginx:latest
- 隨機(jī)端口映射
隨機(jī)端口映射到容器的80
docker run -d -p ::80 nginx:latest
docker run -d -P nginx:latest
隨機(jī)端口映射udp
docker run -d -p ::80/udp nginx:latest
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)。
1. 將本地文件或目錄掛載到容器的文件或目錄中:
docker run -d -p 80:80 -p 81:81 -v /code/default.conf:/etc/nginx/conf.d/default.conf -v /code:/usr/share/nginx/html nginx:latest
2. 創(chuàng)建卷:
docker run -d -p 80:80 -v test:/usr/share/nginx/html nginx:latest
docker volume ls 查看卷
11.手動(dòng)將容器保存為鏡像
docker run -d centos:6.9 tail -f /etc/hosts
2. 進(jìn)入容器創(chuàng)建環(huán)境
docker exec -it 88711c979d1b /bin/bash
3. 創(chuàng)建完環(huán)境后,回到宿主機(jī)提交鏡像
docker commit 88711c979d1b yiliao:v2
4. 導(dǎo)出鏡像
docker save yiliao:v2 -o docker_yiliao_v2
=============================================================================================
#1.基于c6手動(dòng)制作httpd服務(wù)的鏡像
=============================================================================================
1):基于容器制作鏡像
docker run -it centos:6.9
yum install httpd
yum install openssh-server
/etc/init.d/sshd start
vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
chmod +x /init.sh
2)將容器提交為鏡像
docker commit 容器id或者容器的名字 新的鏡像名字[:版本號(hào)可選]
docker commit oldboy centos6-ssh-httpd:v1
3)測(cè)試鏡像功能是否可用
手動(dòng)制作的鏡像拜马,傳輸時(shí)間長(zhǎng) 鏡像初始命令
=============================================================================================
#2.基于c6手動(dòng)制作Nginx服務(wù)的鏡像
=============================================================================================
1:啟動(dòng)一個(gè)基礎(chǔ)容器,安裝服務(wù)(部署項(xiàng)目)
docker run -it -p 80:80 centos:6.9
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;'
==========================================================
#3.基于alpine手動(dòng)制作Nginx+PHP服務(wù)的鏡像
==========================================================
1:啟動(dòng)一個(gè)基礎(chǔ)容器,安裝服務(wù)(部署項(xiàng)目)
[root@docker01 ~]# docker run -it -p 80:80 alpine:latest
sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
apk update
apk add nginx php7-intl php7-openssl php7-pdo_mysql php7-common php7-fpm php7-mysqlnd
php7-mbstring php7-opcache php7-session php7-gd php7-json php7 php7-iconv php7-curl php7-pecl-igbinary php7-pecl-memcached php7-pdo php7-mysqli
1.1啟動(dòng)服務(wù)
/ # nginx
/ # nginx: [emerg] open() "/run/nginx/nginx.pid" failed (2: No such file or directory)
^C
/ # mkdir /run/nginx
/ # nginx
/ # php-fpm7
1.2測(cè)試服務(wù)是否正常
alpine它雖小,處處有坑,nginx默認(rèn)直接返回404蝉衣,需要手動(dòng)修改默認(rèn)配置文件病毡,location匹配index.html
2:把安裝好服務(wù)的容器,提交成鏡像
[root@docker01 ~]# docker commit dfe68e561586 alpine_lnp:v3.0
3.測(cè)試,剛才提交的鏡像
docker run -d -p 80:80 alpine_lnp:v3.0 nginx -g 'daemon off;'
=============================================================================================
#4.基于c6制作一個(gè)kodexplorer網(wǎng)盤(pán)docker鏡像。nginx + php-fpm(httpd + php)
=============================================================================================
1:啟動(dòng)一個(gè)基礎(chǔ)容器,安裝服務(wù)(部署項(xiàng)目)
docker run -it -p 80:80 centos:6.9
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 php-fpm php-gd php-mbstring unzip -y
[root@2c51e83b2c31 conf.d]# cat kdy.conf
server {
listen 80;
server_name kdy.cheng.com;
root /code;
location / {
index index.php index.html index.htm;
}
location ~\.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
上傳可道云代碼文件并解壓至code目錄--->前邊需要提前創(chuàng)建code目錄---->修改權(quán)限為nginx
編寫(xiě)服務(wù)啟動(dòng)腳本:
[root@2c51e83b2c31 ~]# cat /init.sh
#!/usr/bin/bash
service php-fpm start
nginx -g 'daemon off;'
2:把安裝好服務(wù)的容器,提交成鏡像
docker commit 9f366f3988cd kdy:v1
3:測(cè)試,剛才提交的鏡像
docker run -d -p 81:80 kdy:v1 /bin/bash /init.sh
12.dockerfile自動(dòng)構(gòu)建docker鏡像
類似ansible劇本屁柏,大小幾kb 手動(dòng)做鏡像:大小幾百M(fèi)+
dockerfile 支持自定義容器的初始命令
docker images -a:顯示所有鏡像八拱,包括失敗的鏡像
docker image prune:清除失敗的鏡像緩存
docker image prune -a:清除所有未被容器使用的鏡像匕荸;極度危險(xiǎn)A垢ぁE迥ā叼风!
dockerfile主要組成部分:
基礎(chǔ)鏡像信息 FROM centos:6.9
制作鏡像操作指令 RUN yum install openssh-server -y
容器啟動(dòng)時(shí)執(zhí)行初始命令 CMD ["/bin/bash"] dockerfile常用指令:
FROM 指定基礎(chǔ)鏡像
RUN 在執(zhí)行的命令前加上即可
CMD 運(yùn)行鏡像時(shí),默認(rèn)執(zhí)行的命令(容易被替換)
ADD 宿主機(jī)的文件添加到到容器中棍苹,tar包可自動(dòng)解壓 ///////////可自動(dòng)解壓tar包
MAINTAINER 指定維護(hù)者信息
LABEL 描述无宿,標(biāo)簽
WORKDIR 指定工作目錄,設(shè)定后枢里,進(jìn)入容器默認(rèn)是在這個(gè)目錄下
VOLUME 設(shè)置卷孽鸡,使用卷可以將容器中的目錄內(nèi)容持久化,卷路徑在/var/lib/docker/volumes/栏豺;寫(xiě)絕對(duì)路徑可以掛載宿主機(jī)目錄至容器目錄
docker run --volume /opt/h5:/usr/share/nginx/html -d c6_nginx:v2.0
EXPOSE 可指定容器開(kāi)放的端口彬碱,可啟動(dòng)容器時(shí)隨機(jī)端口掛載到開(kāi)放的端口
COPY 復(fù)制宿主機(jī)的文件到容器中
ENV 可設(shè)定環(huán)境變量(密碼信息等),設(shè)定的變量可以在dockerfile中引用冰悠,而且會(huì)繼承到容器中
ENTRYPOINT 容器啟動(dòng)執(zhí)行的命令堡妒,無(wú)法被替換,寫(xiě)在啟動(dòng)命令位置的字符串會(huì)被當(dāng)成命令的參數(shù)
=========================================================================
使用dockerfile自動(dòng)構(gòu)建鏡像:
1.手動(dòng)制作docker鏡像溉卓,保留歷史命令
2.根據(jù)歷史命令編寫(xiě)dockerfile
3.構(gòu)建docker鏡像
4.測(cè)試docker鏡像
==========================================================================
實(shí)戰(zhàn)一:基于c6編寫(xiě)dockerfile構(gòu)建Nginx服務(wù)
==========================================================================
[root@docker01 nginx]# cat dockerfile
FROM centos:6.9
RUN rm -rf /etc/yum.repos.d/* && \
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
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
docker build -t c6_nginx:v2.0 .
docker run -d -p 82:80 c6_nginx:v2.0
==========================================================================
實(shí)戰(zhàn)二:基于alpine編寫(xiě)dockerfile構(gòu)建Nginx服務(wù)
==========================================================================
FROM alpine:3.9
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories && \
apk update && \
apk add nginx && \
mkdir -p /run/nginx/
CMD ["nginx","-g","daemon off;"]
==========================================================================
實(shí)戰(zhàn)三:基于alpine編寫(xiě)dockerfile部署可道云項(xiàng)目
==========================================================================
FROM alpine:3.9
MAINTAINER YMC
LABEL maintainer="alpine nginx"
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories && \
apk update && \
apk add nginx php7-intl php7-openssl php7-pdo_mysql php7-common php7-fpm php7-mysqlnd php7-mbstring php7-opcache php7-session php7-gd php7-json php7 php7-iconv php7-curl php7-pecl-igbinary php7-pecl-memcached php7-pdo php7-mysqli
WORKDIR /code
ADD www.conf /etc/php7/php-fpm.d/www.conf
ADD default.conf /etc/nginx/conf.d/default.conf
ADD code /code
ADD init.sh /init.sh
EXPOSE 80/tcp
RUN mkdir -p /run/nginx
RUN chown -R nginx:nginx /code
ENTRYPOINT ["/bin/sh","/init.sh"]
實(shí)戰(zhàn)四:自己制作一個(gè)alpine系統(tǒng)鏡像[前提是前往清華源下載系統(tǒng)文件]
[root@docker01 alpine]# cat dockerfile
FROM scratch
ADD alpine.tar.gz /
CMD ["/bin/sh"]
實(shí)戰(zhàn)五:基于c7安裝sshd服務(wù),指定端口可ssh連接
[root@docker01 c7]# cat dockerfile
FROM centos:7
ENV version 7.4p1
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
yum install initscripts openssh-server-$version -y && \
/usr/sbin/sshd-keygen
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
[root@docker01 c7]# cat init.sh
#!/usr/bin/bash
echo $1 |passwd --stdin root
/usr/sbin/sshd -D
[root@docker01 c7]# docker build -t c7_ssh:v1.0 .
[root@docker01 c7]# docker run -d -p 1024:22 c7_ssh:v1.0 /bin/bash /init.sh 1qaz2wsx
實(shí)戰(zhàn)六:ENTRYPOINT應(yīng)用:
[root@docker01 c7]# cat dockerfile
FROM centos:7
ENV version 7.4p1
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
yum install initscripts openssh-server-$version -y && \
/usr/sbin/sshd-keygen
ADD init.sh /init.sh
ENTRYPOINT ["/bin/bash","/init.sh"]
[root@docker01 c7]# docker build -t c7_ssh:v2.0 .
[root@docker01 c7]# docker run -d -p 1025:22 c7_ssh:v2.0 fsgssghs //傳入的參數(shù)不會(huì)覆蓋搬泥,反而成為命令的參數(shù)
ssh root@10.0.0.11 1025 //本地通過(guò)1025連接測(cè)試桑寨;密碼fsgssghs
13.docker鏡像的分層(kvm 鏈接克隆,寫(xiě)時(shí)復(fù)制的特性)
鏡像分層的好處:復(fù)用,節(jié)省磁盤(pán)空間忿檩,相同的內(nèi)容只需加載一份到內(nèi)存尉尾。 修改dockerfile之后,再次構(gòu)建速度快
dockerfile 優(yōu)化:
1:盡可能選擇體積小linux發(fā)行版燥透,alpine
2:盡可能合并RUN指令沙咏,清理無(wú)用的文件(yum緩存,源碼包)
3:修改dockerfile班套,把變化的內(nèi)容盡可能放在dockerfile結(jié)尾
4:使用.dockerignore肢藐,減少不必要的文件ADD . /html
14.容器間的互聯(lián)(–link 是單方向的!Vň隆_罕)
使用docker 10秒快速部署企業(yè)zabbix-server
for i in `ls *`; do docker load -i $i; done
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
15.docker registry(私有倉(cāng)庫(kù))
1.啟動(dòng)容器:
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
2.上傳鏡像到私有倉(cāng)庫(kù):
a:給鏡像打標(biāo)簽 docker tag centos6-sshd:v3 10.0.0.11:5000/centos6-sshd:v3
b:上傳鏡像 docker push 10.0.0.11:5000/centos6-sshd:v3
如果遇到報(bào)錯(cuò): The push refers to repository [10.0.0.11:5000/centos6.9_ssh] Get https://10.0.0.11:5000/v2/: http: server gave HTTP response to HTTPS client
解決方法:
[root@docker01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
docker01===》啟動(dòng)registry容器---->
[root@docker01 opt]# rm -rf /opt/myregistry/ 清理緩存
docker02===》push鏡像到docker01--->前提需要配置/etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
docker02清理緩存
systemctl stop docker
[root@docker02 docker]# rm -rf /var/lib/docker/*
systemctl restart docker
從內(nèi)網(wǎng)pull鏡像
[root@docker02 ~]# docker pull 10.0.0.11:5000/centos:6.9
16.docker-compose(單機(jī)版的容器編排工具)
安裝:
yum install -y docker-compose(需要epel源)
===============================
1.wordpress 單機(jī)版docker-compose
===============================
cd wordpress/
vi docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- /data/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:
- /data/web_data:/var/www/html
ports:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
啟動(dòng)并放置后臺(tái)
[root@docker01 wordpress]# docker-compose up -d
=======================================
2.docker-compose部署 Zabbix監(jiān)控服務(wù)
=======================================
[root@docker01 zabbix]# cat docker-compose.yml
version: '3'
services:
mysql-server:
image: mysql:5.7
restart: always
command: --character-set-server=utf8 --collation-server=utf8_bin
environment:
MYSQL_ROOT_PASSWORD: root_pwd
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_pwd
zabbix-java-gateway:
image: zabbix/zabbix-java-gateway:latest
restart: always
zabbix-server:
depends_on:
- mysql-server
- zabbix-java-gateway
image: zabbix/zabbix-server-mysql:latest
ports:
- "10051:10051"
restart: always
environment:
DB_SERVER_HOST: mysql-server
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_pwd
MYSQL_ROOT_PASSWORD: root_pwd
ZBX_JAVAGATEWAY: zabbix-java-gateway
zabbix-web:
depends_on:
- mysql-server
- zabbix-server
image: zabbix/zabbix-web-nginx-mysql:latest
ports:
- "80:80"
restart: always
environment:
DB_SERVER_HOST: mysql-server
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_pwd
MYSQL_ROOT_PASSWORD: root_pwd
啟動(dòng)
docker-compose up
后臺(tái)啟動(dòng)
docker-compose up -d
17.重啟docker服務(wù),容器全部退出的解決辦法
方法一:docker run --restart=always
方法二:"live-restore": true docker server配置文件/etc/docker/daemon.json參考 { "registry-mirrors": ["http://b7a9017d.m.daocloud.io"], "insecure-registries":["10.0.0.11:5000"], "live-restore": true }
18.Docker網(wǎng)絡(luò)類型(插件形式)
None:不為容器配置任何網(wǎng)絡(luò)功能,--net=none
Container:與另一個(gè)運(yùn)行中的容器共享Network Namespace痘煤,--net=container:containerID(K8S)
Host:與宿主機(jī)共享Network Namespace凑阶,--network=host 性能最高
Bridge:Docker設(shè)計(jì)的NAT網(wǎng)絡(luò)模型 默認(rèn)類型.
1.查看運(yùn)行的容器網(wǎng)絡(luò)信息s
[root@docker01 ~]# docker inspect e70282f6414f
docker network ls 列出容器所有網(wǎng)絡(luò)
--network=host
host 直接使用宿主機(jī)的網(wǎng)絡(luò)【ip和主機(jī)名都一樣】
docker run -it --network=none alpine:3.9 [沒(méi)有網(wǎng)卡]
2.創(chuàng)建bridge網(wǎng)絡(luò)
docker network create -d bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 oldcheng
3.基于oldcheng網(wǎng)絡(luò)啟動(dòng)一個(gè)容器,測(cè)試是否能正常上網(wǎng)
19.Docker跨主機(jī)容器之間的通信macvlan
默認(rèn)一個(gè)物理網(wǎng)卡衷快,只有一個(gè)物理mac地址宙橱,虛擬多個(gè)mac地址
## 創(chuàng)建macvlan網(wǎng)絡(luò) 【兩個(gè)節(jié)點(diǎn)都執(zhí)行】
docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
docker run -it --network macvlan_1 --ip=10.0.0.66 alpine:3.9 #docker01執(zhí)行
docker run -it --network macvlan_1 --ip=10.0.0.88 kedaoyun:v1 #docker02執(zhí)行
## 設(shè)置eth0的網(wǎng)卡為混雜模式
ip link set eth0 promisc on
## 創(chuàng)建使用macvlan網(wǎng)絡(luò)的容器
docker run -it --network macvlan_1 --ip=10.0.0.200 busybox
20.Dcoker跨主機(jī)容器通信之overlay
http://www.cnblogs.com/CloudMan6/p/7270551.html
1.docker03安裝docker consul存儲(chǔ)ip地址的分配
systemctl start docker
systemctl enable docker
[root@docker03 ~]# docker load -i docker_progrium_consul.tar.gz
2.設(shè)置容器的主機(jī)名
[root@docker03 ~]# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
3.consul:kv類型的存儲(chǔ)數(shù)據(jù)庫(kù)(key:value)
docker01、02上:
[root@docker01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.12"],
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.11:2376"
}
systemctl restart docker
[root@docker02 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.12"],
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.12:2376"
}
systemctl restart docker
2)創(chuàng)建overlay網(wǎng)絡(luò)[docker01 | docker02]
docker network create -d overlay --subnet 172.16.2.0/24 --gateway 172.16.2.254 ol1
3.查看集群網(wǎng)絡(luò)信息
docker network ls
4.啟動(dòng)容器測(cè)試
[root@docker01 ~]# docker run -it --network ol1 --name test1 busybox /bin/sh
每個(gè)容器有兩塊網(wǎng)卡,eth0實(shí)現(xiàn)容器間的通訊,eth1實(shí)現(xiàn)容器訪問(wèn)外網(wǎng)
5.登錄 http://10.0.0.13:8500/ui/#/dc1/services 查看
結(jié)果:有兩個(gè)nodes
21.docker企業(yè)級(jí)鏡像倉(cāng)庫(kù)harbor
第一步:安裝docker和docker-compose
第二步:下載harbor-offline-installer-v1.5.1.tgz
第三步:上傳到/opt,并解壓
第四步:修改harbor.yml配置文件
[root@docker02 harbor]# vim harbor.yml
hostname = 10.0.0.12 //本機(jī)的ip
harbor_admin_password = 123456
第五步:執(zhí)行install.sh
./install.sh
6.訪問(wèn):http://10.0.0.12
用戶名:admin
密碼:123456
7.docker01推送鏡像
[root@docker01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.12"]
}
systemctl restart docker
打tag標(biāo)簽--->登錄 docker login 10.0.0.12
[root@docker01 ~]# docker tag alpine:cheng 10.0.0.12/library/alpine:cheng
[root@docker01 ~]# docker push 10.0.0.12/library/alpine:cheng
8.harbor配置https:
hostname = yinwucheng.com
https:
port: 443
certificate: /opt/cert/2859604_www.yinwucheng.com.pem
private_key: /opt/cert/2859604_www.yinwucheng.com.key
9.需要重新安裝
將腳本中的load注釋--->執(zhí)行腳本./install.sh
#docker load -i ./harbor*.tar.gz
windows 做域名解析 即可登錄dashboard
pull的話需要在服務(wù)器做域名解析
10.登錄dashboard
新建項(xiàng)目--->新建倉(cāng)庫(kù)--->選擇提供者--->目標(biāo)URL:http://10.0.0.11:5000-->測(cè)試連接
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
將docker-registry遷移至harbor
配置同步規(guī)則--->目的Namespace【項(xiàng)目的名稱】--->同步---》
22.docker的監(jiān)控
docker cadvisor監(jiān)控 + prometheus + grafana
docker zabbix監(jiān)控 低級(jí)自動(dòng)發(fā)現(xiàn) 自動(dòng)創(chuàng)建監(jiān)控項(xiàng)
==========================================================================================
增加node節(jié)點(diǎn)[docker01 && docker02]
上傳docker_monitor_node.tar.gz
#啟動(dòng)node-exporter
docker run -d -p 9100:9100 -v "/:/host:ro,rslave" --name=node_exporter quay.io/prometheus/node-exporter --path.rootfs /host
#啟動(dòng)cadvisor
docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest
2.安裝普羅米修斯并配置配置yml文件
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'cadvisor'
static_configs:
- targets: ['10.0.0.11:8080','10.0.0.12:8080']
- job_name: 'node-exporter'
static_configs:
- targets: ['10.0.0.11:9100','10.0.0.12:9100']
3.啟動(dòng)普羅米修斯
[root@docker03 prometheus]# ./prometheus --config.file="prometheus.yml"
4.安裝出圖工具grafana并啟動(dòng)
[root@docker03 ~]# systemctl start grafana-server.service
[root@docker03 ~]# systemctl enable grafana-server.service
5.登錄grafana配置數(shù)據(jù)源--->導(dǎo)入監(jiān)控docker插件--->查看監(jiān)控
==================================================================================
1.編寫(xiě)腳本
[root@docker02 scripts]# cat docker_discovery.sh
#!/bin/bash
port=($(/usr/bin/docker ps -a|grep -v "CONTAINER ID"|awk '{print $NF}'))
printf '{\n'
printf '\t"data":[\n'
for key in ${!port[@]}
do
if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
printf '\t {\n'
printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"},\n"
else [[ "${key}" -eq "((${#port[@]}-1))" ]]
printf '\t {\n'
printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"}\n"
fi
done
printf '\t ]\n'
printf '}\n'
[root@docker02 ~]# cat /etc/zabbix/zabbix_agentd.d/mac_status.conf
UserParameter=net.if.mac_status[*],ifconfig $1 |awk '/ether /{print $$2}'
UserParameter=docker.discovery[*],sh /scripts/docker_discovery.sh
docker01測(cè)試:出現(xiàn)問(wèn)題
[root@docker01 zabbix]# zabbix_get -s 10.0.0.12 -k docker.discovery
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json?all=1: dial unix /var/run/docker.sock: connect: permission denied
解決問(wèn)題:
[root@docker02 scripts]# chmod u+s /usr/bin/docker
或者:chmod 777 /var/run/docker.sock
登錄zabbix-server 創(chuàng)建自動(dòng)發(fā)現(xiàn)規(guī)則:docker.discovery
監(jiān)控容器的存活狀態(tài):
[root@docker02 ~]# cat /etc/zabbix/zabbix_agentd.d/mac_status.conf
UserParameter=net.if.mac_status[*],ifconfig $1 |awk '/ether /{print $$2}'
UserParameter=docker.discovery[*],sh /scripts/docker_discovery.sh
UserParameter=docker_alive[*],/usr/bin/docker ps -a |grep $1|grep -c Up
systemctl restart zabbix-agent
基于剛才創(chuàng)建的自動(dòng)發(fā)現(xiàn)規(guī)則--->創(chuàng)建監(jiān)控項(xiàng)原型
名稱和鍵值需要用變量docker_alive[{#CONTAINERNAME}]
過(guò)濾器操作:
管理--->一般---》正則表達(dá)式---》添加正則--->配置過(guò)濾器
23.docker命令總結(jié)
- container命令
attach 不分配新終端進(jìn)入容器
create 創(chuàng)建一個(gè)新容器
export 導(dǎo)出容器為鏡像文件蘸拔,但鏡像沒(méi)有標(biāo)簽养匈,使用import可導(dǎo)入
logs 查看容器的終端輸出,可在容器秒死時(shí)查看原因
port 查看容器映射端口
restart 重啟容器
start 啟動(dòng)容器
top 查看容器中的進(jìn)程信息
wait 夯住直到容器停止都伪,然后打印容器的退出代碼
commit 提交容器為鏡像
diff 查看容器與初始鏡像的文件變化
inspect 查看容器的屬性信息
ls 查看容器列表
prune 清除沒(méi)有運(yùn)行的容器
rm 刪除容器
stats 查看容器占用資源的情況
unpause 接觸容器暫停狀態(tài)
cp 從宿主機(jī)和容器之間拷貝文件
exec 進(jìn)入容器
kill 強(qiáng)制停止容器
pause 暫停容器
rename 修改容器的名稱
run 創(chuàng)建并運(yùn)行容器
stop 停止容器
update 更新修改容器的資源限制
- image命令
build dockerfile 構(gòu)建鏡像
history 查看鏡像的歷史記錄
import 導(dǎo)入鏡像呕乎,但沒(méi)有標(biāo)簽
inspect 查看鏡像的屬性信息
load 導(dǎo)入鏡像
ls 查看鏡像列表
prune 清除失敗的鏡像緩存
pull 從官方倉(cāng)庫(kù)拉取鏡像
push 推送鏡像至官方倉(cāng)庫(kù)
rm 刪除鏡像
save 導(dǎo)出鏡像為鏡像文件
tag 修改鏡像的標(biāo)簽