开发人员要学的Docker从入门到日常命令使用(通俗易懂),专业运维人员请勿点!

一、介绍Docker

 1.引言

      问题1:开发人员告诉测试说自己的项目已经做好了,给你一个发布包,你去测试吧。

                  ## 测试人员,为什么我运行会报错?

                  ## 开发人员说,我本地运行没有问题呀!

                  解答***环境问题

      问题2:一台linux服务器,多个同事一起使用,突然有个同时在程序不小心写了一个死循环,导致linux卡死!

                 解答**多用户使用linux时,隔离问题

      问题3:天猫双十一,用户爆发性增长,需要扩展很多台服务器。

                  如果双十一部署几百台、几千台服务器,公司运维一台台部署,调试环境,可以累死,运维成本高。

                  解答****docker可以实现弹性伸缩,快速扩展。降低运维成本,一个命令,快速部署上百台服务器。

  2.Docker概述

   2.1 Docker的由来

        一帮年轻人,开了一家公司,2010年的时候做pass平台。

        当时所罗门这个公司发展的特别好。

        到了2013年,亚马逊,谷歌,微软也开始做pass平台,

         业务被互联网巨头抢走了,所罗门为了不让自己三年的技术白费,讲pass平台的核心技术进行开源,这个技术就是docker

        后来,开源的docker被业界人士认可,后期得到了融资,于是该团队专门做docker的维护与升级工作。

         这个是docker的作者之一,

              

 

         后来docker的主要作者离开了团队,原因是朋友的公司却少CEO

         当时这个作者想的是 docker维护的非常好了,有我没我都一样了,于是就走了。就如目前的python创始人一样,

          现在python社区也是很棒的。

          

 

 3 Docker的思想

       1.集装箱

                将所有需要的环境,全部放到一个集装箱中,谁需要使用这个环境,直接拿到这个集装箱就可以了。

                集装箱的专业术语就是镜像,可以理解为把代码打包成一个压缩包

       2.标准化

               一、运输的标准化:docker有一个超级码头,所有的集装箱都放在这个超级码头里面,谁需要直接去获取即可。

                                                超级码头理解成一个仓储,里面有很多镜像

               二、运行方式标准化:docker提供了统一的命令,可以直接通过命令去码头搬运自己需要的集装箱。

               三、提供了REST的API:docker有一个REST API,可以实现图像化界面操作,Rancher就是一种。

       3.隔离性

                docker在运行集装箱的内容时,在linux内核中开辟了一个独立的空间,用来运行集装箱的内容。

 二、安装Docker

         1.安装依赖

                  yum install -y  yum-utils  device-mapper-persistent-data  lvm2

         2.设置下载docker的镜像源,提高速度

                 # yum-config-manager    --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

                 # yum makecache  fast

          3.安装docker社区版

                # yum install -y  docker-ce

         4.启动docker并设置开启自动启动

                # systemctl   start  docker

               # systemctl   enable   docker

          5.运行docker的hello-world镜像进行测试 是否安装成功。

                 # docker  run  hello-world  如果电脑网络不好,会导致拉取失败。因为本地没有这个镜像,需要去外网拉取

  三、Docker的镜像操作

         1、注册中心的选择

                         http://hub.daocloud.io           https://hub.docker.com        .....拉取镜像的网站

          2、拉取镜像到本地

                         docker pull  镜像[:tag]    # 拉取镜像

                         docker pull daocloud.io/daocloud/helloworld-go:latest    #去daocloud.io 拉取的方式

                         如果公司有私服,可以去公司的地址下载

                        docker pull  192.168.1.11:5000/.net-core:2.2.26

                        如果在公司拉取镜像失败,可以手工创建一个daemon.json

                         vim /etc/docker/daemon.json

                         {

                             "registry-mirrors":["https://registry.docker-cn.com"],

                               "insesure-registries":["192.168.1.11:5000"]

                         }

                         #成功后并重启

                            systemctl  daemon-reload

                            systemctl  restart docker

            3、镜像的操作

                 docker images  #查看全部的镜像

                 docker  rmi  镜像id     #删除镜像id

             4、镜像的导入导出

                     docker save  -o /usr/local/mysite.tar  mysite:1.0  # 导出mysite:1.0到 /usr/local/下的mysite.tar 注意导出的格式是tar

                     docker load -i mysite.tar  # 可以将此tar发给其他人,然后通过此tar包,完成镜像的加载,等价于 "docker  pull   ....."

              5、Daocloud

                     这个地址是国内的,网速很快。访问官网并注册,然后在terminal中下载daocloud中的镜像:

                        docker login daocloud.io  #在终端登录

                        docker pull  镜像名:tag   # 在daoclod官网中搜索镜像,复制镜像名和tag,就可下载镜像

   四、Docker容器的操作

                  一个镜像可以启动多个容器,每个容器都独立运行,容器间互相隔离。

                  即,一个运行成功的镜像,叫做容器。一个镜像可以多次运行,产生多个容器

             1、运行镜像

                     docker run 镜像id  #直接运行容器,并占满整个界面

                     docker run -d 镜像的id   #后台运行

                     docker run -d -p 宿主机端口:容器端口  镜像id #运行容器的同时,让容器的端口映射宿主机的端口

                     docker run -d -p 宿主机端口:容器端口  --name 容器名称  镜像id #运行容器的同时,指定容器名称

            2、查看容器

                       docker ps            #查看正在运行的容器

                       docker  ps -a            #查看全部的容器,包括没有在运行的

                       docker ps -qa                           #查看全部容器的id

                       docker exec -it 容器id bash     #进入容器的命令行中。

                           进入 之后的状态  root@c766775hgj87:/usr/local/iis/webapps/# ls

                       docker cp  .net-core.tar  c766775hgj87:/usr/local/iis/webapps/ #把linux的 .net-core.tar 复制到容器里面。

                       exit                                             #退出容器命令界面

            3、查看容器日志

                         docker logs   -f    容器的id  #由于后台启动,无法查看日志,使用此命令,可以查看后台容器日志

            4、容器的停止和删除

                        docker stop 容器id                     #停止容器

                        docker stop  $(docker ps -qa)  #停止全部容器

                        docker rm  容器id                       #删除容器

                        docker rm   $(docker ps -qa)     #删除全部容器

五、数据卷

              通过exec进入到容器的terminal中后,发现容器中的Linux发行版和咱们使用的不一样。

              因为容器是纯净的,进入之后,无法使用vim等命令,需要容器里面更新安装,这些很占内存,并且时间也很漫长。

             数据卷的存在成功的解决了这个问题,讲宿主机的目录映射到容器的一个目录,然后宿主机的目录和容器中的目录是同步的,这就可以在宿主机进行文件的编辑。在容器中文件也会实时的变动。

              #在启动项目时,直接指定数据卷  volume

               docker run -d -p 宿主端口:容器端口   --name  容器名称 -v 数据卷名称:容器指定的路径  镜像id     

             #如果宿主数据卷不存在,默认存放到了 /var/lib/docker/volumes/数据卷名称/_data/

              

               #如果数据卷存在的话,启动容器

                docker run -d -p 宿主端口:容器端口   --name  容器名称 -v 数据卷全路径:容器指定的路径  镜像id     

                #举个例子

                docker run -d -p 8080:8080 --name IIS -v    /var/lib/docker/volumes/数据卷名称:容器指定的路径  镜像id  

                 ---------常用命令----------

                 #如果事先创建数据卷,会造成最开始容器目录和数据卷无法同步---尽量不要单独创建

                      docker volume create 数据卷名称  

                 #删除数据卷

                      docker  volume  rm 数据卷名称

                 #查看全部的数据卷

                       docker volume  ls

                #查看数据卷的详细信息

                       docker volume  inspect  数据卷名称

**数据库安装

   这里 我们安装一个Mysql 这个安装快捷

    docker  run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root  --name mysql  daocloud.io/library/mysql:latest

 

六、自定义镜像(Dockerfile)记住D是大写的

   为了部署项目,需要单独的启动一个dotcore的容器,并且手动将发布包复制到指定的数据卷位置。

    部署完毕,需要执行命令运行dotcore项目,dotnet  webapp.dll

Dockerfile  -> 是自己创建的一个文件
form  依赖的镜像路径
copy 将你宿主机的内容复制到容器中一份
workdir 容器会在你指定的路径
cmd   需要执行的命令(在workdir中执行指定的命令,cmd可以写多个,但是以最后一个为准 )

1、部署netcore

      准备一个发布包

 2、编辑Dockerfile

from docker.io/microsoft/aspnetcore   #下载依赖的镜像文件
copy  webapp /usr/local/              #当前根目录有个发布包 叫webapp 复制到容器里面的/usr/local/expose 8080                           #表示暴露出来的端口号,和容器的端口号对应。这里默认是80。
workdir /usr/local/                   #表示你的asp.net core web应用放在容器的哪个目录,这里是/usr/local目录,没有会自动创建
cmd  ["dotnet","webapp.dll"]          #表示执行的命令,即运行我们自己的asp.net core web程序

 3、在widows编辑好Dockerfile编辑好之后,扔到linux中

 4、构建自定义镜像

        docker build -t 镜像名:tag   #一定要在Dockerfile的当前目录下执行,并且asp.net core 也在当前目录

5、运行构建的镜像

         docker run -d -p 宿主端口:容器端口  --name  名称  镜像id

 

七、Doker-Compose

  将运行容器时,需要的全部配置都写在一个固定的docker-compose.yml文件中

  Docker-Compose  可以批量管理容器

1、下载并安装DockerCompose

      1.去github上下载docker-compose可执行文件

               wget https://github.com/docker/compose/releases/down/1.24.1/docker-compose-Linux-x86_64

       2.修改名字

              mv docker-compose-Linux-x86_64 docker-compose

        3、修改docker-compose的权限

                 chmod 711 docker-compose

        4、将docker-compose 移动到 /usr/local/docker-compose/bin

                    mkdir  -p /usr/local/docker-compose/bin

                     mv docker-compose   /usr/local/docker-compose/bin

          5、配置环境变量

                  vi  /etc/profile

                       Shift +G    跳转到最后一行

                       export PATH=$JAVA_HOME/bin:/usr/local/docker-compose/bin:$PATH

                        保存并退出

                 输入 source /etc/profile  

          6、在任意目录输入 docker-compose

2、准备一个针对管理MYSQL的yml文件

建立一个目录,然后进入该目录,在该目录编辑yml文件

         mkdir  compose_mysql

         cd  compose_mysql

         vim   docker-compose.yml  

 

 

 注意问题:

                  1、yml文件是不允许编辑制表符  \t  tab键  可以敲空格键

                   2、容器越来越来多注意端口、容器服务器命名问题。

启动docker-compose管理的容器

                     docker-compose  up  -d    #启动docker-compose管理mysql

                     docker-compose  down     #关闭docker-compose管理mysql

 

 3、通过Dockerfile和docker-compose定义自定义镜像

       1、定义docker-compose.yml

            

version: '6.6'
services:
         app:
                restart:always
                 build: 
                       context: ../               #指定Dockerfile所在的路径               
                       dockerfile:Dockerfile      #指定Dockerfile的名称
                 image:app:1.2                    #指定镜像的名称
                 container_name:app               #容器名称
                 ports:
                        - 80:80                   #端口号
                  environment:
                          TZ:Asia/Shanghai

     2、定义Dockerfile

        

from  docker.io/microsoft/aspnetcore
copy app  /usr/local/
workdir  /usr/local/
cmd  ["dotnet", "app.Web.dll"]

      3、将准备好的内容丢到LInux并执行命令

            docker-compose  up  -d  #构建镜像并允许容器

      4、docker-compose的常用命令

            docker-compose up  -d            #允许docker-compose管理的内容名

            docker-compose  down            #关闭,并删除容器

            docker-compose  stop              #停止允许容器

            docker-compose  start              #启动已经存在的容器

            docker-compose    ps              #查看docker-compose管理的全部容器

            docker-compose  logs  -f         #查看docker-compose管理的容器和日志

    注释:上面的命令是你管理当前路径的yml目录的容器,如果你在其他路径建立的yml,需要进入到该路径进行运行。

 

 

以上命令,开发人员学会了,就可以了。不需要学习太深,更专业的底层交给运维人员去处理就行了。

 

posted @ 2020-07-11 10:38  畅聊科技  阅读(495)  评论(0编辑  收藏  举报