Docker

作者: 爪洼程序员一枚 | 来源:发表于2020-12-15 23:05 被阅读0次

    一、docker服务常见命令

    安装docker
    yum -y install docker
    1.查看docker版本
    命令: docker -v


    image.png

    2.启动docker
    命令: systemctl start docker
    3.关闭docker
    命令: systemctl stop docker
    4.看到docker运行状态
    命令: systemctl status docker (此时我已经开启了docker)


    image.png
    因为开启了docker 所以会出现红框中 active running
    5.重启docker
    命令:systemctl restart docker
    6.开机启动docker
    命令:systemctl enable docker

    总结:


    image.png

    二、docker镜像相关命令

    1.查看本地镜像
    命令: docker images

    image.png
    这里新装的docker 本地没有镜像 所有只有表头
    2.搜索远程镜像
    例如我们需要redis镜像,首先我们去查询一下是否有redis镜像
    命令:docker search redis
    ![image.png](https://img.haomeiwen.com/i11123638/b4f83f8ce2f8b20c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
    3.拉取远程镜像
    命令:docker pull redis:5.0 (名称 :版本号)
    这里(redis:5.0) :号后的为版本号,如果不写默认为最新 latest
    image.png
    下载完成后,再查看本地镜像,redis 5.0 已经下载到本地
    image.png
    这里注意:版本号不能乱写,我们需要到 hub.docker.com 网址查找对应的软件版本号,这里以redis为例子。
    image.png
    image.png
    这里看到 5.0 tag版本号是有的,不是乱写的。
    4.删除本地镜像
    本地已有镜像
    image.png
    删除指定镜像 命令: docker rmi 镜像ID
    docker rmi 5a3c8e192943
    image.png
    注意:假如两个镜像的ID一样,删除命令可以用 docker rmi REPOSITORY:TAG
    遇到如下错误,就可以使用这种方法:
    image.png
    了解:删除所有的镜像
    image.png
    总结:
    image.png

    docker容器相关命令

    容器由镜像来产生,就好比镜像是一个类,容器就是实例。
    1.查看容器、创建容器、进入容器
    参数含义:
    -i :一直保持运行,就是说客户端没有连接该容器,该容器也会一直保持运行。
    -t :一个终端,可以进入容器输入一些命令 ,可以和i 连着写-it
    --name :给这个容器取一个名字
    镜像名:版本号 :以哪一个镜像创建容器
    /bin/bash :进入容器的一个初始化值
    命令: docker run -it --name=c1 镜像名:版本号 /bin/bash

    image.png
    表示已经进入容器。@后就是容器的ID
    查看容器里面的内容:
    image.png
    退出容器:exit
    image.png
    查看docker 里面有哪些运行的容器:
    命令: docker ps
    image.png
    注意:这里只有表头,但是我们刚才 运行了一个redis容器为什么没有,应为用 -it 这个命令创建运行的容器,在exit执行以后,该容器会关闭。
    命令: docker ps -a 关闭和没关闭的容器都可以看到
    image.png
    第一种创建容器的特点:(终端)
    1创建以后立马进入该容器 2 exit执行以后,会关闭该容器
    第二种创建容器
    参数:d 后台运行该容器。
    特点:后台运行。1创建以后不会立马进入容器,需要执行命令才会进入该容器。2exit执行以后,不会自动关闭该容器。
    命令:docker run -id --name=c2 redis:5.0
    image.png
    此时没有进入容器 执行 docker exec -it 容器名字 /bin/bash
    image.png
    退出容器,但是不关闭容器,容器依旧运行着
    image.png
    总结:
    image.png
    4.启动容器
    先查看容器运行的状态,c2状态为关闭,执行 docker start 容器名
    image.png
    c2容器已经启动
    5.停止容器
    先查看容器运行的状态
    image.png
    执行停止命令: docker stop 容器名
    image.png
    此时c2容器已经关闭,状态已经为exited
    6.删除容器
    注意:容器停掉以后,才能删除容器
    命令: docker rm 容器名 (以r1容器为例)
    image.png
    此时 r1已经被删除
    根据所有的容器id删除所有容器(如果出错,请先关闭正在运行的容器)
    docker rm docker ps -aq
    7.查看容器信息
    命令: docker ps -aq 查看所有容器的id
    image.png
    命令:docker inspect 容器名 查看容器的信息
    image.png
    小结:
    image.png

    三、docker容器的数据卷

    1.数据卷 简单理解为一个文件或者目录


    image.png

    2.配置数据卷


    image.png
    注意:~相当于 root ,宿主机中 可以写~或者/root ,容器中必须写为/root
    命令:docker run -it --name=r1 -v ~/data:/root/data_container 镜像名:版本号
    image.png

    在宿主机上:/root/data 下创建了一个hhb.txt


    image.png
    在容器里面/root/data_container 也有hhb.txt文件
    image.png
    image.png
    删掉了容器,宿主机/root/data 下依然还有hhb.txt。

    docker数据卷容器


    命令:docker run -it --name=c3 -v /volume redis:5.0 创建一个数据卷容器


    image.png

    命令:查看创建的c3容器的信息 docker inspect c3


    image.png
    这是我们创建两个容器c1 c2 挂载到c3 容器上,如下都会有一个volume目录
    命令:docker run -it --name=c1 --volumes-from c3 redis:5.0 /bin/bash
    命令:docker run -it --name=c2 --volumes-from c3 redis:5.0 /bin/bash
    image.png
    image.png
    image.png

    在c2容器 volume目录下创建了一个test.txt文件


    image.png
    我们去c1容器 volume目录下查看是否有test.txt文件
    image.png
    数据卷小结:
    image.png

    四、docker应用部署

    MySql部署

    image.png

    在docker容器中部署Mysql,然后通过外部MySql客户端去操作mysql。
    1.搜索镜像
    docker search mysql
    2.拉取Mysql镜像
    docker pull mysql:5.7


    image.png

    3.创建容器


    image.png
     docker run -id \
    -p 3307:3306 \
    --name=c_mysql \
    -v $PWD/conf:/etc/mysql/conf.d \
    -v $PWD/logs:/logs \
    -v $PWD/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    mysql:5.7
    
    

    执行:


    image.png

    进入到mysql容器内部:
    docker exec -it c_mysql /bin/bash
    登录mysql
    mysql -uroot -p123456


    image.png

    3.操作容器中的MySql
    我们随意创建一个数据库docker:


    image.png
    现在我们使用本机的mysql客户端去连接:
    image.png
    如果连接失败:
    在虚拟机中执行:vim /usr/lib/sysctl.d/00-system.conf,在末尾添加net.ipv4.ip_forward=1
    image.png

    然后重启network服务: systemctl restart network
    重启docker的mysql容器后就可以连接成功。
    在客户端 建user表插入两条数据


    image.png
    在docker中mysql查看数据
    image.png

    tomcat部署

    1.搜索tomcat镜像
    docker search tomcat
    2.拉取tomcat镜像(没有指定版本号,默认下载是最新的)
    docker pull tomcat


    image.png

    3.创建容器


    image.png
    4.部署项目
    外部机器访问tomcat
    把打包的项目放在 /root/tomcat 目录下,如果访问失败,重启docker容器。

    Nginx部署

    1.搜索Nginx镜像
    docker search nginx
    2.拉取Nginx镜像
    docker pull nginx
    3.创建容器
    首先我们需要创建一些目录


    image.png
    user nginx;
    worker_processes  1;
    error_log /var/log/nginx/error.log warn;
    pid       /var/run/nginx.pid;
    events {
        worker_connections  1024;
    }
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;i
        #tcp_nopush     on;
    
        keepalive_timeout   65 ;
        include /etc/nginx/conf.d/*.conf;
    }
    
    

    然后退出到nginx目录下:

    image.png
    docker run -id --name=c_nginx \
    -p 80:80 \
    -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v $PWD/logs:/var/log/nginx \
    -v $PWD/html:/usr/share/nginx/html \
    nginx
    
    image.png

    在html目录下创建index.html页面


    image.png

    4.测试访问
    启动 nginx 容器


    image.png
    image.png

    Redis部署

    1.搜索Redis镜像
    docker search redis
    2.拉取Redis镜像
    docker pull redis:5.0
    3.创建容器,设置端口映射
    docker run -id --name=c_redis -p 6379:6379 redis:5.0


    image.png

    redis容器已经启动:


    image.png
    4.测试访问
    使用外部机器连接redis
    image.png
    在redis-cli.exe文件当前目录下,cmd,执行一下命令:
    redis-cli.exe -h reids服务器的ip地址 -p reids服务器的端口号
    image.png
    此时已经连接上我们部署的redis服务器。我们可以进行一些简单的操作。
    image.png

    五、Dockerfile (用来制造docker镜像)

    1.Docker 镜像原理

    image.png
    image.png image.png

    总结:
    1.bootfs相当于系统的内核,而我们创建启动docker需要依赖操作系统,所以直接复用宿主机的内核,不用在加载,docker和宿主机的内核共用一个,所以docker启动会很快。
    2.在内核上我们可以叠加许多rootfs基础镜像,以及其他镜像 比如这里 jdk,tomcat镜像。当我们去下载tomcat镜像时,会查询所需要的镜像是否已经下载,如果没有,就需要下载所需要的镜像,这里rootfs基础镜像以及 jdk镜像。所以我们只下载tomcat镜像时,却会下载几百M的数据(rootfs基础镜像+ jdk镜像)。
    3.当我们去下载ngnix镜像时,他需要去下载rootfs基础镜像,此时我们已经下载过tomcat镜像,rootfs基础镜像已经被下载加载过了,就不需要再次下载rootfs基础镜像,达到了一个复用的作用。
    4.只读镜像,这些镜像不可以修改,修改了别人就不能复用了。


    image.png

    2.Dockerfile 概念及作用

    Docker 镜像如何制作?
    一、第一种
    1.容器转为镜像
    命令:docker commit 容器id 新的镜像名称:版本号
    镜像不可以传输给别人,但是可以变成压缩文件传给别人。当我们一个容器(tomcat)部署了一个项目时,我们直接变成压缩文件给测试人员,测试人员把压缩文件转为镜像,可以直接拿来测试,不需要再次部署项目。
    2.镜像转为压缩文件
    o表示 output
    命令:docker save -o 压缩文件名称 镜像名称:版本号
    3.压缩文件转换为另一个镜像
    i代表:intput
    命令:docker load -i 压缩文件名称
    注意:
    通过这种方式挂载的目录文件会丢失,不是挂载目录下文件不会丢失。
    二、第二种 dockerfile

    image.png
    查看别人的dockerfile是怎么写的找到对应的版本直接点进去:以mysql5.7为例
    https://github.com/docker-library/mysql/blob/ee33a2144a0effe9459abf02f20a6202ae645e94/5.7/Dockerfile.debian
    image.png

    3.Dockerfile 关键字语法

    Dochub网址: https://hub.docker.com

    image.png
    image.png

    4.案例

    第一个案例:
    自定义一个centos7镜像,要求:
    1.默认登录路径为/usr
    2.可以使用vim
    实现步骤:
    (1)定义父镜像:FROM centos:7
    (2)定义作者信息:MAINTAINER hhb hhb@it.cn
    (3)执行安装vim命令:RUN yum install -y vim
    (4)定义默认的工作目录:WORKDIR /usr
    (5)定义容器启动执行的命令:CMD /bin/bash
    创建dockerfile文件:

    image.png
    执行vim centos_dockerfile后输入:
    FROM centos:7
    MAINTAINER hhb <hhb@it.cn> 
    RUN yum install -y vim
    WORKDIR /usr
    CMD /bin/bash
    

    创建好centos_dockerfile文件后,使用build命令构建镜像:
    最后的 . 代表寻找路径
    命令:docker build -f dockerfile文件路径 -t 新镜像的名称:版本 .


    image.png
    image.png

    正常方法使用自己创建的镜像就行。

    第二个案例:
    步骤:
    部署soringboot项目:
    自己创建一个springboot项目,打包成jar包

    image.png
    测试jar包是否有问题:
    image.png
    image.png
    正常运行,说明打包的jar没有问题。
    把jar包放在linux系统的root目录下:
    image.png
    把jar包放在docker-files目录下,准备添加到我们自己创建的dockerfile中,然后创建镜像:
    执行vim springboot_dockerfile后输入下面代码:
    FROM java:8    #定义父镜像
    MAINTAINER hhb <hhb@it.cn>  #定义作者信息
    ADD docker-0.0.1-SNAPSHOT.jar app.jar  #将jar包添加到容器
    CMD java -jar app.jar  #定义容器启动执行的命令
    

    通过dockerfile构建镜像: docker build -f dockerfile文件路径 -t 镜像名称:版本


    image.png

    最后通过镜像创建容器:


    image.png
    测试我们的app镜像时候能访问到springboot项目:
    image.png

    五、Docker 服务编排

    image.png

    Docker Compose服务编排工具:


    image.png

    1.安装docker compose

    在安装compose之前,需要先安装docker,我们以编译好的二进制方式安装在Linux系统中

    curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    

    设置文件可执行权限

    chmod +x /usr/local/bin/docker-compose
    

    查看版本信息

    docker-compose -version
    
    image.png

    2.卸载docker compose

    二进制包方式安装的,删除二进制文件即可

    rm /usr/local/bin/docker-compose
    

    3.使用docker compose编排ngnix+springboot项目

    (1)创建docker-compose目录

    mkdir  ~/docker-compose
    cd ~/docker-compose
    

    (2)编写docker-compose.yml文件 (文件必须为这个名字)
    执行 vim docker-compose.yml 命令后输入下面内容:

    version: '3' 
    services: 
     ngnix: 
      image: nginx 
      ports: 
        - 80: 80 
      links: 
        - app 
      volumes: 
        - ./nginx/conf.d:/etc/nginx/conf.d 
     app: 
      image: app 
      expose: 
       - "8080" 
    

    含义解释:

    version: '3'  //版本号
    services:    //我们要创建启动哪些容器
     ngnix:      //容器1
      image: nginx     //通过哪个镜像启动,这里是nginx镜像,后面没有写版本号,为latest
      ports:     //端口映射
        - 80:80     //宿主机80端口映射到容器80端口, ‘-’   这个符号代表数组的意思
      links:    //当前项目可以访问到的其他项目
        - app   //对应app项目
      volumes:  //目录挂载,也就是数据卷
        - ./nginx/conf.d:/etc/nginx/conf.d          //宿主机./nginx/conf.d挂载到容器/etc/nginx/conf.d
     app:    //容器2
      image: app   //app镜像我已经在前面创建过了,包含了一个springboot项目
      expose:  //对外暴露的端口
       - "8080"
    

    (3)创建./nginx/conf.d目录

    mkdir -p ./nginx/conf.d
    

    (4)在./nginx/conf.d目录下编写hhb.conf文件
    listen 80; 监听的端口
    access_log off; 日志关闭
    location / {
    proxy_pass http://app:8080; //反向代理到的路径
    }

    server{
      listen 80;
      access_log off;
      location / {
        proxy_pass http://app:8080;
      }
    }
    

    (5)退出到docker-compose.yml文件所在的目录后,直接启动

    image.png
    image.png
    在浏览器中访问linux系统ip地址:80端口
    访问http://192.168.0.105/hello这里hello是我在springboot项目中中写的一个controller,然后返回的hello my dockerfile这段文字。
    image.png

    六、Docker 私有仓库

    1.搭建私有仓库

    当我们的服务器无法访问互联网,或者不想把我们的镜像上传到公网上,就可以搭建一个私有仓库
    (1)拉取私有仓库镜像

    docker pull registry
    

    (2)启动私有仓库

    docker run -id --name=registry -p 5000:5000 registry
    

    (3)打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
    (4)修改daemon.json
    追加下面内容阿里镜像加速器

    vim /etc/docker/daemon.json
    

    在上述文件中国添加一个key,保存退出。此步用于让docker 信任私有仓库地址;注意私有仓库服务器ip修改为自己私有仓库服务器真是ip
    {"insecure-registries": ["私有仓库服务器ip:5000"]}
    (5)重启docker 服务

    systemctl restart docker
    

    执行测试:


    image.png
    image.png

    这里私有仓库已搭建成功,要让我们的私有仓库能用,必须让docker信任我们的私有仓库。


    image.png
    image.png

    2.上传镜像到私有仓库

    (1)标记镜像为私有仓库的镜像
    docker tag centos:7 私有仓库服务器ip:5000/centos:7
    (2)上传标记的镜像
    注意:1删除标记的镜像使用镜像的名称来删除,使用id的话,会发现被标记的镜像和生成的标记镜像id相同 2记得启动创建的registry私有仓库容器,不然上传会报错,连接拒绝。

    docker push 私有仓库服务器ip:5000/centos:7
    
    image.png
    image.png

    3.从私有仓库拉取镜像

    方便测试,我们先删除生成的标记对象


    image.png

    拉取命令:

    docker pull 私有仓库镜像名称:版本号
    

    七、docker容器虚拟化与传统虚拟机比较

    image.png

    相关文章

      网友评论

          本文标题:Docker

          本文链接:https://www.haomeiwen.com/subject/wmkggktx.html