容器就是在隔離的環境運行的一個進程,若是進程中止,容器就會銷燬。隔離的環境擁有本身的系統文件,ip地址,主機名等php
kvm虛擬機,linux,系統文件html
程序:代碼,命令
進程:正在運行的程序java
linux容器技術,容器虛擬化和kvm虛擬化的區別
kvm虛擬化: 須要硬件的支持,須要模擬硬件,能夠運行不一樣的操做系統,啓動時間分鐘級(開機啓動流程)mysql
linux開機啓動流程:
bios開機硬件自檢
根據bios設置的優先啓動項boot 網卡 硬盤 u盤 光驅
讀取mbr引導 2T UEFI(gpt分區) mbr硬盤分區信息,內核加載路徑,
加載內核
啓動第一個進程/sbin/init systemd
系統初始化完成
運行服務(nginx,httpd,mysql)
。。。linux
容器啓動流程:
共用宿主機內核:
第一個進程直接啓動服務(nginx,httpd,mysql)ios
容器:共用宿主機內核,輕量級,損耗少,啓動快,性能高,只能運行在linux系統上
虛擬機:須要硬件的支持,須要模擬硬件,須要走開機啓動流程,能夠運行不一樣的操做系統nginx
參考資料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
chang rootgit
做業1:使用chroot監獄限制SSH用戶訪問指定目錄和使用指定命令(cp,ls)
https://linux.cn/article-8313-1.html
lsgithub
cgroups 限制一個進程可以使用的資源。cpu,內存,硬盤ioweb
kvm虛擬機:資源限制(1c 1G 20G)
##須要使用epel源 #安裝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
橋接網卡
[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
啓動cgroup
systemctl start cgconfig.service
啓動lxc
systemctl start lxc.service
建立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容器設置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和網關
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
啓動容器
lxc-start -n centos7
centos7.6 2G 10.0.0.11 docker01 host解析
centos7.6 2G 10.0.0.12 docker02 host解析
Docker是經過進程虛擬化技術(namespaces及cgroups cpu、內存、磁盤io等)來提供容器的資源隔離與安全保障等。因爲Docker經過操做系統層的虛擬化實現隔離,因此Docker容器在運行時,不須要相似虛擬機(VM)額外的操做系統開銷,提升資源利用率。
namespace 資源隔離
cgroups 進程的資源限制
kvm 虛擬磁盤文件,資源隔離
kvm 資源限制,--cpus --memory
docker 初期把lxc二次開發,libcontainer
10.0.0.11:修改主機名和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
docker是傳統的CS架構分爲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主要組件有:鏡像、容器、倉庫, 網絡,存儲
啓動容器必須須要一個鏡像,倉庫中只存儲鏡像
容器---鏡像---倉庫
docker的主要目標是"Build,Ship and Run any App,Angwhere",構建,運輸,到處運行
部署服務,環境問題
一次構建,到處運行
docker是一種軟件的打包技術
docker初次體驗:
安裝Nginx步驟:
官網下載Nginx源碼包wget
tar
建立Nginx用戶
編譯安裝
./config....
修改配置文件,
啓動
配置docker鏡像加速
vi /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] } docker run -d -p 80:80 nginx run(建立並運行一個容器) -d 放在後臺 -p 端口映射 nginx docker鏡像的名字
搜索鏡像 docker search
選鏡像的建議:
1,優先考慮官方
2,stars數量多
官方鏡像倉庫地址:hub.docker.com
獲取鏡像:
docker pull(push)
鏡像加速器:阿里雲加速器,daocloud加速器,中科大加速器,Docker 中國官方鏡像加速:https://registry.docker-cn.com
官方pull docker pull centos:6.8(沒有指定版本,默認會下載最新版)
私有倉庫pull docker pull daocloud.io/huangzhichong/alpine-cn:latest
配置docker鏡像加速
vi /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] }
命令:
查看鏡像列表 docker images or docker image ls 刪除鏡像 docker rmi 例子:docker image rm centos:latest 導出鏡像 docker save 例子:docker image save centos -o docker-centos7.4.tar.gz 導入鏡像 docker load 例子:docker image load -i docker-centos7.4.tar.gz
*** docker run -d -p 80:80 nginx:latest run(建立並運行一個容器) -d 放在後臺 -p 端口映射 -v 源地址(宿主機):目標地址(容器) nginx docker鏡像的名字 docker run -it --name centos6 centos:6.9 /bin/bash -it 分配交互式的終端interactive tty --name 指定容器的名字 /bin/sh覆蓋容器的初始命令 運行容器*** docker run image_name docker run ==== docker create + docker start 啓動容器 docker start 中止容器 docker stop CONTAINER_ID 殺死容器 docker kill container_name 查看容器列表 docker ps(-a -l -q) 進入正在運行的容器(目的,調試,排錯) *** docker exec (會分配一個新的終端tty) docker exec [OPTIONS] CONTAINER COMMAND [ARG...] docker exec -it 容器id或容器名字 /bin/bash(/bin/sh) docker attach(使用同一個終端) 偷偷離開的快捷鍵ctrl+p,ctrl+q docker attach [OPTIONS] CONTAINER nsenter(安裝yum install -y util-linux 棄用) 刪除容器 docker rm 批量刪除容器 docker rm -f `docker ps -a -q`
總結:docker容器內的第一個進程(初始命令)必須一直處於前臺運行的狀態(必須夯住),不然這個容器,就會處於退出狀態!
業務在容器中運行:初始命令,夯住,啓動服務
docker0:172.17.0.1 jumpserver:172.17.0.2 nginx:172.17.0.3
指定映射(docker 會自動添加一條iptables規則來實現端口映射) -p hostPort:containerPort -p ip:hostPort:containerPort 多個容器都想使用8080端口 -p ip::containerPort(隨機端口) -p hostPort:containerPort/udp -p 10.0.0.100::53/udp 使用宿主機的10.0.0.100這個ip地址的隨機端口的udp協議映射容器的udp53端口 -p 81:80 –p 443:443 能夠指定多個-p 隨機映射 docker run -P (隨機端口) 經過iptables來實現的端口映射
/usr/share/nginx/html
-v /opt/xiaoniao:/usr/share/nginx/html
持久化
數據卷(文件或目錄) -v 卷名:/data (第一次卷是空,會容器的數據複製到卷中,若是卷裏面有數據,把卷數據的掛載到容器中) -v src(宿主機的目錄):dst(容器的目錄) 數據卷容器 --volumes-from(跟某一個已經存在的容器掛載相同的卷)
基於nginx啓動一個容器,監聽80和81,訪問80,出現nginx默認歡迎首頁,訪問81,出現小鳥。
-p 80:80 -p 81:81 -v xxx:xxx -v xxx:xxxx
基於nginx多端口的多站點。
docker commit 容器id或者容器的名字 新的鏡像名字[:版本號可選]
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 oldboy centos6-ssh-httpd:v1 3)測試鏡像功能是否可用 手動製做的鏡像,傳輸時間長 鏡像初始命令 製做一個kodexplorer網盤docker鏡像。nginx + php-fpm(httpd + php)
相似ansible劇本,大小几kb
手動作鏡像:大小几百M+
dockerfile 支持自定義容器的初始命令
dockerfile主要組成部分: 基礎鏡像信息 FROM centos:6.9 製做鏡像操做指令 RUN yum install openssh-server -y 容器啓動時執行指令 CMD ["/bin/bash"]
dockerfile經常使用指令:
FROM 這個鏡像的媽媽是誰?(指定基礎鏡像) MAINTAINER 告訴別人,誰負責養它?(指定維護者信息,能夠沒有) LABLE 描述,標籤 RUN 你想讓它幹啥(在命令前面加上RUN便可) ADD 給它點創業資金(會自動解壓tar) 製做docker基礎的系統鏡像 WORKDIR 我是cd,今天剛化了妝(設置當前工做目錄) VOLUME 給它一個存放行李的地方(設置卷,掛載主機目錄) EXPOSE 它要打開的門是啥(指定對外的端口)(-P 隨機端口) CMD 奔跑吧,兄弟!(指定容器啓動後的要乾的事情)(容易被替換) dockerfile其餘指令: COPY 複製文件(不會解壓)rootfs.tar.gz ENV 環境變量 ENTRYPOINT 容器啓動後執行的命令(沒法被替換,啓容器的時候指定的命令,會被當成參數)
製做成鏡像:
docker build -t 鏡像名字:版本號 dockerfile的路徑 若是在dockerfile的路徑下,可使用相對路徑
鏡像分層的好處:複用,節省磁盤空間,相同的內容只需加載一份到內存。
修改dockerfile以後,再次構建速度快
dockerfile 優化:
1:儘量選擇體積小linux,alpine
2:儘量合併RUN指令,清理無用的文件(yum緩存,源碼包)
3:修改dockerfile,把變化的內容儘量放在dockerfile結尾
4: 使用.dockerignore,減小沒必要要的文件ADD . /html
docker run -d -p 80:80 nginx docker run -it --link quirky_brown:web01 qstack/centos-ssh /bin/bash nginx容器的名字:別名 鏡像名 ping web01
lb --->nginx 172.17.0.4 --> db01 172.17.0.3 --> nfs01 172.17.0.2
使用docker運行zabbix-server
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 監控報警:微信報警,alpine yum 安裝zabbix好使
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry 上傳鏡像到私有倉庫: a:給鏡像打標籤 docker tag centos6-sshd:v3 10.0.0.11:5000/centos6-sshd:v3 b:上傳鏡像 docker push 10.0.0.11:5000/centos6-sshd:v3 docker run -d 10.0.0.11:5000/centos6-sshd:v3 若是遇到報錯: 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 解決方法: vim /etc/docker/daemon.json { "insecure-registries": ["10.0.0.11:5000"] } systemctl restart docker
yum install httpd-tools -y mkdir /opt/registry-var/auth/ -p htpasswd -Bbn oldboy 123456 >> /opt/registry-var/auth/htpasswd docker run -d -p 5000:5000 --restart=always -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
ansible劇本
yum install -y docker-compose(須要epel源)
cd my_wordpress/
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:
啓動
docker-compose up
後臺啓動
docker-compose up -d
方法一: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 }
Docker Machine 二進制 10.0.0.11 10.0.0.12 免密碼登錄 從docker的官網下載二進制的包,去安裝docker 10.0.0.13 免密碼登錄 ansible: shell
None:不爲容器配置任何網絡功能,--net=none Container:與另外一個運行中的容器共享Network Namespace,--net=container:containerID(K8S) Host:與宿主機共享Network Namespace,--network=host 性能最高 Bridge:Docker設計的NAT網絡模型
默認一個物理網卡,只有一個物理mac地址,虛擬多個mac地址
##建立macvlan網絡 docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1 ##設置eth0的網卡爲混雜模式 ip link set eth1 promisc on ##建立使用macvlan網絡的容器 docker run -it --network macvlan_1 --ip=10.0.0.200 busybox
做業1:docker跨主機容器間的通訊flannel
http://www.cnblogs.com/CloudMan6/p/7270551.html
docker03上:
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
設置容器的主機名
consul:kv類型的存儲數據庫(key:value) docker0一、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" } vim /etc/docker/daemon.json vim /usr/lib/systemd/system/docker.service systemctl daemon-reload systemctl restart docker 2)建立overlay網絡 docker network create -d overlay --subnet 172.16.1.0/24 --gateway 172.16.1.254 ol1 3)啓動容器測試 docker run -it --network ol1 --name oldboy01 busybox /bin/bash 每一個容器有兩塊網卡,eth0實現容器間的通信,eth1實現容器訪問外網
第一步:安裝docker和docker-compose 第二步:下載harbor-offline-installer-v1.3.0.tgz 第三步:上傳到/opt,並解壓 第四步:修改harbor.cfg配置文件 hostname = 10.0.0.11 harbor_admin_password = 123456 第五步:執行install.sh
kubernetes 二進制安裝 安裝最新版,步驟繁瑣!! https://github.com/minminmsn/k8s1.13/blob/master/kubernetes/kubernetes1.13.1%2Betcd3.3.10%2Bflanneld0.10%E9%9B%86%E7%BE%A4%E9%83%A8%E7%BD%B2.md kubeadm 安裝(網絡緣由) https://www.qstack.com.cn/archives/425.html minikube 安裝(網絡緣由) yum 安裝(最容易 1.5) go編譯安裝(大神級別) k8s-master 管理者 kubelet --docker 啓動容器 kubelet --docker
1):啓動一個容器,並修改 docker run -it -p 1022:22 centos:6.8 /bin/bash yum install openssh-server -y echo 'root:123456'|chpasswd /etc/init.d/sshd start 測試:ssh遠程登陸 2):將修改後的容器,保存爲鏡像 docker commit friendly_swartz centos6-ssh 3)測試新鏡像,sshd是否可用 docker run -d -p 1122:22 centos6-ssh:latest /usr/sbin/sshd -D ssh root@10.0.0.11 -p 1122
1):啓動一個容器,並修改 docker run -d -p 1122:22 centos6-ssh:latest /usr/sbin/sshd -D yum install httpd -y /etc/init.d/httpd start vi /init.sh #!/bin/bash /etc/init.d/httpd start /usr/sbin/sshd -D chmod +x /init.sh 2):將修改後的容器,保存爲鏡像 docker commit 11bf5984784a centos6-httpd 3)測試新鏡像,檢測sshd和httpd是否可用 docker run -d -p 1222:22 -p 80:80 centos6-httpd:latest /init.sh 做業:使用Dockerfile完成kodexplorer網盤項目 課前回顧: Linux容器是與系統其餘部分隔離開的一系列進程,從另外一個系統鏡像rootfs運行,並由該鏡像提供支持進程所需的所有文件。 容器鏡像包含了應用的全部依賴項,於是在從開發到測試再到生產的整個過程當中,它都具備可移植性和一致性。 1:chroot,ldd 2:lxc namespace(6大命名空間)和cgroup 3:docker和kvm區別,docker鏡像基礎操做,docker容器平常操做,commit製做鏡像,dockfile來自動構建鏡像
1)啓動registry容器 docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry 2)修改/etc/docker/daemon.json配置文件 { "registry-mirrors": ["https://registry.docker-cn.com"], "insecure-registries": ["10.0.0.11:5000"] } 3)重啓docker服務 systemctl restart docker 4)爲鏡像打標籤 docker tag centos:6.8 10.0.0.11:5000/oldboy/centos:6.8 5)push推送鏡像 docker push 10.0.0.11:5000/oldboy/centos:6.8