Docker容器使用记录

Posted by     "zengchengjie" on Thursday, February 17, 2022

概念

将部署的安全包、配置文件等一次打包放到docker(集装箱)中,方便一次打包,且迁移应用的时候不会因为系统差异而产生问题

部署

参考文档:

docker官方文档

微软提供的docker文档

官方文档:centos下的docker安装

docker安装(阿里云源)

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

    执行结果:

    ...
    Running transaction check
    Running transaction test
    Transaction test succeeded
    Running transaction
      正在安装    : libaio-0.3.109-13.el7.x86_64                                                                                                             1/10
      正在更新    : 7:device-mapper-libs-1.02.170-6.el7_9.5.x86_64                                                                                           2/10
      正在更新    : 7:device-mapper-1.02.170-6.el7_9.5.x86_64                                                                                                3/10
      正在安装    : 7:device-mapper-event-libs-1.02.170-6.el7_9.5.x86_64                                                                                     4/10
      正在安装    : 7:device-mapper-event-1.02.170-6.el7_9.5.x86_64                                                                                          5/10
      正在安装    : 7:lvm2-libs-2.02.187-6.el7_9.5.x86_64                                                                                                    6/10
      正在安装    : device-mapper-persistent-data-0.8.5-3.el7_9.2.x86_64                                                                                     7/10
      正在安装    : 7:lvm2-2.02.187-6.el7_9.5.x86_64                                                                                                         8/10
      清理        : 7:device-mapper-libs-1.02.170-6.el7.x86_64                                                                                               9/10
      清理        : 7:device-mapper-1.02.170-6.el7.x86_64                                                                                                   10/10
      验证中      : 7:device-mapper-event-1.02.170-6.el7_9.5.x86_64                                                                                          1/10
      验证中      : 7:lvm2-libs-2.02.187-6.el7_9.5.x86_64                                                                                                    2/10
      验证中      : device-mapper-persistent-data-0.8.5-3.el7_9.2.x86_64                                                                                     3/10
      验证中      : 7:device-mapper-1.02.170-6.el7_9.5.x86_64                                                                                                4/10
      验证中      : libaio-0.3.109-13.el7.x86_64                                                                                                             5/10
      验证中      : 7:lvm2-2.02.187-6.el7_9.5.x86_64                                                                                                         6/10
      验证中      : 7:device-mapper-libs-1.02.170-6.el7_9.5.x86_64                                                                                           7/10
      验证中      : 7:device-mapper-event-libs-1.02.170-6.el7_9.5.x86_64                                                                                     8/10
      验证中      : 7:device-mapper-libs-1.02.170-6.el7.x86_64                                                                                               9/10
      验证中      : 7:device-mapper-1.02.170-6.el7.x86_64                                                                                                   10/10
    
    已安装:
      device-mapper-persistent-data.x86_64 0:0.8.5-3.el7_9.2                                   lvm2.x86_64 7:2.02.187-6.el7_9.5
    
    作为依赖被安装:
      device-mapper-event.x86_64 7:1.02.170-6.el7_9.5         device-mapper-event-libs.x86_64 7:1.02.170-6.el7_9.5         libaio.x86_64 0:0.3.109-13.el7
      lvm2-libs.x86_64 7:2.02.187-6.el7_9.5
    
    作为依赖被升级:
      device-mapper.x86_64 7:1.02.170-6.el7_9.5                                   device-mapper-libs.x86_64 7:1.02.170-6.el7_9.5
    
    完毕!
    
  • yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    需要执行这一步,使用阿里云镜像源,否则会出现‘没有可用软件包’错误

    已加载插件:fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirrors.aliyun.com
     * centos-sclo-rh: mirrors.bupt.edu.cn
     * epel: mirrors.njupt.edu.cn
     * extras: mirrors.aliyun.com
     * updates: mirrors.aliyun.com
    没有可用软件包 docker-ce。
    没有可用软件包 docker-ce-cli。
    没有可用软件包 containerd.io。
    错误:无须任何处理
    
  • yum install docker-ce docker-ce-cli containerd.io

    碰到此处,选择y继续安装

    安装  3 软件包 (+6 依赖软件包)
    
    总下载量:93 M
    安装大小:381 M
    Is this ok [y/d/N]: y
    Downloading packages:
    

    这里我也是选择y

    从 https://mirrors.aliyun.com/docker-ce/linux/centos/gpg 检索密钥
    导入 GPG key 0x621E9F35:
     用户ID     : "Docker Release (CE rpm) <docker@docker.com>"
     指纹       : 060a 61c5 1b55 8a7f 742b 77aa c52f eb6b 621e 9f35
     来自       : https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
    是否继续?[y/N]:y
    Running transaction check
    Running transaction test
    Transaction test succeeded
    Running transaction
    
  • systemctl start docker

  • systemctl enable docker

    执行结果:

    systemctl enable  docker
    Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
    
  • docker version

    执行结果:

    docker version
    Client: Docker Engine - Community
     Version:           20.10.12
     API version:       1.41
     Go version:        go1.16.12
     Git commit:        e91ed57
     Built:             Mon Dec 13 11:45:41 2021
     OS/Arch:           linux/amd64
     Context:           default
     Experimental:      true
    
    Server: Docker Engine - Community
     Engine:
      Version:          20.10.12
      API version:      1.41 (minimum version 1.12)
      Go version:       go1.16.12
      Git commit:       459d0df
      Built:            Mon Dec 13 11:44:05 2021
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          1.4.12
      GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
     runc:
      Version:          1.0.2
      GitCommit:        v1.0.2-0-g52b36a2
     docker-init:
      Version:          0.19.0
      GitCommit:        de40ad0
    
  • docker run hello-world

docker-compose安装

  • sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s-uname -m` -o /usr/local/bin/docker-compose

    执行结果:

      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   423  100   423    0     0    494      0 --:--:-- --:--:-- --:--:--   494
    100 16.2M  100 16.2M    0     0  11.4M      0  0:00:01  0:00:01 --:--:-- 52.2M
    
  • sudo chmod +x /usr/local/bin/docker-compose

  • docker-compose –version

    docker-compose version 1.25.1, build a82fef07
    

docker-compose.yml

修改容器时间和宿主机的一致,添加volumes变量 - /etc/localtime:/etc/localtime即可

  prometheus:
    container_name: prometheus
    image: prom/prometheus:latest
    volumes:
      - /etc/localtime:/etc/localtime

docker-compose中的depends_on

通过depends_on告诉docker-compose当前服务启动之前先要把depends_on指定的服务启动起来才行。例如:kafka依赖zookeeper,nginx依赖php-fpm等等。

services:

  kafka:
    image: tflinux_kafka
    depends_on:
      - zookeeper

  php-nginx:
    image: tflinux_php-nginx
    depends_on:
      - php-fpm

常用命令

常见问题

  • 问题1:WARNING: Found orphan containers ** command with the –remove-orphans flag to clean it up.

    原因:如果将docker-compose的镜像的配置放在同一个目录下时,docker运行时生成的镜像实例会有相同的前缀,就是当前的目录名,也就是说默认相同前缀的是同一组实例,当你在当前目录下还有别的镜像的配置文件,在运行时就会出现以下警告

    例如:我将docker-compose文件放在/test/下,启动的kafka名称就为test_kafka_1

    解决方案:

    1. 启动时制定docker容器名称

      docker-compose -p kafka -f /root/test/kafka-compose.yml up -d
      
    2. 或者将docker-compose文件放到单独的目录下启动

  • docker 镜像移除:把为none的移除,注意docker rmi前后空格)

    docker images | grep none | awk '{print " docker rmi "$3}' | bash
    
  • 问题2

    Mac m1芯片下的镜像有时候在Linux上不能使用,是CPU架构的原因。

    报错:

    WARNING: The requested image’s platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested 11e1b7fdbfcc7ead314864fae89ce2d2acdea21f93a4777c782c1e1d4e30a8e4

  • 执行脚本的时候dockerfile里 bash还是sh,取决于基础镜像的linux版本

    否则会报:

    docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: “/bin/bash”: stat /bin/bash: no such file or directory: unknown.

  • dockerfile里执行脚本的时候报 illegal option -问题

    脚本文件在windows下编辑过,换行符号是 \r\n而在linux上是\n,因此需要替换换行符

    解决办法:

    RUN sed -i -e ’s/\r//g' docker-entrypoint.sh ENTRYPOINT [“sh”, “docker-entrypoint.sh”]

    使用sed 命令替换即可

  • import可以导入save保存的镜像包和export保存的容器包。但是如果导入的是save保存的镜像包,导入时没有错。但是run运行时就会出错误。

    参考文章地址

  • import方式导包,可以重命名,而save的不可以

  • 如果需要bash的脚本,你的镜像里没有bash命令,其实在dockerfile里装一个就行了

    RUN apk update && apk add bash

  • 问题:java.net.NoRouteToHostException: Host is unreachable (Host unreachable)

    原因:firewalld 的没有信任 docker 的 ip 地址。

    解决方案:将所有 docker 的 ip 添加到信任区域

    firewall-cmd  --zone=trusted --add-source=172.23.0.1/16 --permanent
    firewall-cmd --reload
    

docker安装ping

直接安装ping:

apt-get update && apt-get install iputils-ping

报错:

E: List directory /var/lib/apt/lists/partial is missing. - Acquire (2: No such file or directory)

切换到root:

docker exec -it --user root <container id> /bin/bash

再次安装,成功。

执行ping

docker exec -it kafka ping zookeeper

成功

常用命令

docker stats <名称>

停止docker服务

  1. 停止所有正在运行的容器

    docker stop $(docker ps -aq)
    
  2. 清除所有已经停止的容器、网络、镜像和数据卷

$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y
  1. 停止Docker的网络服务

    sudo launchctl unload /Library/LaunchDaemons/com.docker.vmnetd.plist
    
  2. 停止Docker的镜像服

    sudo launchctl unload /Library/LaunchDaemons/com.docker.hyperkit.plist
    
  3. 停止Docker的守护进程

    sudo launchctl unload /Library/LaunchDaemons/com.docker.docker.plist
    

    在执行第5条和第6条命令时,如果出现"no such file or directory"的错误,请使用如下命令代替:

    sudo launchctl stop com.docker.vmnetd
    sudo launchctl stop com.docker.hyperkit
    sudo launchctl stop com.docker.docker
    

    这样就可以停止Docker服务了。

部署应用实践