Docker介绍及使用

什么是容器?

容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,ip地址,主机名等,kvm虚拟机,linux,系统文件

程序:代码,命令
进程:正在运行的程序

容器和虚拟化的区别

linux容器技术,容器虚拟化和kvm虚拟化的区别

kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)

linux开机启动流程:

  • bios开机硬件自检
  • 根据bios设置的优先启动项 网卡 硬盘 u盘 光驱
  • 读取mbr引导 UEFI(gpt分区) mbr硬盘分区信息,内核加载路径
  • 加载内核
  • 启动第一个进程init systemd
  • 系统初始化完成
  • 运行服务

容器:共用宿主机内核,运行服务,损耗少,启动快,性能高

容器虚拟化:不需要硬件的支持。不需要模拟硬件,共用宿主机的内核,启动时间秒级(没有开机启动流程)

总结:
1、与宿主机使用同一个内核,性能损耗小;
2、不需要指令级模拟;
3、容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
4、避免了准虚拟化和系统调用替换中的复杂性;
5、轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。

容器技术的发展过程:

宿主机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是通过内核虚拟化技术(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 可以保证退出容器后 容器不被杀死 
启动一个基础容器 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 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 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 centos:6.8(没有指定版本,默认会下载最新版) docker pull daocloud.io/huangzhichong/alpine-cn:latest 
vi /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] } 

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 

原文链接:https://www.cnblogs.com/wanlei/p/10757524.html

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享