1.什麼是容器
容器是隔離的環境中運行的一個進程,如果進程結束,容器就會停止,容器的隔離環境,擁有自己的ip地址,系統文件,主機名,進程管理
程序: 代碼,軟件,命令
進程:正在運行的程序
2:容器和虛擬機的區別
虛擬機: 硬件cpu支持(vt虛擬化),模擬計算硬件,走正常的開機啓動
bios開機自檢–根據bios啓動項–讀取硬盤第一個扇區grub,uefi, centos7, 加載內核,啓動系統第一個進程/sbin/init systemd
容器: 不需要硬件cpu的支持,共用宿主機內核,啓動容器的第一個進程
容器優勢: 啓動快,性能高,損耗少,輕量級
100虛擬機 100個服務 10宿主機
100容器 100個服務 6宿主機
3:docker-ce的安裝
主機名 內存 ip
docker01 2G 10.0.0.11
docker02 2G 10.0.0.12
#安裝docker-ce
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y
systemctl enable docker
systemctl start docker
#驗證
[root@docker01 yum.repos.d]# docker version
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:25:41 2019
OS/Arch: linux/amd64
Experimental: false
4:docker主要內容
docker是一個cs架構, docker主要:鏡像 容器 倉庫 網絡 存儲 監控
docker是一個軟件的打包技術.
docker run -d -p 80:80 nginx:latest
run 創建並啓動一個容器
-d 放後臺啓動
-p 端口映射
nginx:latest docker鏡像名稱
5:docker鏡像常用命令
docker search 搜索鏡像, 優先選官方,stars數量多
docker pull 拉取鏡像(下載鏡像),注意版本
docker push 推送鏡像(上傳鏡像)
docker load 導入鏡像
例子: docker load -i docker_nginx.tar.gz
docker save 導出鏡像
例子:docker save centos:7 -o docker_centos7.tar.gz
docker image ls 查看鏡像列表
docker rmi 刪除鏡像
docker tag 給鏡像打標籤
6:docker容器的常用命令
docker run 創建並啓動容器
例子:docker run -d -it -p 80:80 nginx:latest
docker create 創建容器 --name
docker start 啓動容器
docker stop 停止容器
docker restart 重啓容器
docker kill 強制停止容器
docker ps 查看容器列表 -a 查看所有容器
docker rm 刪除容器
批量刪除所有容器 docker rm -f `docker ps -a -q`
docker exec 進入正在運行的容器(分配一個新終端)
例子: docker exec -it 容器id/容器名字 /bin/bash(/bin/sh)
docker attach 進入正在運行的容器(使用相同的終端),偷偷離開的快捷鍵ctrl +p,ctrl +q
容器想要放在後臺一直運行的化,那麼容器的初始命令,必須夯住(前臺運行),否則容器就會退出.
前臺運行
nginx -g 'daemon off;'
/usr/sbin/php-fpm --nodaemonize
7:docker端口映射
docker run
-p 宿主機端口:容器端口
-p 宿主機ip1:宿主機端口:容器端口 (多個容器同時使用80端口)
-p 宿主機ip1::容器端口 隨機端口映射
-p 宿主機ip1::容器端口/udp 使用udp協議做隨機端口映射
-p 80:80 -p 3306:3306
-p 1111-1119:1111-1119 端口範圍映射
-P 自動隨機端口映射
8:docker數據卷
docker run
-v 宿主機絕對目錄:容器目錄
-v 容器目錄 #創建一個隨機卷,來持久化容器的目錄下的數據
-v 卷名:容器目錄 #創建一個固定名字的卷,來持久化容器的目錄下的數據
--volumes-from 跟某一個容器掛載所有相同的卷
9:手動製作docker鏡像
製作一個基於centos6系統的nginx鏡像(單服務)
1:啓動一個純淨的centos:6.9容器,安裝nginx
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
2:把安裝好服務的容器,提交爲鏡像
docker container commit eb109f194821 centos6.9_nginx:v1
3:測試鏡像的功能
docker run -d -p 82:80 centos6.9_nginx:v1 nginx -g 'daemon off;'
製作一個基於centos6系統的kod網盤的鏡像(多服務)
1:啓動一個centos6.9_nginx:v1,再安裝php
echo '192.168.12.201 mirrors.aliyun.com' >>/etc/hosts
yum install php-fpm php-gd php-mbstring -y
vi /etc/php-fpm.d/www.conf
service php-fpm start
cd /etc/nginx/conf.d/
vi default.conf
mkdir /html
cd /html
curl -o kodexplorer4.40.zip http://192.168.12.201/191216/kodexplorer4.40.zip
yum install unzip -y
unzip kodexplorer4.40.zip
chown -R nginx:nginx .
vi /init.sh
#!/bin/bash
service php-fpm start
nginx -g 'daemon off;'
2:把安裝好服務的容器,提交爲鏡像
docker commit 47208e3e3796 kod:v2
3:測試鏡像的功能
docker run -d -p 83:80 kod:v2 /bin/bash /init.sh
製作一個基於centos7系統的nginx+sshd雙服務鏡像
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install nginx -y
yum install openssh-server -y
yum install initscripts -y
/usr/sbin/sshd-keygen
echo '123456'|passwd --stdin root
/usr/sbin/sshd -D
vi /init.sh
10:自動製作docker鏡像
鏡像: 中藥
dockerfile: 配方
dockerfile常用指令
FROM 基礎鏡像
RUN 製作鏡像過程中需要的執行命令(安裝服務)
CMD 容器啓動的時候執行的初始命令,容易被替換(啓動服務)
ENTRYPOINT 容器啓動的時候執行的初始命令,不能被替換,如果同時使用CMD和ENTRYPOINT,cmd命令將作爲ENTRYPOINT命令的參數
ADD 把dockerfile當前目錄下的文件拷貝到容器中(自動解壓tar包)
COPY 把dockerfile當前目錄下的文件拷貝到容器中(不解壓tar包)
WORKDIR 指定容器的默認工作目錄
EXPOSE 鏡像要暴露的端口
VOLUME 持久化卷
ENV 環境變量(ssh的密碼,數據庫的密碼)
LABEL 鏡像的屬性標籤
MAINTAINER 管理者標識
根據dockerfile自動構建鏡像的思路
a:手動製作docker鏡像,記錄歷史命令
b:根據歷史命令編寫dockerfile文件
c:docker build構建docker鏡像
d:測試鏡像的功能
dockerfile單服務例子1:
FROM centos:6.9
RUN echo '192.168.19.200 mirrors.aliyun.com' >>/etc/hosts
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install nginx -y
CMD ["nginx","-g","daemon off;"]
dockerfile多服務例子2:
FROM centos6.9_nginx:v1
RUN yum install php-fpm php-gd php-mbstring -y
ADD www.conf /etc/php-fpm.d/www.conf
ADD default.conf /etc/nginx/conf.d/default.conf
RUN mkdir /html
WORKDIR /html
RUN curl -o kodexplorer4.40.zip http://192.168.19.200/191127/kodexplorer4.40.zip
RUN yum install unzip -y
RUN unzip kodexplorer4.40.zip
RUN chown -R nginx:nginx .
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
vi /init.sh
#!/bin/bash
service php-fpm start
nginx -g 'daemon off;'
dockerfile使用環境變量的例子:
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx openssh-server initscripts -y
RUN /usr/sbin/sshd-keygen
ADD init.sh /init.sh
ENTRYPOINT ["/bin/bash","/init.sh"]
vi init.sh
#!/bin/bash
if [ -z $SSH_PWD ];then
SSH_PWD=$1
fi
echo $SSH_PWD|passwd --stdin root
nginx
/usr/sbin/sshd -D
11:docker鏡像的分層(複用,節省空間)
12:dockerfile的優化
a: 使用體積小的linux鏡像alpine
b:儘可能的清理無用的緩存文件(儘可能把多個RUN合併)
c:修改dockerfile的時候,儘可能把修改的內容放在最後
d:使用.dockerignore忽略構建docker鏡像時,不需要的文件
13:容器間的互聯
docker run --link 正在運行容器的名字(單方向)
docker run --name mysql-server -it \
-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
14:單機版的容器編排
yum install docker-compose -y(需要epel源)
version: '3'
services:
mysql-server:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: root_pwd
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_pwd
command: --character-set-server=utf8 --collation-server=utf8_bin
zabbix-java-gateway:
image: zabbix/zabbix-java-gateway:latest
restart: always
zabbix-server:
depends_on:
- mysql-server
image: zabbix/zabbix-server-mysql:latest
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
ports:
- "10051:10051"
zabbix-web-nginx-mysql:
depends_on:
- 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
docker-compose up -d 啓動服務
docker-compose down 停止服務
15:私有倉庫docker-registry
#啓動私有倉庫
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
#鏡像地址
nginx:1.15 官方倉庫的官方鏡像
nginx/nginx:1.15 官方倉庫的用戶鏡像
daocloud.io/nginx/nginx:1.15 私有倉庫的鏡像
#上傳鏡像
docker tag alpine:3.9 10.0.0.11:5000/alpine:3.9
docker image push 10.0.0.11:5000/alpine:3.9
#第一次上傳鏡像會報錯
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
systemctl restart docker
docker image push 10.0.0.11:5000/alpine:3.9
#下載鏡像
docker image pull 10.0.0.11:5000/alpine:3.9
16: 企業級私有倉庫harbor(docker-compose)
#下載安裝器
https://github.com/goharbor/harbor/releases/download/v1.10.0/harbor-offline-installer-v1.10.0.tgz
#解壓
[root@docker01 opt]# tar xf harbor-offline-installer-v1.8.0.tgz
#修改配置文件
cd harbor
vim harbor.yml
hostname: 10.0.0.12
harbor_admin_password: 123456
#執行安裝腳本
./install.sh
爲harbor配置https證書
#修改harbor.yml
#配置域名
hostname: blog.oldqiang.com
#配置證書
https:
port: 443
certificate: /opt/certs/nginx/1_blog.oldqiang.com_bundle.crt
private_key: /opt/certs/nginx/2_blog.oldqiang.com.key
#重新執行安裝腳本
./install.sh
17:docker基礎網絡
四種基礎網絡類型
bridge 默認類型 NAT模式
host host類型,使用宿主機網絡,網絡性能最高
container 容器類型。使用其他容器共用網絡,k8s中使用
none 沒有網絡,上不了外網
創建自定義網絡
docker network create -d bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 oldqiang
18:跨宿主機容器間的通訊之macvlan
macvlan類似與虛擬機的橋接網絡
#創建網絡
docker network create -d 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.105 alpine:3.9
19:跨宿主機容器間的通訊之overlay
docker03上: consul存儲ip地址的分配
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
docker01、02上:
vim /etc/docker/daemon.json
{
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.11:2376"
}
systemctl restart docker
2)創建overlay網絡
docker network create -d overlay --subnet 172.26.0.0/16 --gateway 172.26.0.1 ol1
3)啓動容器測試
docker run -it --network ol1 --name oldboy01 alpine:3.9 /bin/sh
每個容器有兩塊網卡,eth0實現容器間的通訊,eth1實現容器訪問外網
20:docker容器的監控
#客戶端節點
#啓動node-exporter
docker run -d -p 9100:9100 -v "/:/host:ro,rslave" --name=node_exporter quay.io/prometheus/node-exporter --path.rootfs /host
#啓動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
#prometheus節點
安裝prometheus和grafana
tar xf prometheus-2.12.0.linux-amd64.tar.gz
cd prometheus-2.12.0.linux-amd64/
vim prometheus.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']
./prometheus --config.file="prometheus.yml"
#安裝grafana
yum localinstall grafana-6.3.3-1.x86_64.rpm -y
systemctl start grafana-server.service
systemctl enable grafana-server.service
#訪問grafana http://IP:3000,默認賬號admin:admin
新建數據源--導入dashboard模板