当前位置:   article > 正文

Docker入门与实践

docker入门与实践

一、安装

官方安装步骤

  1. 卸载老版本

    sudo yum remove docker \
         docker-client \
         docker-client-latest \
         docker-common \
         docker-latest \
         docker-latest-logrotate \
         docker-logrotate \
         docker-engine

  2. 使用仓库进行安装

    sudo yum install -y yum-utils
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  3. 安装docker引擎

    sudo yum install docker-ce docker-ce-cli containerd.io

  4. 启动docker

    sudo systemctl start docker

  5. 验证docker引擎是否安装完毕

    sudo docker run hello-world

    验证下载说明

二、启动相关指令

  1. 查看下载的镜像列表

    docker images

     定位镜像方式: REPOSITORY + TAG 或者 IMAGE ID
    
    • 1
    标识含义
    REPOSITORY镜像名称
    TAG版本(latest: 最新)
    IMAGE ID镜像唯一标识
    CREATED创建时间
    SIZE镜像大小
  2. 重新加载docker

    sudo systemctl daemon-reload

  3. 重启docker

    sudo systemctl restart docker

  4. 配置docker国内镜像地址(加快镜像下载速度)

    • sudo mkdir -p /etc/docker
      
      • 1
    • sudo tee /etc/docker/daemon.json <<-'EOF'
      {
      "registry-mirrors": ["https://aa25jngun.mirror.aliyuncs.com"]
      }
      EOF
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • sudo systemctl daemon-reload
      
      • 1
    • sudo systemctl restart docker
      
      • 1

三、基础命令

官网文档链接

1.常用基础命令

  • 查看版本——docker version

    Client: Docker Engine - Community	# 客户端
    Version:           20.10.11						# 版本
     API version:       1.41
     Go version:        go1.16.9					# GO的版本
     Git commit:        dea9396
     Built:             Thu Nov 18 00:36:58 2021
     OS/Arch:           linux/amd64
     Context:           default
     Experimental:      true
    
    Server: Docker Engine - Community	# 服务端
     Engine:
      Version:          20.10.11
      API version:      1.41 (minimum version 1.12)
      Go version:       go1.16.9
      Git commit:       847da18
      Built:            Thu Nov 18 00:35:20 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 显示信息——docker info

    Client:
     Context:    default
     Debug Mode: false
     Plugins:
      app: Docker App (Docker Inc., v0.9.1-beta3)
      buildx: Build with BuildKit (Docker Inc., v0.6.3-docker)
      scan: Docker Scan (Docker Inc., v0.9.0)
    
    Server:
     Containers: 27									# 一共有27个容器
      Running: 14									# 其中有14个运行中的容器
      Paused: 0
      Stopped: 13									# 其中有13个停止的容器
     Images: 9										# 镜像数量
     	.
    	.
     	.
    	.
    	.
    	.
     OSType: linux
     Architecture: x86_64
     CPUs: 2
     Total Memory: 1.822GiB
     	.
     	.
     	.
    	.
    	.
    	.
     Registry Mirrors:
      https://aa25jngun.mirror.aliyuncs.com/		# 镜像地址
     Live Restore Enabled: false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
  • 帮助指令 ——docker [命令] --help

    [root@*********************** docker]# docker images --help
    
    Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]
    
    List images
    
    Options:
      -a, --all             Show all images (default hides intermediate images)
          --digests         Show digests
      -f, --filter filter   Filter output based on conditions provided
          --format string   Pretty-print images using a Go template
          --no-trunc        Don't truncate output
      -q, --quiet           Only show image IDs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 查看运行中的容器

    • 查看运行中的容器(默认只显示运行中——UP)
      docker ps

    • 查看所有状态的容器
      docker ps -a

  • 查看容器的top信息——docker top [容器ID]

  • 查看容器元数据信息——docker inspect [容器ID]

  • 进入容器

    • docker attach [容器ID]

    • docker exec

      • docker exec -it [容器ID] /bin/bash

      • docker exec -it [容器ID] bash

      • docker exec -it [容器ID] /bin/sh

      • docker exec -it [容器ID] sh

  • 文件拷贝

    • 从宿主机拷贝文件到容器(docker cp SRC_PATH [容器ID]:DEST_PATH)

    • 从容器拷贝文件到宿主机(docker cp [容器ID]:SRC_PATH DEST_PATH)

  • 查看容器状态——docker stats

    标识含义
    CONTAINER ID容器ID
    NAME容器名称
    CPU %容器使用的主机CPU的百分比
    MEM %容器使用的主机内存的百分比
    MEM USAGE / LIMIT容器正在使用的总内存,以及允许使用的内存总量
    NET I/O容器通过其网络接口发送和接收的数据量
    BLOCK I/O容器从主机上的块设备读取和写入的数据量
    PIDs容器创建的进程或线程数

2.镜像命令

  • 查询镜像列表

  • 搜索镜像

    • docker search
      搜索rabbitmq示例

      标识含义
      NAME名称
      DESCRIPTION描述
      STARS星级(越高被使用次数越高)
      OFFICIAL是否官方认可的
      AUTOMATED是否自动化的
    • docker hub

  • 下载镜像——docker pull [镜像]

    • 最新版本

      docker pull rabbitmq

    • 指定版本

      docker pull rabbitmq:3.8.22

  • 删除镜像

    • docker rmi -f [IMAGE ID]

    • docker rmi -f [IMAGE ID] [IMAGE ID] [IMAGE ID] [IMAGE ID]

    • docker rmi -f $(docker images -aq)

3.容器命令

  • 运行容器

    # it 交互式(进入容器)
    [root@*********************** ~]# docker run -it centos /bin/bash
    
    # -d 后台运行
    # --name 指定容器名
    # -p 指定服务运行的端口
    # --volumes-from 挂载
    # nginx未指定版本, 则默认为最新版本
    [root@*********************** ~]# docker run -d --name nginx3 -p 1113:80 nginx
    0ed40ef4650bf9f6aad36bbf184e738a4316d04c3a48c77e7aac69d6b798e601
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 退出容器

    CTRL + P + Q: 退出容器, 但并不关闭容器
    exit、CTRL + D: 退出容器, 关闭容器
    
    • 1
    • 2
  • 删除容器

    • 删除一个容器

      # 强制删除一个UP状态的容器
      docker rm -f 98d298f1a134
      # 删除一个非UP状态的容器
      docker rm 68c1dc007ef8
      
      • 1
      • 2
      • 3
      • 4
    • 删除多个容器

      [root@*********************** ~]# docker rm d05b0fddefd6 105672f0c6f6
      d05b0fddefd6 
      105672f0c6f6
      
      • 1
      • 2
      • 3
    • 删除所有容器

      •   [root@*********************** ~]# docker rm -f $(docker ps -aq)
          	.
          	.
          	.
        
        • 1
        • 2
        • 3
        • 4
      •   [root@*********************** ~]# docker ps -aq | xargs docker rm
          	.
          	.
          	.
        
        • 1
        • 2
        • 3
        • 4
  • 启动和重启容器

    [root@*********************** ~]# docker start 94b040becc63
    94b040becc63
    [root@*********************** ~]# docker restart 94b040becc63
    94b040becc63
    
    • 1
    • 2
    • 3
    • 4
  • 停止容器

    [root@*********************** ~]# docker stop 94b040becc63
    94b040becc63
    
    • 1
    • 2
  • kill掉容器

    [root@*********************** ~]# docker kill 94b040becc63
    94b040becc63
    
    • 1
    • 2

四、镜像原理

1.什么是镜像

1.镜像是一种轻量级、可执行的独立软件包

2.包含代码、运行时、库、环境变量和配置文件

3.所有应用, 直接打包docker镜像, 就可以直接跑起来

获得镜像的方式:

  • 从远程仓库下载
  • 通过传输拷贝方式获得
  • 通过DockerFile制作镜像

2.镜像拉取

1.下载的时候, 看到的一层层下载, 就是联合文件系统——UnionFS
2.联合文件系统是一种分层、轻量级、高性能的文件系统. 它支持对文件系统的修改作为一次提交来一层层的叠加
3.联合文件系统是Docker镜像的基础

3.提交镜像

  • 提交容器,成为一个新的副本。
    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    
    • 1

五、容器数据卷

1.什么是容器数据卷

  docker是将应用和环境进行了打包. 那么如果删掉容器的话, 数据也会同时被删除掉. 那么, 如果有数据持久化的需求, 或者容器之间数据同步的需求, 就用到了容器数据卷

2.挂载操作

  • 执行挂载

    把本机路径/home/docker/rabbitmq/data,挂在到rabbitmq容器的/var/lib/rabbitmq目录下

    docker run -d --name rabbitmq3.8.26 -p 5672:5672 -p 15672:15672 -v /home/docker/rabbitmq/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin [容器ID]
    
    • 1
  • 查看挂载内容——docker inspect [容器ID]
    rabbitmq挂载信息

2.1.具名挂载与匿名挂载

  • 匿名挂载
    通过-v指定容器内路径
    docker run -d -P --name nginx1 -v :/etc/nginx nginx

  • 具名挂载(常用方式)
    通过-v卷名:容器内路径, 指定具名挂载
    docker run -d -P --name nginx2 -v nginx2:/etc/nginx nginx

2.2.挂载常用相关命令

  • 查看挂载列表——docker volume ls

  • 查看挂载信息——docker volume inspect [VOLUME]

3.数据卷容器

容器中文件是互相同步复制备份的. 而并不是共享了某个目录, 查看一个备份

六、简单部署Java应用

查看Linux系统多少位——getconf LONG_BIT

  • 获取java镜像

    • 自定义

      1.预先pull centos

      2.上传jdk-8u201-linux-x64.tar.gz文件至服务器

      • 在/home/docker/dockerfiles下新建java8u201文件

      • 编写DockerFile文件(命令大写, 必须以FROM指令开头)

        FROM centos
        MAINTAINER author
        RUN mkdir /usr/local/jdk
        WORKDIR /usr/local/jdk
        ADD jdk-8u201-linux-x64.tar.gz /usr/local/jdk
        
        ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_201
        ENV JRE_HOME /usr/local/jdk/jdk1.8.0_201/jre
        ENV PATH $JAVA_HOME/bin:$PATH
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
      • 构造镜像

        构建文件时, 因为’’.’'的存在会将当前文件夹中所有内容进行打包, 所以

        • 尽量避免不必要的文件存放其中

        • 建立.dockerignore文件进行筛选

        [root@*********************** java]# docker build -f /home/docker/dockerfiles/java8u201 -t java:8u201 .
        Sending build context to Docker daemon  191.8MB
        Step 1/8 : FROM centos
         ---> 5d0da3dc9764
        	.
        	.
        	.
        Step 8/8 : ENV PATH $JAVA_HOME/bin:$PATH
         ---> Running in d4aee3b8b6e6
        Removing intermediate container d4aee3b8b6e6
         ---> 47188765c2fa
        Successfully built 47188765c2fa
        Successfully tagged java:8u201
        [root@*********************** java]# docker images
        REPOSITORY          TAG                 IMAGE ID       CREATED          SIZE
        java                8u201               47188765c2fa   21 minutes ago   628MB
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
      • 启动镜像

        [root@*********************** java]# docker run -it 47188765c2fa /bin/bash
        [root@05d6871b52b0 jdk]# ls
        jdk1.8.0_201
        
        • 1
        • 2
        • 3
    • docker pull

      • mayan31370/openjdk-alpine-with-chinese-timezone:8-jdk

        比较上面自制java镜像, 此镜像已经做了相关优化, SIZE也小很多

        [root@*********************** java]# docker pull mayan31370/openjdk-alpine-with-chinese-timezone:8-jdk
        8-jdk: Pulling from mayan31370/openjdk-alpine-with-chinese-timezone
        b56ae66c2937: Pull complete 
        81cebc5bcaf8: Pull complete 
        9f7678525069: Pull complete 
        a90637ec9fbd: Pull complete 
        Digest: sha256:f11c87aafa6bd12ea20eb1f8c00e828a4870178d3f3a21efc50ee26c84997fcf
        Status: Downloaded newer image for mayan31370/openjdk-alpine-with-chinese-timezone:8-jdk
        docker.io/mayan31370/openjdk-alpine-with-chinese-timezone:8-jdk
        [root@*********************** java]# docker images
        REPOSITORY                                       TAG                 IMAGE ID       CREATED          SIZE
        mayan31370/openjdk-alpine-with-chinese-timezone  8-jdk               70e61b8bb388   4 years ago      101MB
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
      • java:8

        比较上面自制java镜像, SIZE还要大

        [root@*********************** java]# docker pull java:8
        8: Pulling from library/java
        5040bd298390: Pull complete 
        fce5728aad85: Pull complete 
        76610ec20bf5: Pull complete 
        60170fec2151: Pull complete 
        e98f73de8f0d: Pull complete 
        11f7af24ed9c: Pull complete 
        49e2d6393f32: Pull complete 
        bb9cdec9c7f3: Pull complete 
        Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
        Status: Downloaded newer image for java:8
        docker.io/library/java:8
        [root@*********************** java]# docker images
        REPOSITORY        TAG                 IMAGE ID       CREATED          SIZE
        java              8                   d23bdf5b1b1b   4 years ago      643MB
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
  • 部署Java应用

    前置条件: 项目jar包

    • 创建dockerfile文件并编辑

      FROM mayan31370/openjdk-alpine-with-chinese-timezone:8-jdk
      ADD spring-demo-1.0.0.jar /spring-demo-1.0.0.jar
      EXPOSE 8080
      ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=dev","-jar","-Xmx512m","-Xms128m","/spring-demo-1.0.0.jar"]
      
      • 1
      • 2
      • 3
      • 4
    • 构造镜像

      [root@*********************** dockerfiles]# docker build -f /home/docker/dockerfiles/testFile1 -t spring-demo:1.0.0 .
      	.
      	.
      	.
      Successfully tagged spring-demo:1.0.0
      [root@*********************** dockerfiles]# docker images
      REPOSITORY          TAG                 IMAGE ID       CREATED          SIZE
      spring-demo         1.0.0               7b7209930a87   21 minutes ago   119MB
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • 启动镜像

      [root@*********************** dockerfiles]# docker run -p 8080:8080 --name spring-demo1 -d 7b7209930a87
      8a2676f3235d23fefd8990d50dea7fbfde8110465b41ae216f3b855951e49f93
      
      • 1
      • 2
    • 检查项目是否已经启动

      [root@*********************** dockerfiles]# curl localhost:8080/hello
      hello
      
      • 1
      • 2

      1.项目已经成功启动

      2.访问不通可能的原因:

      • 项目未正常启动

      • 防火墙拦截

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/578164
推荐阅读
相关标签
  

闽ICP备14008679号