Skip to content

Docker使用

Docker基础

虚拟化与容器化

虚拟化技术

  1. 基础镜像 GB 级别
  2. 创建使用稍微复杂
  3. 隔离性强
  4. 启动速度慢
  5. 移植与分享不方便

image-20240130091222998

容器化技术

  1. 基础镜像 MB 级别
  2. 创建简单
  3. 隔离性强
  4. 启动速度秒级
  5. 移植与分享方便

image-20240130091340483

Docker解决的问题

  1. 统一标准
    • 应用构建:语言不通导致构建不同(Java、C++、JavaScript),使用 docker build 打成镜像来解决这个问题(类似 Windows exe)
    • 应用分享:所有软件进行过放到一个指定地方 docker hub(类似应用市场)
    • 应用运行:统一标准的镜像,docker run
  2. 资源隔离
    • cpu、memory 资源隔离与限制
    • 访问设备隔离与限制
    • 网络隔离与限制
    • 用户、用户组隔离限制

Docker架构

image-20240130091552579

  • Docker Host

    安装 Docker 的主机

  • Docker Daemon

    运行在 Docker 主机上的 Docker 后台进程

  • Client

    操作 Docker 主机的客户端(命令行、UI 等)

  • Registry

    镜像仓库、Docker Hub

  • Images

    镜像,带环境打包好的程序,可以直接启动运行

  • Containers

    容器,由镜像启动起来正在运行中的程序

安装Docker

  1. 移除以前 docker 相关包

    bash
    $ yum remove docker
  2. 配置 yum 源

    bash
    $ yum install -y yum-utils
    $ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  3. 安装 docker

    • docker-ce 服务器
    • docker-ce-cli 命令行
    • containerd.io 容器化运行环境
    bash
    $ yum install -y docker-ce docker-ce-cli containerd.io
  4. 启动

    bash
    $ systemctl start docker
    # 开启自启并立即启动
    $ systemctl enable docker --now
  5. 配置加速

    bash
    $ mkdir -p /etc/docker
    $ vim daemon.json
    {
      "registry-mirrors": ["https://ss0idbd1.mirror.aliyuncs.com"],
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": { "max-size":"200m" },
      "storage-driver": "overlay2"
    }
    $ systemctl daemon-reload
    $ systemctl restart docker

Docker实战

找镜像

https://hub.docker.com/ 找镜像

bash
# 下载最新版本
$ docker pull nginx
# 下载指定版本
$ docker pull redis:6.2.4

删除镜像

  • rmi 用于删除镜像
  • rm 用于移除容器
bash
# 查看所有镜像
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    605c77e624dd   2 years ago   141MB
redis        6.2.4     9dae5b22eb39   2 years ago   105MB
# 删除镜像
$ docker rmi 9dae5b22eb39

启动容器

启动 nginx 容器,并映射 88 端口,测试访问

bash
$ docker run --help
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Options:
-d, --detach                         Run container in background and print
		--name string                    Assign a name to the container
		--restart string                 Restart policy to apply when a container
-p, --publish list                   Publish a container's port(s) to the host

把服务器 88 端口代理 nginx 80 端口

bash
$ docker run --name=mynginx -d -p 88:80 --restart=always nginx

查看容器状态

bash
# 查看正在运行的容器
$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                NAMES
545cfdb127a9   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:88->80/tcp   mynginx
# 查看所有容器
$ docker ps -a

重新启动容器

bash
# 删除停止的容器(容器id/名字)
$ docker rm 545cfdb127a9
# 停止容器
$ docker stop mynginx
# 再次启动
$ docker start 545

修改容器内容

修改默认的 index.html 页面

  • exec -it 进入容器终端并且的保留为容器终端的输入形式(与 bash 结合作用)
bash
$ docker exec -it 545cfdb127a9 /bin/bash
[root@iZ2ze0hyayj33bt8xa06wjZ /] -> root@545cfdb127a9:/
$ cd /usr/share/nginx/html/
$ vim index.html
echo "<h1>Hello World</h1>" > index.html

提交改变

bash
$ docker commit --help
Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
  -m, --message string   Commit message
bash
$ docker commit -a "lyn" -m "首页变化" 545cfdb127a9 demo-nginx:v1.0

之后通过 docker images 就能查看到对应镜像了

image-20240130111133721

镜像传输

bash
$ docker save --help
Usage:  docker save [OPTIONS] IMAGE [IMAGE...]
Options:
  -o, --output string   Write to a file, instead of STDOUT

将镜像保存成压缩包

bash
$ docker save -o abc.tar demo-nginx:v1.0

别的机器加载导出的镜像

bash
$ docker load --help
Options:
  -i, --input string   Read from tar archive file, instead of STDIN
  -q, --quiet          Suppress the load output
bash
$ docker load -i abc.tar

挂载数据到外部修改

bash
$ docker run --name=mynginx -d -p 88:80 -v /home/xxx/html nginx

推送远程仓库

推送镜像到 docker hub,应用市场

bash
# docker tag local-image:tagname new-repo:tagname
$ docker tag demo-nginx:v1.0 xx/xx:v1.0
$ docker push new-repo:tagname
# 登录退出
$ docker login
$ docker logout
# 推送
$ docker push

查看日志

bash
$ docker logs 545cfdb127a9
# 实时打印日志
$ docker logs 545cfdb127a9 -f

复制配置(容器和服务器)

bash
$ docker cp 545cfdb127a9:/etc/nginx/nginx.conf /home
$ docker cp /home/nginx.conf 545cfdb127a9:/etc/nginx/nginx.conf

部署中间件redis

部署一个 Redis 应用,尝试应用操作 Redis 产生数据

Redis可视化管理工具下载:https://github.com/RedisInsight/RedisDesktopManager/releases/tag/0.9.3

bash
$ docker run -v /data/redis/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data -d --name myredis -p 6379:6379 redis redis-server /etc/redis/redis.conf

编辑 redis.conf,添加密码

bash
$ vim redis.conf
appendonly yes
requirepass xxx

制作自己的镜像

  1. 编写自己的应用

    创建 Java class,controller.CounterController

    java
    package com.example.javademo.controller;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class CounterController {
      @Autowired(required = false)
      StringRedisTemplate redisTemplate;
      @GetMapping
      public String count() {
        Long increment = redisTemplate.opsForValue().increment("count-people");
        return "有 [" + increment + "] 人访问了这个页面";
      }
    }

    编辑 application.properties

    properties
    spring.data.redis.host=xxx
    spring.data.redis.password=xxx
  2. 将应用打包成镜像

    以前的做法:

    1. SpringBoot 打包成可执行 jar
    2. 把 jar 包上传给服务器
    3. 服务器上运行 java -jar

    现在的做法:所有机器都安装 Docker,任何应用都是镜像,所有机器上都可以运行

    创建 Dockerfile 文件

    • java-8:java:openjdk-8-jre-alpine
    • java-17:openjdk:17-jdk-alpine
    dockerfile
    FROM openjdk:17-jdk-alpine
    WORKDIR /home
    COPY target/*.jar /home
    ENTRYPOINT java -jar *.jar

    打包成镜像

    bash
    $ docker build -t java-demo:v1.0 .
  3. 启动容器

    bash
    $ docker run -d -p 9003:8080 java-demo:v1.0 --name myjavademo

image-20240202102941417

之后访问 9003 端口打开网站即可

常备不懈,才能有备无患