【服务计算】docker实践报告

环境说明

主机系统:win10 x64
虚拟机管理器:Virtualbox 版本 6.1.0 r135406 (Qt5.6.2)
虚拟机系统:ubuntu-18.04.2-desktop-amd64

准备docker环境

官方指南
中文安装教程
使用 Docker 仓库进行安装

  • 设置仓库
    • 更新 apt 包索引
      sudo apt-get update
      
    • 安装 apt 依赖包,用于通过HTTPS来获取仓库
      sudo apt-get install \
          apt-transport-https \
          ca-certificates \
          curl \
          gnupg-agent \
          software-properties-common
      
    • 添加 Docker 的官方 GPG 密钥
      curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
      
      添加GPG密钥.PNG
    • 通过搜索指纹9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88的后8个字符,即0EBFCD88,验证您现在是否拥有带有指纹的密钥
      sudo apt-key fingerprint 0EBFCD88
      
      验证.PNG
    • 使用以下指令设置稳定版仓库
      sudo add-apt-repository \
         "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
        $(lsb_release -cs) \
        stable"
      
      addRepository.PNG
  • 安装 Docker Engine-Community
    • 更新 apt 包索引
      sudo apt-get update
      
    • 安装最新版本的 Docker Engine-Community 和 containerd
      sudo apt-get install docker-ce docker-ce-cli containerd.io
      
    • 测试 Docker 是否安装成功
      sudo docker version
      
      dockerVersion.PNG

运行第一个容器

运行镜像

sudo docker run hello-world

dockerHelloWorld.PNG

sudo docker run -it ubuntu bash

dockerUbuntuBash.PNG

Docker基本操作

  • 显示本地镜像库内容

    sudo docker images
    

    dockerImages.PNG

  • 获得帮助

    sudo docker --help
    

    输出如下结果:

    Usage:	docker [OPTIONS] COMMAND
    
    A self-sufficient runtime for containers
    
    Options:
          --config string      Location of client config files (default
                               "/home/jiere/.docker")
      -c, --context string     Name of the context to use to connect to the
                               daemon (overrides DOCKER_HOST env var and
                               default context set with "docker context use")
      -D, --debug              Enable debug mode
      -H, --host list          Daemon socket(s) to connect to
      -l, --log-level string   Set the logging level
                               ("debug"|"info"|"warn"|"error"|"fatal")
                               (default "info")
          --tls                Use TLS; implied by --tlsverify
          --tlscacert string   Trust certs signed only by this CA (default
                               "/home/jiere/.docker/ca.pem")
          --tlscert string     Path to TLS certificate file (default
                               "/home/jiere/.docker/cert.pem")
          --tlskey string      Path to TLS key file (default
                               "/home/jiere/.docker/key.pem")
          --tlsverify          Use TLS and verify the remote
      -v, --version            Print version information and quit
    
    Management Commands:
      builder     Manage builds
      config      Manage Docker configs
      container   Manage containers
      context     Manage contexts
      engine      Manage the docker engine
      image       Manage images
      network     Manage networks
      node        Manage Swarm nodes
      plugin      Manage plugins
      secret      Manage Docker secrets
      service     Manage services
      stack       Manage Docker stacks
      swarm       Manage Swarm
      system      Manage Docker
      trust       Manage trust on Docker images
      volume      Manage volumes
    
    Commands:
      attach      Attach local standard input, output, and error streams to a running container
      build       Build an image from a Dockerfile
      commit      Create a new image from a container's changes
      cp          Copy files/folders between a container and the local filesystem
      create      Create a new container
      diff        Inspect changes to files or directories on a container's filesystem
      events      Get real time events from the server
      exec        Run a command in a running container
      export      Export a container's filesystem as a tar archive
      history     Show the history of an image
      images      List images
      import      Import the contents from a tarball to create a filesystem image
      info        Display system-wide information
      inspect     Return low-level information on Docker objects
      kill        Kill one or more running containers
      load        Load an image from a tar archive or STDIN
      login       Log in to a Docker registry
      logout      Log out from a Docker registry
      logs        Fetch the logs of a container
      pause       Pause all processes within one or more containers
      port        List port mappings or a specific mapping for the container
      ps          List containers
      pull        Pull an image or a repository from a registry
      push        Push an image or a repository to a registry
      rename      Rename a container
      restart     Restart one or more containers
      rm          Remove one or more containers
      rmi         Remove one or more images
      run         Run a command in a new container
      save        Save one or more images to a tar archive (streamed to STDOUT by default)
      search      Search the Docker Hub for images
      start       Start one or more stopped containers
      stats       Display a live stream of container(s) resource usage statistics
      stop        Stop one or more running containers
      tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
      top         Display the running processes of a container
      unpause     Unpause all processes within one or more containers
      update      Update configuration of one or more containers
      version     Show the Docker version information
      wait        Block until one or more containers stop, then print their exit codes
    
    Run 'docker COMMAND --help' for more information on a command.
    
  • 显示运行中容器

    sudo docker ps
    

    dockerPS.PNG

  • 显示所有容器(包含已中止)

    sudo docker ps -a
    

    dockerPSall.PNG

  • 继续运行原容器并进入

    sudo docker restart exciting_wiles
    

    dockerRestart.PNG

MySQL与容器化

拉取MySQL镜像

  • 拉取MySQL镜像
    sudo docker pull mysql:5.7
    
    dockerPullSQL.PNG

构建docker镜像

  • 编辑dockerfile
    mkdir mydock && cd mydock
    vim dockerfile
    
    在文件中输入以下内容:
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
    
  • 构建镜像
    sudo docker build . -t hello
    
    dockerBuild.PNG
  • 运行镜像
    sudo docker run -it --rm hello -H
    
    dockerRun.PNG

MySQL容器使用

  • 启动服务器

    sudo docker run -p 3306:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
    

    启动服务器.PNG
    启动服务器后ps.PNG

  • 启动MySQL客户端

    sudo docker run -it --net host mysql:5.7 "sh"
    

    运行MySQL客户端.PNG
    MySQL客户端的基本操作可参考潘老师的博客

  • 数据库文件位置:

    $ sudo docker exec -it mysql2 bash
    # ls /var/lib/mysql
    

    事实上,每次启动MySQL容器,docker就会创建一个文件卷挂载在/var/lib/mysql位置,而这个卷在主机的/var/lib/docker/volumes/目录下
    数据库文件位置.PNG

  • dockerfile的VOLUME /var/lib/mysql 的含义

    • sudo docker container prune -fdockersContainerPrune.PNG
    • docker volume prune -f
      dockerVolumePrune.PNG
    • sudo docker volume ls
      dockerVolumeLs.PNG
  • 创建卷并挂载(挂载到/var/lib/mysql)

    sudo docker rm $(sudo docker ps -a -q) -f -v
    sudo docker volume create mydb
    sudo docker run --name mysql2 -e MYSQL_ROOT_PASSWORD=root -v mydb:/var/lib/mysql -d mysql:5.7
    

    创建卷并挂载.PNG

  • 启动客户端连接服务器

    $ sudo docker run --name myclient --link mysql2:mysql -it mysql:5.7 bash
    /# env
    /# mysql -hmysql -P3306 -uroot -proot
    

    说明:这里使用了--link连接两个容器;客户端容器内可以使用mysql这个别名访问
    启动客户端连接服务器.PNG

  • 挂载现有数据库

    • 首先查看当前的镜像有哪些:sudo docker images
      Images.PNG
    • 挂载
      sudo docker run -v "$PWD/data":/va/lib/mysql --user 1000:1000 --name wyb-sql -e MYSQL_ROOT_PASSWORD=19970805 -d mysql:5.7
      

    其中,

    • --user(或-u):提供用户名(或UID),格式为<name|uid> : <group|gid>
    • --name:为容器指定一个别名
    • -e(或--env):设置环境变量
    • -d(或--datch):在后台运行容器,并在终端打印容器的ID

    更多参数说明可参考官方手册
    挂载现有数据库.PNG

  • 修改容器配置(例如修改密码和别名)

    sudo docker run --name web-sql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=0805 -d mysql:5.7
    
    • --name:为容器重新指定一个别名
    • -v(或--volume):挂载卷
    • -e(或--env):设置环境变量
    • -d(或--datch):在后台运行容器,并在终端打印容器的ID

    更多参数说明可参考官方手册
    修改容器配置.PNG

Docker compose与多容器应用自动化部署

  • 下载docker-compose(容器编排的原型):

    sudo apt install docker-compose
    
  • 编写stack.yml如下:

    version: '3.1'
    services:
     db:
      image: mysql:5.7
      command: --default-authentication-plugin=mysql_native_password
      restart: always
      environment:
       MYSQL_ROOT_PASSWORD: 19970805
     adminer:
      image: adminer
      restart: always
      ports:
       - 8080:8080 
    
  • 启动服务

    sudo docker-compose -f stack.yml up -d
    

    dockerCompose.PNG

docker网络

docker默认网络:

  • 容器通过桥(docker0)相连
  • IP-Forward通过NAT访问外面
  • 端口映射使外面访问容器

容器网络管理

  • 容器默认使用网络:docker0(桥接)
  • 容器支持网络与类型
    • bridge(本机内网络)
    • host(主机网卡)
    • overlay(跨主机网络)
    • none
    • Custom(网络插件)
  • 管理容器网络
    sudo docker network ls
    
    networkLs.PNG
    说明:docker-compose为每个应用建立自己的网络

自定义容器网络

  • 备制支持ifconfigping命令的ubuntu容器

    sudo docker run --name unet -it --rm ubuntu bash
    
    apt-get update
    apt-get install net-tools
    apt-get install iputils-ping -y
    ifconfig
    

    ifconfi.PNG
    根据上面得到的ip地址,ping 172.17.0.2
    pingSelf.PNG
    ping主机:ping 172.26.45.15
    pingHost.PNG

  • 打开另一个终端窗口,由容器制作镜像

    sudo docker commit unet ubuntu:net
    

    由容器制作镜像.PNG

  • 创建自定义网络

    sudo docker network create mynet
    
  • 在另外两个窗口分别创建u1,u2容器网络,并使用以下命令:

    sudo docker run --name u1 -it -p 8080:80 --net mynet --rm ubuntu:net bash
    sudo docker run --name u2 --net mynet -it --rm ubuntu:net bash
    sudo docker info
    

    dockerInfo.PNG

    sudo docker network connect bridge u1
    sudo docker network disconnect mynet u1
    

    inspectMyNet.PNG
    有关docker网络更详细的介绍可参考官方手册 network,亦或参考文章 Docker - 网络使用详解2(创建自定义网络:user-defined)

docker仓库(Registry)

容器仓库在cnf技术栈中属于供给层

  • 公共容器仓库服务
    • Docker hub
    • Amazon ECR
    • … …
    • 几乎所有容器云服务商都免费提供此服务
  • 私有容器仓库工具
    • Docker Registry 2
    • Vmware Harbor
    • Sonatype Nexus 3

私有容器仓库搭建

根据官方指南进行实践:

  • Docker 官方提供了一个搭建私有仓库的镜像 registry ,首先需把镜像下载下来
    sudo docker pull registry:2
    
  • 运行容器并暴露9785端口
    sudo docker run -d -p 9785:9785 --restart=always --name wybregistry registry:2
    
    运行容器.PNG
  • 从docker hub上拷贝一个镜像到仓库中
    • 从docker hub拉取ubuntu:16.04镜像
      sudo docker pull ubuntu:16.04
      
      拉取镜像.PNG
    • 将镜像标记为localhost:5000/my-ubuntu
      sudo docker tag ubuntu:16.04 localhost:5000/my-ubuntu
      
    • 将镜像push到正运行在localhost:5000的本地仓库中
      sudo docker push localhost:5000/my-ubuntu
      
    标记并push.PNG
    • 将本地缓存中的ubuntu:16.04localhost:5000/my-ubuntu镜像删掉
      sudo docker image remove ubuntu:16.04
      sudo docker image remove localhost:5000/my-ubuntu
      
      删除镜像.PNG
    • 从本地仓库中拉取镜像localhost:5000/my-ubuntu
      sudo docker pull localhost:5000/my-ubuntu
      
      从本地仓库拉取镜像.PNG
  • 停用本地仓库
    • 停用仓库使用命令docker container stop,例如
      sudo docker container stop wybregistry
      
    • 删除容器使用命令docker container rm,例如
      sudo docker container rm -v wybregistry
      
    停用本地仓库.PNG

阿里云容器镜像服务实践

  • 访问登录页面
  • 登录
  • 开通“容器镜像服务”:设置registry密码
  • 配置镜像加速器(要求Docker客户端版本大于 1.10.0,我的是19.03.5):通过修改daemon配置文件/etc/docker/daemon.json来使用加速器,在终端输入如下命令:
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://9n0uofr7.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    配置镜像加速器.PNG
    • 检查是否配置成功:journalctl -f -u docker
      成功配置镜像加速器.PNG
  • 创建镜像仓库的命名空间,例如yibo-cool-guy
    创建命名空间.PNG
  • 创建镜像仓库
    • 根据提示和要求,输入必要信息
      创建镜像仓库1.PNG
    • 选择代码源为本地仓库
      创建镜像仓库2.PNG
  • 点击进入前面创建的仓库,将有常用仓库操作提示:
    • 登录(用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码;可以在访问凭证页面修改凭证密码)
      sudo docker login --username=淼姐姐阿嚏 registry.cn-shenzhen.aliyuncs.com
      
      若报错“登录超时”:
      Error saving credentials: error storing credentials - err: exit status 1, out: `Error calling StartServiceByName for org.freedesktop.secrets: Timeout was reached`
      
      则执行命令删除如下文件:
      rm /usr/local/bin/docker-credential-osxkeychain
      sudo rm /usr/bin/docker-credential-secretservice
      
      解决后成功登录:
      登录阿里云.PNG
    • 将镜像推送到Registry
      sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/yibo-cool-guy/senseless:[镜像版本号]
      sudo docker push registry.cn-shenzhen.aliyuncs.com/yibo-cool-guy/senseless:[镜像版本号]
      
      以上传前面的hello-world镜像为例,首先查看其镜像ID为fce289e99eb9,然后执行上述命令推送即可
      推送镜像.PNG
      这时在阿里云仓库上可以看到上传的镜像:
      镜像版本.PNG
    • 从Registry中拉取镜像
      sudo docker pull registry.cn-shenzhen.aliyuncs.com/yibo-cool-guy/senseless:[镜像版本号]
      
      拉取成功后可以看到本地镜像多了registry.cn-shenzhen.aliyuncs.com/yibo-cool-guy/senseless
      在这里插入图片描述
    • 删除
      sudo docker rmi registry.cn-shenzhen.aliyuncs.com/yibo-cool-guy/senseless:[镜像版本号]
      
      删除成功后可以看到本地镜像少了registry.cn-shenzhen.aliyuncs.com/yibo-cool-guy/senseless
      删除镜像.PNG
    • 运行
      sudo docker run --rm registry.cn-shenzhen.aliyuncs.com/yibo-cool-guy/senseless:0
      
      运行容器.PNG
    • 退出
      sudo docker logout registry.cn-shenzhen.aliyuncs.com
      
      退出.PNG

其他参考资料

Docker login问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值