参考

https://yeasy.gitbook.io/docker_practice/image

Docker镜像

获取镜像

查询:

docker search redis
root@racknerd-720736:~# docker search redis
NAME                                DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
redis                               Redis is an open source key-value store that…   12043     [OK]       
redislabs/redisearch                Redis With the RedisSearch module pre-loaded…   56                   
redislabs/redisinsight              RedisInsight - The GUI for Redis                87                   
redislabs/rebloom                   A probablistic datatypes module for Redis       22                   [OK]
redislabs/redis                     Clustered in-memory database engine compatib…   36                   
redislabs/rejson                    RedisJSON - Enhanced JSON data type processi…   53                   
redis/redis-stack-server            redis-stack-server installs a Redis server w…   36                   
redis/redis-stack                   redis-stack installs a Redis server with add…   47                   
redislabs/redisgraph                A graph database module for Redis               26                   [OK]
redislabs/redismod                  An automated build of redismod - latest Redi…   35                   [OK]
redislabs/redistimeseries           A time series database module for Redis         12                   
redislabs/operator                                                                  7                    
redislabs/operator-internal         This repository contains pre-released versio…   1                    
redislabs/redis-py                                                                  5                    
redislabs/redis-webcli              A tiny Flask app to provide access to Redis …   3                    [OK]
redislabs/redisgears                An automated build of RedisGears                4                    
redislabs/memtier_benchmark         Docker image to run memtier_benchmark           0                    
redislabs/k8s-controller-internal                                                   0                    
redislabs/ng-redis-raft             Redis with redis raft module                    0                    
redislabs/k8s-controller                                                            2                    
redislabs/redisai                                                                   4                    
redislabs/olmtest                   Test artefact for OLM CSV                       0                    
bitnami/redis                       Bitnami Redis Docker Image                      252                  [OK]
redislabs/olm-bundle                                                                0                    
redislabs/redisml                   A Redis module that implements several machi…   3                    [OK]

拉取:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

比如:

docker pull redis
root@racknerd-720736:~# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
26c5c85e47da: Pull complete 
39f79586dcf2: Pull complete 
79c71d0520e5: Pull complete 
60e988668ca1: Pull complete 
873c3fc9fdc6: Pull complete 
50ce7f9bf183: Pull complete 
Digest: sha256:f50031a49f41e493087fb95f96fdb3523bb25dcf6a3f0b07c588ad3cdbe1d0aa
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

启动

docker run -it -p 6379:6379 redis
root@racknerd-720736:~# docker run -it -p 6379:6379 redis
1:C 29 Apr 2023 08:04:12.413 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 29 Apr 2023 08:04:12.413 # Redis version=7.0.11, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 29 Apr 2023 08:04:12.413 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 29 Apr 2023 08:04:12.415 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 7.0.11 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 1
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

1:M 29 Apr 2023 08:04:12.419 # Server initialized
1:M 29 Apr 2023 08:04:12.420 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 29 Apr 2023 08:04:12.421 * Ready to accept connections

需要改两个地方

  1. 改成后台运行 - 发现在配置中改的话无法启动,因此不做这个修改,这个可以放在启动参数中加一个 -d 即可
  2. bind 端口调整,让外网可访问
  3. protected-mode 模式改为关闭,否则外网无法访问

所以需要修改配置文件,但是该镜像中的启动默认是没有配置文件的,因此

  1. 搞一个配置文件放到 docker 容器中
  2. 启动时候指定配置文件

新容器软件包可能不好用,可以先更新仓库随后安装 vim (一般不会这样搞)

apt-get update
apt-get install vim

下载官方配置文件: 官方redis安装包

修改上面两处之后的文件:修改后配置

修改后的配置文件放在:/root/dockers/redis-data/redis.conf

再次启动

 docker run -p 6379:6379 -d -v /root/dockers/redis-data/redis.conf:/etc/redis.conf redis redis-server /etc/redis.conf
9cf8d046b821cef15f2c577f90c502371a483ea68d17f8480083907d26dc352a

可以通过命令查看:

docker ps

本地镜像

列出镜像:

docker image ls

删除镜像:

docker image rm im1 im2

tips: 可同时删除多个

Dockerfile

Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建

redis 为例,开始构建

找一个测试目录,新建一个名叫 Dockerfile 的文件

mkdir myredis
cd myredis/
touch Dockerfile

内容如下:

FROM redis
RUN apt-get update \
	&& apt-get install -y vim

FROM :基于哪个镜像做的修改,必填

RUN:执行后面跟的命令,一次相关操作放到同一个 RUN 命令下面

如:上面 apt-get update 和 apt-get install -y vim 中间通过 && 连接统一放到 RUN 后面,避免写两个 RUN

区分:完成一个功能的相关命令都放在一个 RUN 中完成

Tips:在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建。在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建。

构建

docker build -t redis:v2 .
root@racknerd-720736:~/dockers/myredis# docker build -t redis:v2 .
[+] Building 8.6s (6/6) FINISHED                                                                                                  
 => [internal] load .dockerignore                                                                                            0.1s
 => => transferring context: 2B                                                                                              0.0s
 => [internal] load build definition from Dockerfile                                                                         0.1s
 => => transferring dockerfile: 100B                                                                                         0.0s
 => [internal] load metadata for docker.io/library/redis:latest                                                              0.0s
 => [1/2] FROM docker.io/library/redis                                                                                       0.0s
 => [2/2] RUN apt-get update      && apt-get install -y vim                                                                  7.8s
 => exporting to image                                                                                                       0.7s
 => => exporting layers                                                                                                      0.7s
 => => writing image sha256:06d3856d2108f328140b40ddf039c67bf1c3b8e9f7968496d6d5e667f3deb056                                 0.0s 
 => => naming to docker.io/library/redis:v2

构建完成之后再去查看本地镜像结果:

image-20230429220540802

Docker Compose

Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig

定义 docker-compose.yml

version: '3'
services:
  
  redis:
    image: "redis:v2"

运行:

docker-compose up
[+] Running 2/2
 ✔ Network myredis_default    Created                                                                                        0.1s 
 ✔ Container myredis-redis-1  Created                                                                                        0.1s 
Attaching to myredis-redis-1
myredis-redis-1  | 1:C 29 Apr 2023 14:18:41.298 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
myredis-redis-1  | 1:C 29 Apr 2023 14:18:41.298 # Redis version=7.0.11, bits=64, commit=00000000, modified=0, pid=1, just started
myredis-redis-1  | 1:C 29 Apr 2023 14:18:41.298 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
myredis-redis-1  | 1:M 29 Apr 2023 14:18:41.300 * monotonic clock: POSIX clock_gettime
myredis-redis-1  | 1:M 29 Apr 2023 14:18:41.301 * Running mode=standalone, port=6379.
myredis-redis-1  | 1:M 29 Apr 2023 14:18:41.301 # Server initialized
myredis-redis-1  | 1:M 29 Apr 2023 14:18:41.301 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
myredis-redis-1  | 1:M 29 Apr 2023 14:18:41.302 * Ready to accept connections

但是这样的话,之前配置的就没有效果了,因此,需要优化一下上面 docker-compose.yml 的配置

version: '3'
services:

  redis:
    image: "redis:v2"
    container_name: "my_redis"
    ports:
      - "6379:6379"
    volumes:
      - /root/dockers/redis-data/redis.conf:/etc/redis.conf
    restart: always

启动时候同样加上 -d,以保证后台启动

docker-compose up -d

root@racknerd-720736:~/dockers/myredis# docker-compose up -d
[+] Running 1/1
 ✔ Container my_redis  Started

再看 docker ps

已经运行了

关闭

docker-compose down

查看日志

docker-compose logse <service名称>

其中 service名称指的是 docker-compose.yml 中的 services 下的节点名称,如上面的就是:redis

docker-compose logse redis

这样会打印所有的,一般用这个:

docker-compose logs redis -f -t --tail=30
等同于:
tail -30f xxx.log

其中 -t 指的是显示时间戳,如果日志本身已经打印了(比如Java应用),可以不加 -t

结语

不全,只是一些基础中的基础命令

目前没打算写这个的详细功能使用

仅仅是因为要部署轻量 CI 工具:drone

需要用到这个,现在再去尝试 drone

Bye ~