docker容器

docker容器

1:什麼是容器?

容器就是在隔離的環境運行的一個進程,若是進程中止,容器就會銷燬。隔離的環境擁有本身的系統文件,ip地址,主機名等php

kvm虛擬機,linux,系統文件html

1563758502713

程序:代碼,命令
進程:正在運行的程序java

2:容器和虛擬化的區別

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

3:容器技術的發展過程:

1):chroot技術,新建一個子系統(擁有本身完整的系統文件)

參考資料: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

2):linux容器(lxc) linux container(namespaces 命名空間 隔離環境 及cgroups 資源限制)

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

3):docker容器

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

4:docker的安裝

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

5:docker的主要組成部分

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主要組件有:鏡像、容器、倉庫, 網絡,存儲

啓動容器必須須要一個鏡像,倉庫中只存儲鏡像
容器---鏡像---倉庫

6:啓動第一個容器

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鏡像的名字

7: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

8:docker的容器管理

*** 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容器內的第一個進程(初始命令)必須一直處於前臺運行的狀態(必須夯住),不然這個容器,就會處於退出狀態!

業務在容器中運行:初始命令,夯住,啓動服務

9: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來實現的端口映射

10:docker的數據卷管理

/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多端口的多站點。

11:手動將容器保存爲鏡像

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)

12:dockerfile自動構建docker鏡像

相似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的路徑下,可使用相對路徑

13:docker鏡像的分層(kvm 連接克隆,寫時複製的特性)

鏡像分層的好處:複用,節省磁盤空間,相同的內容只需加載一份到內存。
修改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好使

15:docker registry(私有倉庫)

15.1普通的registry

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

15.2帶basic認證的registry

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

16:docker-compose(單機版的容器編排工具)

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

17:重啓docker服務,容器所有退出的解決辦法

方法一: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 Machine安裝docker服務

Docker Machine 二進制 10.0.0.11
10.0.0.12 免密碼登錄 從docker的官網下載二進制的包,去安裝docker
10.0.0.13 免密碼登錄

ansible:
shell

19:Docker網絡類型

None:不爲容器配置任何網絡功能,--net=none
Container:與另外一個運行中的容器共享Network Namespace,--net=container:containerID(K8S)
Host:與宿主機共享Network Namespace,--network=host 性能最高 
Bridge:Docker設計的NAT網絡模型

20:Docker跨主機容器之間的通訊macvlan

默認一個物理網卡,只有一個物理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

21:Dcoker跨主機容器通訊之overlay

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實現容器訪問外網

22:docker企業級鏡像倉庫harbor(vmware 中國團隊)

第一步:安裝docker和docker-compose

第二步:下載harbor-offline-installer-v1.3.0.tgz

第三步:上傳到/opt,並解壓

第四步:修改harbor.cfg配置文件
hostname = 10.0.0.11
harbor_admin_password = 123456

第五步:執行install.sh

22.一、k8s的安裝方法

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

22.二、製做一個只支持sshd服務的鏡像

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

22.三、製做了一個支持sshd和httpd雙服務的鏡像

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來自動構建鏡像

22.四、docker私有倉庫registry

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
相關文章
相關標籤/搜索