docker

Docker核心概念
    镜像是一个只读的模板,类似于安装系统时用到的ISO 文件,通过镜像来完成各种应用的部署。
    容器可以被启动、开始、停止、删除等,每个容器间都是相互隔离的。
    仓库是一个存放镜像的场所,仓库分为公共仓库和私有仓库。最大的公共仓库是Docker hub (https://hub.docker.com/), 国内公共仓库是http://www.dockerpool.com/
        
    注意:镜像类似于操作系统,容器类似于虚拟机本身。
    
安装Docker
    Docker安装文档: https://docs.docker.com/install。
    
    Windows 系统安装Docker:
        1. 操作系统必须是Windows 10 或Windows Server 2016 以上的系统,,而且要支持Hyper-V 。
        2. 下载Docker for Windows ( Stable ),双击Docker 的安装图标进行安装,完成后会在桌面上创建一个快捷方式,双击快捷方式即可启动Docker。
            启动Docker 时提示未开启Hyper-V 虚拟化,单击OK 按钮即可。
            
            https://docs.docker.com/desktop/windows/install/
        3. 命令行运行docker version或docker -version检验安装成功。
    CentOS 7 系统安装Docker
        1. 下载yum源 
            ~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o  /etc/yum.repos.d/docker.repo
        2. yum 命令安装docker-ce ,运行命令如下。
            ~]# yum install -y docker-ce
            使用yum 命令安装docker-ce 较慢,可到GitLab 中下载docker-ce 的RPM 包,下载后上传至Linux 服务器中,再使用yum 命令安装可自动解决依赖关系。
        3. 启动Docker 服务,添加开机自启动,运行命令如下。
            ~]# systemctl enable docker.service
            ~]# systemctl start docker.service
        4. 启动后可以查看默认在iptables 防火墙中生成的一些关于Docker 的规则
            ~]# iptables -nvL

Docker镜像管理
    下载Docker 镜像
        Docker 镜像可以从Docker 的官方网站下载    
            ~]# docker pull centos
    设置阿里云Docker 加速器
        1. 下载阿里云Docker 加速器
            <1>. 登录阿里云网站( https://cr.console.aliyun.com),输入用户名和|密码, 登录成功后单击“镜像加速器”→“您的专属加速器地址”
            <2>. 在/etc/docker/daemon.json 配置文件中添加镜像加速器网址链接,然后重启Docker 服务。
                ~]# vim /etc/docker/daemon . json
                    { "registry-mirrors": ["https://ia0t2gyi.mirror.aliyuncs.com"]}
                    
                ~]#  systemctl daemon-reload
                ~]#  systemctl restart docker.service
        2. 设置Docker Hub Mirror 加速器
            Docker Hub Mirror 加速器获取网址是https://www.daocloud.io/mirror#acceleratordoc
            直接运行curl 命令会自动创建, 运行命令如下。
                ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http : //ff33ccad .m. daocloud . io
                ~]# systemctl daemon-reload
                ~]# systemctl restart docker.service
Docker 基本命令
    ~]# docker help
        Usage:  docker [OPTIONS] COMMAND
        ......
    ~]# docker help cp
    等价于 ~]# docker cp --help
        Usage:  docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
                docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
    1. 查看docker版本信息 ~]# docker version            
        ~]# docker version
        Client:
         Version:           18.06.1-ce
         API version:       1.38
         Go version:        go1.10.3
         Git commit:        e68fc7a
         Built:             Tue Aug 21 17:23:03 2018
         OS/Arch:           linux/amd64
         Experimental:      false

        Server:
         Engine:
          Version:          18.06.1-ce
          API version:      1.38 (minimum version 1.12)
          Go version:       go1.10.3
          Git commit:       e68fc7a
          Built:            Tue Aug 21 17:25:29 2018
          OS/Arch:          linux/amd64
          Experimental:     false
    2. 查看docker 基本信息
        ~]# docker -D info
    3. 查看本地都有哪些镜像
        ~]# docker images
        ~]# docker images ls
    4. 搜索镜像docker search:模糊匹配
        ~]# docker search jumpserver
    5. 给镜像打标签docker tag,打完标签后会生成一个新的镜像,但是Image ID 不会发生变化
        ~]# docker tag centos humingzhe  #REPOSITORY由centos===》重新生成humingzhe
        也可以直接给imageid打tag
        ~]# docker tag 147f99d45b9f test
    6. 镜像启动为容器,默认在后台启动,不会进入交互命令行。
        ~]# docker run -itd centos 32a92fbcead96a2407996e2c57clb2b44dbfldla93f0a9c63046a6fa47f8 79ba
            -i i在项表示让容器的标准输入打开
            -t 选项表示分配一个伪终端,
            -d 选项表示后台启动。
            
            -i 、-t 、-d 选项需放在镜像名字前面。
    7. 查看运行的容器,docker ps
        ~]# docker ps
        ~]# docker ps -a
        ~]# docker container ls
        ~]# docker container ls -a
        加上 -a 选项可查看所有的容器,包括未运行的容器,
    8. 删除指定的镜像 docker rmi
        ~]# docker rmi centos
        rmi 命令后面的参数可以是tag , 如果是tag ,则表示删除该tag 。
        当后面的镜像参数为Image ID 时,会彻底删除整个镜像,所有的标签也会被一同删除。
创建镜像
    直接从官网pull
    通过容器创建镜像        
        镜像可以从官网通过pull 命令直接获取,也可以自定义
        
        ~]# docker commit - m "install net-tools" -a "humingzhe" f6e060600b33 centos_with_nettools
            -m 选项后面可加改动信息, 
            -a 选项用于指定与作者相关的信息
            f6e060600b33e为容器ID , ID 后面是新容器的名称,如centos_with_nettools
    通过模板创建镜像
        通过模板导入镜像
            1. 下载模板
            在openvz.org 网站下载模板,国内下载速度较慢,我们可以到国内已经下载的GitLab上下载:比如CentOS 6 的minimal 模板,
            ~]# wget http://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz
            ~]# du -sh centos-6-x86-minimal.tar.gz
            2. 导入下载完成的CentOS 6 操作系统模板,导入成功后使用docker images 命令可查看导入的镜像
            ~]# cat centos-6-x86-minimal.tar.gz | docker import - centos6
                sha256:37814bd86e07fae34d432305c6f120544084760fa4969b920643648d8c8da6db
            ~]# docker images|grep -i centos6
            centos6                                                                                      latest                   37814bd86e07        32 seconds ago      512MB
    通过镜像导出文件,然后导入
        可以通过模板导入镜像,也可以导出,运行命令如
            ~]# docker save -o centos7_with_nettools.tar
            ~]# du -sh centos7 centos7_with_nettools.tar
        通过文件恢复镜像
            通过镜像导出的文件是可以恢复至本地镜像的, 恢复时可使用 --input 命令或反向重定向
                ~]# docker help load
                    -i, --input string   Read from tar archive file, instead of STDIN

                ~]# docker load --input centos7_with_nettools.tar
                ~]# docker load < centos7_with_nettools.tar
Docker的基本管理
    创建容器: docker create 命令,但并未运行
        ~]# docker create -it ubuntu bash
        #查看docker ps -a,注意~]# docker ps查看不到,因为尚未运行
        ~]# docker ps -a
    启动容器:docker start containerid
        ~]# docker start ${containerid}
        ~]# docker restart  ${containerid}
    关闭容器
        ~]# docker stop ${containerid}
    先创建容器,然后启动容器 ~]# docker run
        ~]# docker run -d centos bash
        
        docker run -name 命令可以给容器自定义名字
        ~]# docker run -name test -d centos bash
        
        docker run -rm 命令可以让容器退出井删除它
        ~)# docker run --rm -it centos bash -c "sleep 30"
    获取日志
        docker logs ${containerid}
    删除容器 docker rm
        docker rm ${containerid}
        如果容器处于运行状态可以加 -f选项
    导出容器docker export 并且可以迁移到其他服务器:cat filename | docker import - [镜像名]命令
        docker export ${containerid} > ${filename}.tar
        cat ${filename}.tar | docker import - ${imagename}
        
Docker 仓库管理
    镜像是从官网的公共仓库中直接拉取的,公共仓库所有的人都可以使用,很多企业做的项目不想公开发布,可以使用私有仓库
    
    1. 用registry 镜像在本地搭建私有Docker仓库(类似于GitLab 私有库)
        ~]# docker pull registry
            -p 选项可以把容器的端口映射到宿主机上,冒号左边是宿主机监听端口,冒号右边是容器监听端口。
        ~]# docker run -d -p 5000:5000 registry
            
    2. 将CentOS 6 镜像传到私有仓库上,上传前要给CentOS 6 镜像打标签
        ~]# docker tag centos6 192.168.222.131:5000/centos6
    3. 使用docker push 把标记后的镜像推送至私有仓库
        ~]# docker push 192.168.222.131:5000/centos6
        
        注意:如果推送后报错,提示要输入HTTPS,若不想使用HTTPS,可以编辑 /etc/docker/daemon.json 指定一个私有仓库
        ~]# vim /etc/docker/daemon.json
            {"insecure-registries":["192.168.222.131:5000"]}
        ~]# systemctl daemon-reload
        ~]# systemctl restart docker.service
    4. 重启Docker 服务后, registry 处于停止状态, 需要启动后再进行推送
        ~]# docker start ${registry_containerid}
        ~]# docker push 192.168.222.131:5000/centos6
        
        使用 ~]# curl 127.0.0.l:5000/v2/_catalog 命令可以查看推送到私有库中的镜像
            ~]# curl 127.0.0.l:5000/v2/_catalog
                {"repositories":["centos6"]}
    5. 使用docker pull +私有仓库IP+ Port 命令可下载私有库中的镜像
        ~]# docker pull 192.168.222.131:5000/ubuntu

Docker 数据管理
    容器是由镜像启动的,无论是关闭容器, 连是删除容器, 容器中存储的数据和更改的数据都会消失
    可以把宿主机的某个目录挂载到容器中,如创建 /data/ 目录,将容器生成的新数据全部写到 /data/ 目录下,也就是写到宿主机的磁盘中
    
    ~]# docker run -itd -v /data/:/data/ centos bash
        冒号前面的 /data/ 是宿主机的本地目录,
        冒号后面的 /data/ 是容器的目录,该目录如果不存在,则会在容器中自动创建。
        
        【注意】挂载目录时可指定容器名称,如果不指定, 则会随机定义。上面随机定义的名称是 unruffled_euclid
        docker run -tid -v 命令支持另外一种写法,可以不加冒号。如果不加冒号,就不需要把宿主机的目录做映射。
            -v 选项的意思是把该目录作为一个公共的目录,即要做一个数据卷容器
            
            ~)# docker run - itd -v /data/ --name unruffled_euclid centos bash
        
    当需要定义多个容器共享数据时,可以搭建一个专门的数据卷容器, 其他容器直接挂载该数据卷即可, 类似于Linux 中的NFS
        ~)# docker run -itd --volumes-from unruffled_euclid centos6 bash
    
Docker数据卷备份与恢复
    数据备份
        数据卷容器给本地宿主机目录做映射,根本不需要备份,只要定期复制硬盘数据即可。
        如果没有做映射, 直接执行docker run -v /data/ 需要借助中间容器进行备份。
            1. 在宿主机磁盘上创建一个 /data/backup 目录
            2. 再用 unruffled_euclid 数据卷新创建一个容器,同时把本地创建的 /data/backup 目录挂载到该容器的 /bak 目录下,容器的/bak 目录下新建文件,就可以直接在/data/ backup/目录中看到
            3. 最后把数据卷容器中的/data/ 目录下的文件打包成data.tar 文件并放到/bak 目录下,运行命令如下。
                ~]# docker run --volumes-from unruffled_euclid -v /data/backup/:/bak centos tar cvf /bak/data.tar /data/
                ~]# ls /data/backup/
    Docker 数据卷恢复
        先创建一个数据卷容器,再创建一个新的容器, 并挂载该数据卷容器, 最后将data.tar 包进行解包,运行命令如下。
            ~]# docker run -itd -v /data/ --name unruffled_euclid2  centos bash
                f03b7lc8761630e57783f7909a203904 d 27ef64125cf83e51 89903b6 61e9116c
            ~]# docker exec -it f03b71c8 bash
            / # ls /data/
            / # exit

            ~]# docker run --volumes-from unruffled_euclid2 -v /data/backup/:/bak centos tar xf /bak/data.tar
            ~]# docker exec -it f03b71c8 bash
            /] # ls /data/
            backup humingzhe . cn humingzhe. com mariadb mongodb mysq l redis

Docker 网络模式与外部访问容器
    Docker 共有4 种网络模式
        1. host 模式: 在执行docker run 命令时用 --net=host 选项指定,该模式下Docker 使用的网络和宿主机使用的网络是一样的,在容器内看到的网卡IP 就是宿主机的IP。
        2. container 模式:用选项 --net=container: container_id/container_name 指定,该模式是多个容器共同使用网络,看到的IP 都是一样的。
        3. none 模式:用 --net=none 选项指定,该模式下不会设置任何网络。
        4. bridge 模式:用 --net=bridge 选项指定, 是Docker 默认的网络模式。该模式会为每个容器分配一个独立的Network Namespace, 类似于VMWare 的NAT 网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间可以通信。
        
    外部访问容器
        Docker 宿主机启动容器监听的是80 端口,但是容器本身只在局域网内生效,宿主机之外的服务器是访问不到,要想其他的服务器也能访问,可以做端口映射。
            进入一个容器,在容器中安装Nginx 服务,运行命令如下。
            ~]# docker exec -it e9d0ab bash
            /]# yum install -y epel-release
            /]# yum install - y nginx
            /]#rpm -qa nginx
                nginx-1.12.2-1.el7.x86 64
                
            将容器导出为镜像,再使用新镜像创建容器并指定端口映射,运行命令如下。
            ~]# docker commit - m "install nginx" -a "humingzhe" e9d0abd69350 centos_with_nginx
            ~]# docker images
                REPOSITORY TAG IMAGE ID CREATED SIZE
                centos_with_nginx latest c48f60c0a154 13 seconds ago 389MB

            ~]# docker run -itd -p 8888:80 centos_with_nginx bash
                hostPort:containerPort (映射指定地址的指定端口)
            ~]# docker ps
            
            如果新建的容器启动Nginx 或httpd 服务时报Failed to get D-Bus connection:Operation not permitted 错误,在创建容器时加上一privileged -e "container-docker"选项
设置桥接网络
    Docker 默认的桥接网卡是 docker0。它只会在本机桥接所有的容器网卡,举例来说容器的虚拟网卡在主机 上看一般叫做 veth* 而 Docker 只是把所有这些网卡桥接在一起
    pipework 属于第三方开源网络工具,它能够实现跨宿主机容器网络互连
    
    1.设置网卡
        进入宿主机网卡设置目录,通过ifcfg-ens33 网卡复制一个新网卡,如br0 网卡
        ~]# cd /etc/sysconfig/network-scripts/
        ~]# cp ifcfg-ens33 ifcfg-br0
        ~]# vi ifcfg-br0
            TYPE=Bridge
            NAME=br0
            DEVICE=br0
        
        编辑ens33网卡,注释掉UUID 、IPADDR 、GATEWAY 、NETMASK 和DNS,新增BRIDGE=br0
        ~]# vim ifcfg-ens33
        #UUID=7cdel071-823a-4dlf-a7a5-82dd46e969f4
        #IPADDR=l92.168.222.131
        #GATEWAY=192.168.222.2
        #NETMASK=255.255.255.0
        #DNS1=114.114.114.114
        BRIDGE=br0
        
        网卡设置后重启网络服务(设置成功可ping 通,失败无法ping 通, 终端也会断开〉, 运行ifconfig 命令即可看到br0网卡
    
    2. 安装pipework 工具
        
        ~]# git clone https://github.com/jpetazzo/pipework
        ~]# cd pipework/
        ~]# cp pipework /usr/local/bin/
        ~]# pipework
    3. 开启一个容器,并给刚开启的容器设置IP ,然后进入容器,使用ifconfig 命令查看
        ~]# docker run -itd --net=none centos_with_nginx bash  =========>容器id:8caaf8537
        ~]# docker exec -it 8caaf853 bash
        /)# exit
        
        ~]# pipework br0 8caaf8537
            192.168.222.136/24@192.168.222.2
            
            192.168.222.136 是容器的IP,@后面的IP 是网关IP。
            若想使用LNMP 或SSHD等一些服务,则需要安装相应软件包,如安装Nginx 服务,安装后启动即可在浏览器中进行访问。
        ~]# docker exec - it 8caaf853 bash
        /)# ifconfig
        /)# ping humingzhe.com #可以ping 通,说明是可以连接外网的

DockerFile创建镜像
    DockerFile 格式
        1. FROM 用于指定基于哪个镜像, 格式是FROM<image>或FROM<image>:<tag>
            FROM centos
            FROM centos:latest
        2. MAINTAINER 用于指定作者信息,格式是MAINTAIN<name >
            MAINTAINER humingzhe admin@humingzhe.com
        3. RUN 是镜像操作指令,格式是RUN <command >或RUN ["executable","paraml","param2"]
            RUN yum install httpd
            RUN ["/bin/bash","-c","echo hello"]
        4. CMD 用于执行一些命令,它有3 种语法格式, 与RUN的语法格式类似, CMD指定容器启动时用到的命令只能有一条。
            CMD ["executable","paraml","param2"]
            CMD command paraml param2
            CMD ["paraml","param2"]

            CMD ["/bin/bash ","/usr/local/nginx/sbin/nginx","-c"," /usr/local/nginx/conf/nginx.conf" ]
        5. EXPOSE 是用来暴露端口的命令
            EXPOSE 22 80 8443 #把22 端口、80 端口、8443 端口暴露
            
            注意
                在启动容器时,可以加上-P (大写)选项让系统自动分配端口。如果想指定具体的端口,可使用-p (小写)选项来指定。
        6. ENV 用来定义环境变量,格式是<key><value>。
            ENV PATH /usr/local/mysql/bin:$PATH
            
            注意:ENV 主要为后续的RUN 指令提供一个环境变量,也可以自定义一些环境变量,如ENV MYSQL_version5.70
        7. ADD 命令是将本地的文件或目录复制到容器的某个目录下。其中,源为DockerFile 所在目录的相对路径,也可以是URL
            ADD <conf/vhosts> </usr/local/nginx/conf>
        8. COPY 命令和ADD 命令类似,语法格式也一致,不同的是COPY 命令不支持URL 远程下载。
        9. ENTRYPOINT 命令的格式类似于CMD 命令的格式,容器启动时要执行的命令也类似于CMD 命令,只有一条生效,如果写多条语句,只有最后一条语句会生效。
            不同的是, CMD 可以被docker run 命令指定覆盖,而ENTRYPOINT 不能被覆盖。
            ENTRYPOINT 不会被覆盖,而且比CMD 或docker run 指定的命令要靠前执行

            ENTRYPOINT ["echo","test"] 。执行docke1 run - it humingzhe 123 命令会先输出test,再输出123
        10. VOLUME 是用来指定挂载点的,可以创建一个从本地或其他容器挂载的挂载点,格式是VOLUME ["/data"]
        11. USER 指定运行容器的用户,恪式是USER daemon 。
        12. WORKDIR 用于指定一个目录, 指定目录后, 在目录下进行一些操作,如运行一些命令时,先进入到路径下, 或者在启动容器时,使用CMD 、ENTRYPOINT 指定工作目录。

        ~]# vim Dockerfile
        创建镜像
        ~]# docker build -t centos nginx
        
    docker compose 部署服务与示例
        使用docker-compose 命令可以快捷、高效地管理容器的启动、停止、重启等操作, 类似于Linux 中的shell脚本,基于yaml 语法,在YAML 文件中可以描述应用的架构,比如使用的镜像、数据卷、网络模式、监昕端口等信息。也可以在一个compose 文件中定义-个多容器的应用(比如jumpserver),然后通过该compose 启动这个应用。
        
        1. 下载最新版本的docker compose
            ~)# curl -L https://github.com/docker/compose/releases/download/1.10.0-rcl/docker-compose-`uname -s`-`uname -m` > /usr/local /bin/docker-compose
            ~]# du -sh /usr/local/bin/docker-compose
            ~]# chmod 755 !$
            ~]# docker-compose version
        2. 编辑docker-compose.yml 配置文件
            使用docker-compose up 命令启动配置文件中定义的容器,运行命令如下。
            ~]# docker-compose up -d

            使用docker-compose stop 命令可以停止配置文件中定义的容器
            ~]# docker-compose stop
            
            更多查看
            ~]# docker-compose --help
            
            docker-compose 语法的参考文档网址是http://www.web3.xin/index/article/182.html
            
            Docker 官方的GitHub提供的一些Dockerfile优秀案例。https://github.com/docker-library
    
【补充】在docker容器中安装软件,并重新生成镜像
    1、首先应该进入已经运行的容器:
        docker exec -it [容器名或容器ID] /bin/bash
    2、在容器里查看镜像所使用的的Linux版本
        cat /etc/issue
        / # cat /etc/issue
        Welcome to Alpine Linux 3.9
        Kernel \r on an \m (\l)
        【注意】
            Alpine 软件管理器使用的是apk
            Centos 软件管理器使用的是yum
            ubuntu 软件管理器使用的是apt-get
    3、更新apk管理仓库
        apk update
    4、安装软件
        apk add 工具名称     如:
        apk add ipmitool
    5、提交已修改或者安装过软件的容器,生成新的镜像
        docker commit <container_id> <image_name>
            container_id :修改容器的ID
            image_name : 镜像名称可以自己定义注:之后就可以对生成的镜像进行打包,移植到其他宿主机上运行(特别是离线环境下)。

    【补充安装yum】
    新建一个目录用来保存yum安装包 
    mkdir install
    进入文件夹并输入命令
    wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz
    解压
    tar -xvf yum-3.2.28.tar.gz
    重点:解压后先不着急安装,手动创建一个yum的conf文件,不然会报找不到文件的错yum.cli:Config Error: Error accessing file for config file:///etc/
    touch /etc/yum.conf
    进入yum目录,脚本安装
    cd yum-3.2.28
    ./yummain.py install yum
    期间会提示安装新版本,y回车即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值