Skip to content

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 页面

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

mini-镜像

  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 端口打开网站即可

常备不懈,才能有备无患