Docker基础

  

docker介绍:

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

kvm虚拟机,linux,系统文件

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

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

linux开机启动流程:

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

  

容器启动流程:
共用宿主机内核:
第一个进程,服务nginx,httpd,mysql

容器:共用宿主机内核,容器的第一个进程直接运行服务,轻量级,损耗少,启动快,性能高

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

总结:

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

  

安装:

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
 systemctl start docker
 [root@localhost yum.repos.d]# docker version
 Client:
  Version:           18.09.7
  API version:       1.39
  Go version:        go1.10.8
  Git commit:        2d0083d
  Built:             Thu Jun 27 17:56:06 2019
  OS/Arch:           linux/amd64
  Experimental:      false
 ​
 Server: Docker Engine - Community
  Engine:
   Version:          18.09.7
   API version:      1.39 (minimum version 1.12)
   Go version:       go1.10.8
   Git commit:       2d0083d
   Built:            Thu Jun 27 17:26:28 2019
   OS/Arch:          linux/amd64
   Experimental:     false

  

docker主要组件有:镜像、容器、仓库, 网络,存储

启动容器必须需要一个镜像,仓库中只存储镜像
容器---镜像---仓库

配置docker镜像加速

 
[root@localhost ~]# cat > /etc/docker/daemon.json << eof
 ​
 > {
 > "registry-mirrors": ["https://registry.docker-cn.com"]
 > }
 > eof
 [root@localhost ~]# systemctl restart docker

  

docker常用命令

  1:什么是容器?
 容器是在隔离的环境中运行的一个进程。
 容器是一个软件的打包技术。
 
 2:容器相对于虚拟机有什么优势?
 轻量级,损耗少,性能高,启动快
 
 3:镜像常用的命令
 
 docker search 搜索镜像
 docker image ls 查看镜像列表
 docker image rm 删除镜像     docker image rm busybox:latest
 docker image save 导出镜像    docker image save busybox:latest -o docker_busybox_tar.gz
 docker image load 导入镜像     docker image load -i docker_busybox_tar.gz  -i是指定路径
 docker image pull 拉取镜像     docker pull busybox
 docker image push 上传镜像
 docker image build 构建镜像
 docker image histroy查看镜像构建历史命令
 docker image prune批量清除未使用的镜像
 docker image tag  给镜像打标签
 
 4:容器常用的命令
 docker run   创建并启动一个容器
 docker exec  进入容器(新的终端)    docker exec -it 6512ee200992  /bin/bash
 docker attach进入容器(共用一个终端)  docker attach 6512ee200992  所有shell界面同步,需用crtl+p和crtl+q退出不影响其他shell界面操作
 docker rmi     删除容器        docker rmi busybox:latest
 docker create 创建容器
 docker start  启动容器
 docker stop   关闭容器     stop都面接容器的ID
 docker kill   杀死容器     kill后面接节容器的name
 docker restart 重启容器
 docker ps  -a   查看容器
 docker commit   把容器提交为镜像
 docker logs     查看容器初始命令的输出结果
 docker cp       在容器和宿主机之间拷贝文件
 docker inspect  查看容器的详细属性
 ​
 docker run的参数
 -d  在后台运行
 --name 容器的名字
 -it    分配一个交互式的终端
 -p     端口映射
 -P     随机端口映射(EXPOSE)
 -v     挂载目录或卷到容器中
 -e     指定环境变量
 --rm   容器退出自动删除
 --link 容器间互联(单向) /etc/hosts
 --network 基于制定的网络运行容器
 --restart=always 容器的开机自启
 -h      指定容器的主机名
 ​
 ​
 dockerfile常用指令?
 RUN
 ADD
 FROM
 CMD   容易被覆盖
 EXPOSE
 ENV
 COPY
 WORKDIR
 VOLUME
 ENTRYPOINT不会被覆盖

  


 docker的私有仓库
 上传镜像2步
 a:给镜像打标签
 docker image tag  centos6.9_ssh:v2 10.0.0.11:5000/centos6.9_ssh:v2
 docker push 10.0.0.11:5000/centos6.9_ssh:v2
 ​
 docker login 10.0.0.11:5000
 docker logout 10.0.0.11:5000
 ​
 docker 四种网络模式
 none  没有网络
 host  与宿主机共用网络
 container 与已运行的容器共用网络
 bridge  
 ​
 macvlan
 overlay
 ​
 pipework
 flannel
 docker-compose 单机版容器编排工具
 
 容器编排,k8s

镜像的官网

 https://hub.docker.com/
 

查看命令的详细:

 
[root@localhost ~]# docker ps -al
 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
 f44b2c28acc5        nginx:latest        "nginx -g 'daemon of…"   8 seconds ago       Up 7 seconds0.0.0.0:80->80/tcp   ecstatic_benz
 [root@localhost ~]# docker ps -al --no-trunc     这个参数就是显示详细的意思
 CONTAINER ID                                                        IMAGE               COMMAND        CREATED             STATUS              PORTS                NAMES
 f44b2c28acc50eccffb9cabba932192e58b8d9d5f20a13f34ce4a5f008e3867c   nginx:latest        "nginx -g 'daemon off;'"   19 seconds ago      Up 17 seconds       0.0.0.0:80->80/tcp   ecstatic_ben

  

国内镜像网站源:

 https://www.cnblogs.com/liuguanglin/p/9397428.html
 ​
 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" >cat /etc/apt/sources.list
 升级apt,等同于yum更新源
 apt-get update
 ​
 ​
 apt-get install procps -y   ### 就是ps命令

  

docker容器的网络:

 [root@localhost ~]# sysctl -a |grep ipv4|grep forward
 net.ipv4.conf.all.forwarding = 1
 net.ipv4.conf.all.mc_forwarding = 0
 net.ipv4.conf.default.forwarding = 1
 net.ipv4.conf.default.mc_forwarding = 0
 net.ipv4.conf.docker0.forwarding = 1
 net.ipv4.conf.docker0.mc_forwarding = 0
 net.ipv4.conf.ens33.forwarding = 1
 net.ipv4.conf.ens33.mc_forwarding = 0
 net.ipv4.conf.lo.forwarding = 1
 net.ipv4.conf.lo.mc_forwarding = 0
 net.ipv4.conf.vethd33a03b.forwarding = 1
 net.ipv4.conf.vethd33a03b.mc_forwarding = 0
 net.ipv4.ip_forward = 1    就是这条允许转发的命令
 net.ipv4.ip_forward_use_pmtu = 0
 sysctl: reading key "net.ipv6.conf.all.stable_secret"
 sysctl: reading key "net.ipv6.conf.default.stable_secret"
 sysctl: reading key "net.ipv6.conf.docker0.stable_secret"
 sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
 sysctl: reading key "net.ipv6.conf.lo.stable_secret"
 sysctl: reading key "net.ipv6.conf.vethd33a03b.stable_secret"

  

docker的网络访问

 指定映射(docker 会自动添加一条iptables规则来实现端口映射)
   -p hostPort:containerPort  *****
   -p ip:hostPort:containerPort  多个容器都想使用80端口
   -p ip::containerPort(随机端口) *****
   -p hostPort:containerPort:udp
   -p  10.0.0.100::53:udp
   -p 81:80 –p 443:443 可以指定多个-p
 第一种:-p hostPort:containerPort
 ifconfig ens33:0 10.0.0.100/24 up
 docker run -d -p 10.0.0.11:90:80 nginx:latest
 docker run -d -p 10.0.0.100:90:80 nginx:latest
 第二种:docker run -d -p 10.0.0.11::80 nginx:latest
 [root@localhost network-scripts]# docker ps -a
 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
 4509226576eb        nginx:latest        "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes10.0.0.11:32768->80/tcp   affectionate_easley
 访问就是用curl 10.0.0.11:32768即可
 为什么是这个端口;
   sysctl -a |grep net.ipv4|grep range   如下图:

 

docker的数据卷挂载:

 
将zip包解压到/app/data下面
 unzip xiaoniaofeifei.zip
 docker run -d -p 80:80 -v /app/data/:/usr/share/nginx/html nginx:latest
 ​
 将文件挂载到容器中
 docker run -it -v /app/data/xiaoniaofeifei.zip:/opt/xiaoniaofeifei.zip  centos:6.9/bin/bash
 [root@3e1e6771ea2a /]# cd /opt/
 [root@3e1e6771ea2a opt]# ls
 xiaoniaofeifei.zip

  

小练习:要求:基于nginx做一个容器,,监听100和200的端口,访问100的端口出现nginx默认欢迎界面,访问200的端口,出现小鸟的游戏
提示: -p 100:100 -p 200:200 -v XXX:XXX -v XXX:XXX

 docker pull nginx:1.12
 mdkir -p /opt/xiaoniaofeifei
 unzip  xiaoniaofeifei.zip -d /opt/xiaoniaofeifei
  
 vim /opt/nginx_xiaoniao.conf
 server {
     listen       200;
     server_name  localhost;
     location / {
         root   /opt;
         index  index.html index.htm;
     }
 ​
 }
 server {
     listen       100;
     server_name  localhost;
     location / {
         root   /usr/share/nginx/html;
         index  index.html index.htm;
     }
 }
 ​
 ​
 docker run -d -p 200:200 -p 100:100  -v /opt/nginx_xiaoniao.conf:/etc/nginx/conf.d/nginx.conf -v /opt/xiaoniaofeifei:/opt nginx:1.12

  

手动将容器保存成镜像:

将yum源的地址改成

 原来的是:
 http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
 自己给了以后
 http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os
 如下:
 http://mirrors.neusoft.edu.cn/centos/6.10/os/x86_64/
 http://mirrors.nju.edu.cn/centos/6.10/os/x86_64/
 http://mirror.lzu.edu.cn/centos/6.10/os/x86_64/
 http://mirrors.tuna.tsinghua.edu.cn/centos/6.10/os/x86_64/
 http://mirrors.aliyun.com/centos/6.10/os/x86_64/
 http://mirrors.huaweicloud.com/centos/6.10/os/x86_64/
 http://mirrors.cqu.edu.cn/CentOS/6.10/os/x86_64/
 http://mirrors.163.com/centos/6.10/os/x86_64/
 http://ftp.sjtu.edu.cn/centos/6.10/os/x86_64/
 http://mirrors.njupt.edu.cn/centos/6.10/os/x86_64/
 这里是6的系统,所以
 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
 即可:要是7的话
 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
 ​
 
 原来的容器ID 3864d563fc54
 docker container commit 3864d563fc54  centos6.9_ssh:v1
 docker run -d -p 9090:22 centos6.9_ssh:v1 /usr/sbin/sshd -D

  

 

原文地址:https://www.cnblogs.com/nshgo/p/11138292.html