美文网首页
微服务中的容器技术---Docker(一),Docker的安装和

微服务中的容器技术---Docker(一),Docker的安装和

作者: singleZhang2010 | 来源:发表于2020-12-22 15:00 被阅读0次
    Docker

    概述

    在微服系统中,因为服务特别多,如果手动部署以及启动、重启等工作会比较繁琐,这里会涉及到自动化部署,自动化部署就需要用到容器技术,虽然这里基本属于运维范畴,但是开发者还是需要了解一下,以及简单操作使用需要会。
    现在比较热门的容器技术当然还是Docker了。关于容器和Docker的名词解释请百度/Google/Bing一下,解释比较详细,这里不过多描述。

    Docker生命周期

    Docker生命周期

    Docker安装

    1. 安装环境如下:
    [root@localhost etc]# cat redhat-release
    CentOS Linux release 7.6.1810 (Core) 
    
    [root@localhost etc]# uname -r
    3.10.0-957.10.1.el7.x86_64
    
    #节点1
    [root@localhost etc]# hostname -I
    192.168.0.241 
    
    #节点2
    [root@localhost ~]# hostname -I
    192.168.0.242 
    
    1. 开始安装,一次输入以下指令
    > 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.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
    
    > yum install docker-ce -y
    
    #可以安装前查看仓库中的docker所有版本,并选择特定版本安装,如17.12.0
    #选择版本的时候需要注意不要过高,需匹配containerd.io的版本
    #出现containerd.io版本错误,可以降低docker版本或者更新containerd.io版本
    > yum list docker-ce --showduplicates | sort -r
    > yum install docker-ce-17.12.0.ce
    

    显示下图,安装完毕


    docker 安装完毕
    1. 开始配置
    #修改配置
    > vim /usr/lib/systemd/system/docker.service
    #找到ExecStart,开启远程API访问端口:-H 192.168.0.241:2375
    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H 192.168.0.241:2375
    
    #修改完,保存并重启docker服务
    > systemctl daemon-reload &&  systemctl enable docker.service && systemctl restart docker
    

    查看网桥信息

    > docker network inspect bridge
    

    默认的为:172.17.0.0/16,也可以修改上述配置文件docker.service中的ExecStart参数,添加自定义ip段,如:--bip 10.0.0.1/16,这里不作修改保持默认。


    image.png
    1. 访问192.168.0.241验证一下配置是否正确
    > docker -H 192.168.0.241 info
    
    1. 显示信息如下:
    docker 验证

    Docker基础命令操作

    • 查看docker相关信息:docker version
    > docker version  
    

    显示如下

    docker
    • 配置docker中国镜像加速
      有时候默认的镜像源比较卡会超时,出现类似以下的错误

    docker: error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/ae/ae2feff98a0cc5095d97c6c283dcd33090770c76d63877caa99aefbbe4343bdd/data?verify=1608604222-lIzhXR%2Fys89hEl3C9yzHrbN6mSQ%3D: net/http: TLS handshake timeout.

    可以更新一下源的配置来加速

    > vi /etc/docker/daemon.json
    #加入以下内容
    {
      "registry-mirrors": ["https://registry.docker-cn.com"]
    }  
    #当然,也可以使用其他源在后边加逗号添加地址即可
    #比如阿里云镜像https://xxx.mirror.aliyuncs.com,这里的xxx为系统分配前缀 。
    

    修改完记得重载、重启

    systemctl daemon-reload && systemctl restart docker
    
    • 启动第一个容器
    > docker run -d -p 80:80 nginx
    # 没有的话会从源上 拉取一个镜像
    

    如下图所示

    nginx image

    ※这里出现一个错误,因为服务器中之前安装过lnmp,所以启动docker中的nginx的时候,提示80端口被占用了,这里需要关闭原来的nginx

    > lnmp nginx stop
    

    访问http://192.168.0.241,显示如下


    nginx

    参数说明如下:

    parameter introduction
    • 搜索仓库中的镜像
    #如搜索redis 镜像
    > docker search redis
    #显示结果如下:
    
    image.png

    参数说明


    parameter introduction
    • 获取镜像
    > docker pull redis
    
    #如果镜像是第三方镜像,则需要加具体第三方地址
    > docker pull index.tenxcloud.com/tenxcloud/httpd
    
    • 获取完之后可以查看镜像
    [root@localhost docker]# docker image list
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    nginx        latest    ae2feff98a0c   6 days ago    133MB
    redis        latest    ef47f3b6dc11   10 days ago   104MB
    
    • 导出镜像
    [root@localhost docker]# docker image save redis > docker-redis.tar.gz
    [root@localhost docker]# ls
    daemon.json  docker-redis.tar.gz  key.json
    
    • 删除镜像
    [root@localhost docker]# docker image rm redis:latest
    
    #查询镜像列表
    [root@localhost docker]# docker image list
    REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
    nginx        latest    ae2feff98a0c   6 days ago   133MB
    
    • 导入镜像
    [root@localhost docker]# docker image load -i docker-redis.tar.gz
    
    #查询镜像列表
    [root@localhost docker]# docker image list
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    nginx        latest    ae2feff98a0c   6 days ago    133MB
    redis        latest    ef47f3b6dc11   10 days ago   104MB
    
    • 查看镜像的详细信息
    [root@localhost docker]# docker image inspect redis
    

    容器的日常管理

    • 启动容器
    [root@localhost docker]# docker run nginx
    
    • 查看正在运行的容器
    [root@localhost docker]# docker container ls
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                NAMES
    6620631e4975   nginx     "/docker-entrypoint.…"   35 minutes ago   Up 35 minutes   0.0.0.0:80->80/tcp   affectionate_rhodes
    
    • 快速启动容器
    [root@localhost docker]# docker run  mysql:latest  /usr/bin/sleep 20;
    
    • 启动redis 并配置端口以及账号密码
    [root@localhost docker]# docker run -d --name root -p 6379:6379 redis --requirepass "123123"
    a528bbba31ab60cabdda0f4398ef4cf4bebb4d6996819c26b5280add744881e1
    
    • 查看你容器详细信息
    [root@localhost docker]# docker container inspect 6620631e4975  
    #6620631e4975   为redis容器的id,可以在查看正在运行的容器的结果里看到
    
    • 查看你所有容器(包括未运行的)
    [root@localhost docker]# docker ps -a
    CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS                        PORTS                    NAMES
    76d59fca157f   mysql          "docker-entrypoint.s…"   4 minutes ago       Exited (127) 4 minutes ago                             agitated_lamport
    61c9ecd03a3d   mysql:latest   "docker-entrypoint.s…"   5 minutes ago       Exited (127) 5 minutes ago                             festive_golick
    a528bbba31ab   redis          "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes                 0.0.0.0:6379->6379/tcp   root
    226447f2093e   redis          "docker-entrypoint.s…"   15 minutes ago      Exited (0) 10 minutes ago                              musing_wu
    604f18efaf3c   redis:latest   "docker-entrypoint.s…"   15 minutes ago      Exited (127) 15 minutes ago                            priceless_pare
    94aac2583416   nginx          "/docker-entrypoint.…"   20 minutes ago      Exited (0) 19 minutes ago                              inspiring_mahavira
    6620631e4975   nginx          "/docker-entrypoint.…"   53 minutes ago      Up 53 minutes                 0.0.0.0:80->80/tcp       affectionate_rhodes
    7b9a34037aba   nginx          "/docker-entrypoint.…"   About an hour ago   Created                                                elated_lederberg
    
    • 停止容器
    [root@localhost docker]# docker stop 7b9a34037aba
    #或
    [root@localhost docker]# docker container  kill 76d59fca157f
    
    
    • 删除所有容器
    [root@localhost docker]# docker rm -f  `docker ps -a -q`
    
    • 启动时进行端口映射
    [root@localhost docker]# docker run -d -p 80:80 nginx:latest
    af85d7e1670dbb7e391cd19733c521af41824ba7c70a5f51af9a8f967bb78e06
    
    

    不同指定映射方法

    参数说明
    • 进入容器
    > docker run -it nginx:latest 
    > docker attach 1bf0f43c4d2f
    
    #exec 进入容器方法(推荐使用)
    > docker exec -it 1bf0f43c4d2f /bin/bash 
    

    Docker 数据卷的管理

    • 挂在卷
    [root@localhost docker]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest
    6a7cea392577e0c14b1eb21117bdc8eb7c2b6cbf921c7f472dc180e823d03431
    

    容器内站点目录: /usr/share/nginx/html,可以测试一下

    #写入数据到/data/index.html,并访问
    [root@localhost html]# echo "http://www.docker-test.com" > /data/index.html
    [root@localhost html]# curl 192.168.0.241
    http://www.docker-test.com
    
    • 设置共享卷,使用同一个卷启动一个新的容器
    [root@localhost docker]# docker run -d -p 8080:80 -v /data:/usr/share/nginx/html nginx:latest
    8a24e6e2e314ae99ba37cb5a5e29093cf7d721d600662872642abbc0c0b04680
    

    测试一下

    [root@localhost html]# curl 192.168.0.241:8080
    http://www.docker-test.com
    
    • 查看卷列表
    [root@localhost docker]# docker volume ls
    DRIVER    VOLUME NAME
    local     98634ca089006f43966f067067b49f27c94c591cd0de971ba776257cef3492ff
    local     d18512ab022fabe00b682906efdefc759ae93bf288664279ecfd8e7f12e2d11b
    local     d116492c60ce15ce9df3f796990e72a302e4b048b91179b7370ebbc17592e653
    local     e5b5e0e325411d38b5b953819c9a52d725762b8fd07030cc41839c18355d55c3
    local     e9ce7babf62514608dc98f7656c65bb10d59804beb59ddcf8fdd32a5064abd33
    
    • 创建一个卷
    [root@localhost docker]# docker volume create
    85cfd88f320a1f83318cdfdd53916ac124e31acba97242536b9406097adf27f9
    
    查看卷列表
    • 查看卷路径
    [root@localhost docker]# docker volume inspect 85cfd88f320a1f83318cdfdd53916ac124e31acba97242536b9406097adf27f9
    
    查看卷路径
    • 使用新创建的卷 挂载数据
    [root@localhost docker]# docker volume create zxlab
    zxlab
    [root@localhost docker]# docker volume ls
    DRIVER    VOLUME NAME
    local     85cfd88f320a1f83318cdfdd53916ac124e31acba97242536b9406097adf27f9
    local     98634ca089006f43966f067067b49f27c94c591cd0de971ba776257cef3492ff
    local     d18512ab022fabe00b682906efdefc759ae93bf288664279ecfd8e7f12e2d11b
    local     d116492c60ce15ce9df3f796990e72a302e4b048b91179b7370ebbc17592e653
    local     e5b5e0e325411d38b5b953819c9a52d725762b8fd07030cc41839c18355d55c3
    local     e9ce7babf62514608dc98f7656c65bb10d59804beb59ddcf8fdd32a5064abd33
    local     zxlab
    [root@localhost docker]# docker run -d -p 9000:80 -v zxlab:/usr/share/nginx/html nginx:latest 
    d7cfc4c6b480e6714ad20a06fe3ff8948e35c253b755752f309e4278d2f38f72
    [root@localhost docker]# echo 'test.docker.cc' >/var/lib/docker/volumes/zxlab/_data/index.html 
    [root@localhost docker]# curl 192.168.0.241:9000
    test.docker.cc
    
    • 查看使用的端口
    [root@localhost docker]# netstat -lntup
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 192.168.0.241:2375      0.0.0.0:*               LISTEN      16200/dockerd       
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3004/sshd                
    tcp6       0      0 :::9000                 :::*                    LISTEN      19344/docker-proxy           
    tcp6       0      0 :::8080                 :::*                    LISTEN      19085/docker-proxy  
    tcp6       0      0 :::80                   :::*                    LISTEN      18896/docker-proxy  
    

    手动将容器保存为镜像

    官方镜像列表:
    https://hub.docker.com/explore/

    • 启动一个centos6.8的镜像
    > docker pull  centos:7.6
    
    #启动并进入容器
    > docker run -it -p 1022:22 centos:7.6  /bin/bash
    
    # 在容器种安装sshd服务,并修改系统密码
    > yum install  openssh-server -y 
    > echo "root:123456" |chpasswd
    > /etc/init.d/sshd start
    

    启动完成后镜像ssh连接测试

    • 将容器提交为镜像
    # 容器名称 镜像名称
    > docker commit brave_mcclintock  centos7-ssh
    
    #使用新的镜像启动容器
    > docker run -d  -p 1122:22  centos7-ssh:latest  /usr/sbin/sshd -D 
    
    #进入容器后,在容器安装httpd服务
    > yum install httpd -y
    #编写启动脚本脚本 init.sh,内容如下
    [root@5b8161fda2a9 /]# cat  init.sh 
    #!/bin/bash 
    /etc/init.d/httpd start 
    /usr/sbin/sshd -D
    > chmod +x init.sh 
    #退出容器,重新提交
    [root@localhost docker]# docker commit  5b8161fda2a9 centos7-httpd 
    #启动容器,并测试
    [root@localhost docker]# docker run -d -p 1222:22 -p 80:80  centos6-httpd /init.sh 
    46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c
    

    Dockerfile自动构建docker镜像

    可以参考官方的dockerfile文件:https://github.com/CentOS/CentOS-Dockerfiles

    以下为nginx的dockerfile

    # "ported" by Adam Miller <maxamillion@fedoraproject.org> from
    #   https://github.com/fedora-cloud/Fedora-Dockerfiles
    #
    # Originally written for Fedora-Dockerfiles by
    #   scollier <scollier@redhat.com>
    #
    # Enriched by patterns found at https://github.com/openshift/postgresql/blob/master/9.4/Dockerfile.rhel7 by
    #   Christoph Görn <goern@redhat.com>
    
    FROM centos:centos7
    MAINTAINER The CentOS Project <cloud-ops@centos.org>
    
    # Labels consumed by Red Hat build service
    LABEL Component="nginx" \
          Name="centos/nginx-180-centos7" \
          Version="1.8.0" \
          Release="1"
    
    # Labels could be consumed by OpenShift
    LABEL io.k8s.description="nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev." \
          io.k8s.display-name="nginx 1.8.0" \
          io.openshift.expose-services="80:http" \
          io.openshift.tags="nginx"
    
    RUN yum -y install --setopt=tsflags=nodocs centos-release-scl-rh && \
        yum -y update --setopt=tsflags=nodocs && \
        yum -y install --setopt=tsflags=nodocs scl-utils rh-nginx18 && \
        yum clean all && \
        mkdir -p /usr/share/nginx/html
    
    # Get prefix path and path to scripts rather than hard-code them in scripts
    ENV CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/nginx \
    ENABLED_COLLECTIONS=rh-nginx18
    
    # When bash is started non-interactively, to run a shell script, for example it
    # looks for this variable and source the content of this file. This will enable
    # the SCL for all scripts without need to do 'scl enable'.
    ENV BASH_ENV=${CONTAINER_SCRIPTS_PATH}/scl_enable \
        ENV=${CONTAINER_SCRIPTS_PATH}/scl_enable \
        PROMPT_COMMAND=". ${CONTAINER_SCRIPTS_PATH}/scl_enable"
    
    ADD root /
    
    # ADD https://git.centos.org/sources/httpd/c7/acf5cccf4afaecf3afeb18c50ae59fd5c6504910 /usr/share/nginx/html/
    # RUN sed -i -e 's/Apache/nginx/g' -e '/apache_pb.gif/d' /usr/share/nginx/html/index.html
    RUN echo "nginx on CentOS7" > /usr/share/nginx/html/index.html
    
    EXPOSE 80
    
    USER nginx
    
    ENTRYPOINT ["container-entrypoint"]
    CMD [ "nginx18" ]
    

    dockerfile主要组成部分:

    • 基础镜像信息 FROM centos:centos7
    • 制作镜像操作指令RUN yum -y install --setopt=tsflags=nodocs centos-release-scl-rh
    • 容器启动时执行指令 CMD [ "nginx18" ]

    dockerfile常用指令:

    • FROM : 指定基础镜像
    • MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
    • RUN : 操作,比如安装、更新、创建文件夹等,在命令前面加上RUN即可
    • ADD : 给它设置权限,比如COPY文件,会自动解压
    • WORKDIR : 设置当前工作目录
    • VOLUME : 设置卷,挂载主机目录
    • EXPOSE : 指定对外的端口
    • CMD : 指定容器启动后的要干的事情
    • COPY : 复制文件
    • ENV : 环境变量
    • ENTRYPOINT : 容器启动后执行的命令

    如何创建一个Dockerfile?

    #进入一个创建好的目录
    > cd /opt/base
    #编写Dockerfile
    [root@localhost base]# vim Dockerfile
    [root@localhost base]# cat Dockerfile
    FROM centos:centos7
    RUN yum install openssh-server -y
    RUN echo "root:123123" |chpasswd
    RUN /etc/init.d/sshd start
    CMD ["/usr/sbin/sshd","-D"]
    
    #使用编写好的Dockerfile ,构建docker镜像, -t 给镜像打标签, . 为当前目录
    [root@localhost base]# docker image build -t centos7-ssh .
    
    #完成后查看镜像列表
    [root@localhost base]# docker image list
    REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
    <none>       <none>    ae20c8b4f2ad   2 minutes ago   300MB
    mysql        latest    a347a5928046   10 hours ago    545MB
    nginx        latest    ae2feff98a0c   6 days ago      133MB
    redis        latest    ef47f3b6dc11   10 days ago     104MB
    centos       centos7   8652b9f0cb4c   5 weeks ago     204MB
    #更多的Dockerfile可以参考官方方法。
    

    总结

    好了,以上是Docker入门的一些日常操作,后续还有Docker容器操作的拓展内容。

    相关文章

      网友评论

          本文标题:微服务中的容器技术---Docker(一),Docker的安装和

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