Docker介紹及使用

什麼是容器?

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

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

容器和虛擬化的區別

linux容器技術,容器虛擬化和kvm虛擬化的區別linux

kvm虛擬化: 須要硬件的支持,須要模擬硬件,能夠運行不一樣的操做系統,啓動時間分鐘級(開機啓動流程)ios

linux開機啓動流程:nginx

  • bios開機硬件自檢
  • 根據bios設置的優先啓動項 網卡 硬盤 u盤 光驅
  • 讀取mbr引導 UEFI(gpt分區) mbr硬盤分區信息,內核加載路徑
  • 加載內核
  • 啓動第一個進程init systemd
  • 系統初始化完成
  • 運行服務

容器:共用宿主機內核,運行服務,損耗少,啓動快,性能高sql

容器虛擬化:不須要硬件的支持。不須要模擬硬件,共用宿主機的內核,啓動時間秒級(沒有開機啓動流程)docker

總結:
一、與宿主機使用同一個內核,性能損耗小;
二、不須要指令級模擬;
三、容器能夠在CPU核心的本地運行指令,不須要任何專門的解釋機制;
四、避免了準虛擬化和系統調用替換中的複雜性;
五、輕量級隔離,在隔離的同時還提供共享機制,以實現容器與宿主機的資源共享。django

容器技術的發展過程:

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

參考資料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
chang rootjson

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

宿主機namespace ip地址 主機名 系統文件 進程
子系統namespace,ip地址 主機名 系統文件 進程vim

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