什么是容器?
容器就是在隔離的環境運行的一個進程,如果進程停止,容器就會銷毀。隔離的環境擁有自己的系統文件,ip地址,主機名等,kvm虛擬機,linux,系統文件
程序:代碼,命令
進程:正在運行的程序
容器和虛擬化的區別
linux容器技術,容器虛擬化和kvm虛擬化的區別
kvm虛擬化: 需要硬件的支持,需要模擬硬件,可以運行不同的操作系統,啟動時間分鍾級(開機啟動流程)
linux開機啟動流程:
- bios開機硬件自檢
- 根據bios設置的優先啟動項 網卡 硬盤 u盤 光驅
- 讀取mbr引導 UEFI(gpt分區) mbr硬盤分區信息,內核加載路徑
- 加載內核
- 啟動第一個進程init systemd
- 系統初始化完成
- 運行服務
容器:共用宿主機內核,運行服務,損耗少,啟動快,性能高
容器虛擬化:不需要硬件的支持。不需要模擬硬件,共用宿主機的內核,啟動時間秒級(沒有開機啟動流程)
總結:
1、與宿主機使用同一個內核,性能損耗小;
2、不需要指令級模擬;
3、容器可以在CPU核心的本地運行指令,不需要任何專門的解釋機制;
4、避免了准虛擬化和系統調用替換中的復雜性;
5、輕量級隔離,在隔離的同時還提供共享機制,以實現容器與宿主機的資源共享。
容器技術的發展過程:
chroot技術,新建一個子系統(擁有自己完整的系統文件)
參考資料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
chang root
linux容器(lxc) linux container(namespaces 命名空間 隔離環境 及cgroups 資源限制)
宿主機namespace ip地址 主機名 系統文件 進程
子系統namespace,ip地址 主機名 系統文件 進程
cgroups 限制一個進程能夠使用的資源。cpu,內存,硬盤io
kvm虛擬機:資源限制(1c 1G 20G)
有一個相同函數名字:
. name1 sss.sh === name1.sss()
. xxxx.sh === name2.sss()
需要使用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=223.5.5.5' >/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
docker容器 (對lxc進行改進,當前流行)
Docker是通過內核虛擬化技術(namespaces及cgroups cpu、內存、磁盤io等)來提供容器的資源隔離與安全保障等。由於Docker通過操作系統層的虛擬化實現隔離,所以Docker容器在運行時,不需要類似虛擬機(VM)額外的操作系統開銷,提高資源利用率
namespace 資源隔離
cgroups 進程的資源限制
kvm 虛擬磁盤文件,資源隔離
kvm 資源限制,--cpus --memory
docker 初期把lxc二次開發,libcontainer
docker的主要目標是"Build,Ship and Run any App,Angwhere",構建,運輸,處處運行
部署服務,環境問題
一次構建,處處運行
docker是一種軟件的打包技術
構建:做一個docker鏡像
運輸:docker pull
運行:啟動一個容器
每一個容器,他都有自己的系統文件rootfs.
kvm解決了硬件和操作系統之間的依賴
kvm獨立的虛擬磁盤,xml配置文件
docker解決了軟件和操作系統環境之間的依賴,能夠讓獨立服務或應用程序在不同的環境中,得到相同的運行結果。
docker鏡像有自己的文件系統。
docker容器是一種輕量級、可移植、自包含的軟件打包技術,使應用程序可以在幾乎任何地方以相同的方式運行。開發人員在自己筆記本上創建並測試好的容器,無需任何修改就能夠在生產系統的虛擬機、物理服務器或公有雲主機上運行。
docker的安裝
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的主要組成部分
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 info(如果要做監控)
docker主要組件有:鏡像、容器、倉庫, 網絡,存儲
啟動容器必須需要一個鏡像,倉庫中只存儲鏡像 容器---鏡像—倉庫
啟動第一個容器
啟動容器
systemctl start docker
開啟自啟
systemctl enable docker
配置docker鏡像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
開啟一個nginx服務的容器:
docker run -d -p 80:80 nginx
docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest
run(創建並運行一個容器)
-d 放在后台
-p 端口映射
-v 源地址(宿主機):目標地址(容器)
nginx docker鏡像的名字
小技巧:
退出容器時使用 ctrl + p,ctrl +q 可以保證退出容器后 容器不被殺死
手動制作支持ssh登錄的docker
啟動一個基礎容器
docker run -it -p 1022:22 centos:6.9
安裝sshd服務
yum install openssh-server -y
service sshd start
echo '123456'|passwd --stdin root
把安裝好軟件的容器,提交為鏡像
docker commit 7d40c868114a centos_ssh:v1
測試
docker run -d -p 1023:22 centos_ssh:v1 /usr/sbin/sshd -D
手動制作bookManagerSystem的docker
啟動一個基礎容器
docker run -it -p 8080:8080 python:3.6 /bin/bash
容器部署bms項目
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django
cd /opt/
wget http://www.qstack.com.cn/bookManageSystem.zip
unzip bookManageSystem.zip
cd bookManageSystem
替換Debian源
echo 'deb http://mirrors.163.com/debian/ stretch main non-free contrib
deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib' >/etc/apt/sources.list
apt-get update
apt-get install vim -y
vim bookManageSystem/settings.py
python manage.py migrate
python manage.py runserver 0.0.0.0:8080
把部署好bms項目的容器提交為鏡像
docker commit 3e3313968bf7 bms:v1
測試
docker run -d -p 8080:8080 bms:v1 python /opt/bookManageSystem/manage.py runserver 0.0.0.0:8080
制作一個支持多服務的docker鏡像
啟動一個基礎容器
docker run -it -p 8085:8080 -p 1024:22 bms:v1 /bin/bash
在容器中安裝部署服務
apt-get install openssh-server
service ssh start
passwd root
修改配置文件
vim /etc/ssh/sshd_config
PermitRootLogin yes
service ssh restart
編寫啟動文件
vim /init.sh
#!/bin/bash
service ssh start
python /opt/bookManageSystem/manage.py runserver 0.0.0.0:8080
把部署好bms項目的容器提交為鏡像
docker commit 6e44ab74fa5c bms_ssh:v4
測試
docker run -d -p 8085:8080 -p 1024:22 bms_ssh:v4 /bin/bash /init.sh
啟動一個基礎容器
docker run -it -p 1022:22 centos:6.9
安裝sshd服務
yum install openssh-server -y
service sshd start
echo '123456'|passwd --stdin root
把安裝好軟件的容器,提交為鏡像
docker commit 7d40c868114a centos_ssh:v1
測試
docker run -d -p 1023:22 centos_ssh:v1 /usr/sbin/sshd -D
docker的鏡像管理
搜索鏡像
docker search
選鏡像的建議:
- 優先考慮官方
- stars數量多
獲取鏡像
docker pull(push)
鏡像加速器:阿里雲加速器,daocloud加速器,中科大加速器,Docker 中國官方鏡像加速:https://registry.docker-cn.com
docker pull centos:6.8(沒有指定版本,默認會下載最新版)
docker pull daocloud.io/huangzhichong/alpine-cn:latest
配置docker鏡像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
第三方docker鏡像倉庫,使用方法:
docker pull index.tenxcloud.com/tenxcloud/httpd:latest
查看鏡像
docker images docker image ls
刪除鏡像
docker rmi 例子:docker image rm centos:latest
導出鏡像
docker save 例子:docker image save centos > docker-centos7.4.tar.gz
導入鏡像
docker load 例子:docker image load -i docker-centos7.4.tar.gz
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 分配交互式的終端
--name 指定容器的名字
/bin/sh覆蓋容器的初始命令
- 啟動容器
docker run image_name
docker run -it image_name CMD
docker run ==== docker create + docker start
-
停止容器
docker stop CONTAINER_ID -
殺死容器
docker kill container_name -
查看容器列表
docker ps
docker ps –a -
進入容器(目的,調試,排錯)
*** docker exec (會分配一個新的終端tty)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh)
制作dockerfile
首先創建一個dockerfile文件 寫入內容
at dockerfile
FROM python:3.6
ADD bookManageSystem.zip /bookManageSystem.zip
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django
RUN unzip /bookManageSystem.zip
RUN sed -i 's#ALLOWED_HOSTS = \[\]#ALLOWED_HOSTS = \["*"\]#g' /bookManageSystem/bookManageSystem/settings.py
RUN python /bookManageSystem/manage.py migrate
CMD ["python","/bookManageSystem/manage.py","runserver","0.0.0.0:8080"]
下載項目
yum install wget -y
wget http://www.qstack.com.cn/bookManageSystem.zip
修改之前的dockerfile文件
FROM python:3.6
ADD bookManageSystem.zip /bookManageSystem.zip
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django
RUN unzip /bookManageSystem.zip
RUN sed -i 's#ALLOWED_HOSTS = \[\]#ALLOWED_HOSTS = \["*"\]#g' /bookManageSystem/bookManageSystem/settings.py
RUN python /bookManageSystem/manage.py migrate
ADD sources.list /etc/apt/sources.list
RUN apt-get update
RUN apt-get install openssh-server -y
RUN service ssh start
RUN echo 'root:123456'|chpasswd
RUN echo 'PermitRootLogin yes' >>/etc/ssh/sshd_config
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
編寫一個執行腳本
[root@docker01 bms_ssh]# cat init.sh
#!/bin/bash
service ssh start
python /bookManageSystem/manage.py runserver 0.0.0.0:8080
最后開啟一個容器
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
傳自己的鏡像到私有倉庫
docker login 在dockerhub上注冊賬號並且登錄
docker images
docker push centos_ssh:v3
docker tag centos_ssh:v3 t29617342/centos_ssh:v3
docker push t29617342/centos_ssh:v3